diff --git a/lib/l10n/arb/app_ar.arb b/lib/l10n/arb/app_ar.arb index 2545f78d..c7bbb642 100644 --- a/lib/l10n/arb/app_ar.arb +++ b/lib/l10n/arb/app_ar.arb @@ -1,4 +1,31 @@ { + "settingsPlaybackSubtitle": "Player, volume, AutoMix, and audio output", + "sectionPlayer": "Player", + "sectionVolumeAndTransitions": "Volume and transitions", + "sectionAudioOutput": "Audio output", + "usbBitPerfect": "Hi-res and bit-perfect audio", + "usbBitPerfectDescription": "Preserve source precision on compatible outputs. Choose direct USB or AAudio exclusive below; otherwise Android USB output requires Android 14 or later. Applies from the next track, without AutoMix or normalization. System volume may not control direct USB.", + "usbHardwareVolume": "DAC hardware volume", + "usbVolumeWarningTitle": "Check your listening volume", + "usbVolumeWarning": "Direct USB audio can be much louder than normal playback, and phone volume buttons may not control it. Lower your DAC or amplifier volume before starting. When supported, SpotiFLAC sets the DAC to at most −40 dB on connection; this does not guarantee a safe listening level on every amplifier or headphone.", + "usbVolumeAccept": "I understand", + "usbVolumeUnavailable": "Playback is paused because this DAC has no verified hardware volume control. Lower the DAC or amplifier volume, then enable fixed-volume output if needed and select the track again.", + "usbFixedVolume": "Allow fixed-volume USB output", + "usbFixedVolumeDescription": "For DACs without a volume control accessible to the app. Keep off for USB headsets without their own volume control. Applies from the next track.", + "usbFixedVolumeWarning": "The app cannot lower the volume on this output. Audio may start at full level, and the phone volume slider will not help. Only continue after lowering the volume on your DAC or external amplifier. Do not enable this for a headset without its own volume control.", + "dapExclusive": "DAP hi-res (AAudio exclusive)", + "dapExclusiveDescription": "Use Oboe/AAudio at the track's original rate and precision for FLAC/WAV PCM. Requires Android 8.1 or later and compatible hardware. Exclusive access is checked; unavailable formats use normal playback. DSD requires the direct USB driver. Applies from the next track.", + "dapExclusiveUnavailable": "AAudio exclusive access is unavailable for this track and current output. Using normal playback. For a USB DAC, try the direct USB driver.", + "usbDirect": "Direct USB driver", + "usbDirectDescription": "Use exclusive USB audio for FLAC/WAV, DSF/DFF and WavPack DSD, with Android USB permission. Native DSD requires a recognized compatible DAC. Other PCM formats use normal playback. Applies from the next track.", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "Enable only if your DAC explicitly supports DoP. Sends DSF/DFF and WavPack DSD inside a PCM carrier when native DSD is unavailable. An incompatible device may play noise; leave off for ordinary USB headsets.", + "usbDsdUnsupported": "This DSD format or connected DAC is not supported. Playback stopped.", + "usbPermissionDenied": "USB permission was not granted. Using normal playback.", + "usbBitPerfectPending": "Waiting for the next track and a compatible USB output.", + "usbBitPerfectNoDevice": "No USB DAC connected. Using normal audio output.", + "usbBitPerfectFallback": "This device or audio format does not support bit-perfect output. Using normal playback.", + "usbBitPerfectRouteChanged": "The USB audio route changed. Playback paused; select a track to reconnect.", "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Make it\nyour own.", "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", @@ -36,6 +63,32 @@ "description": "System volume control label in the Mornye player" }, "appearanceStyle": "App Style", + "appearanceAccentRed": "Red (default)", + "appearanceAccentOrange": "Orange", + "appearanceAccentGreen": "Green", + "appearanceAccentTeal": "Teal", + "appearanceAccentBlue": "Blue", + "appearanceAccentPurple": "Purple", + "appearanceAccentPink": "Pink", + "appearanceGlassClarity": "Glass clarity", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Tinted", + "appearanceGlassClear": "Clear", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Use system font", + "appearanceUseSystemFontSubtitle": "Use your device’s default typeface for app text.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Remove ReplayGain", + "trackRemoveReplayGainSuccess": "ReplayGain tags removed", + "trackRemoveReplayGainFailed": "Failed to remove ReplayGain tags", + "replayGainRemoving": "Removing ReplayGain...", + "replayGainRemoveConfirmMessage": "Remove track and album ReplayGain tags from {count} track(s)? Audio, artwork, and other metadata will be preserved.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Remove RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain removed from {success} of {total} tracks", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ٌReplyGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "مستودع الإضافات", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "وضع كلمات الأغنية", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% من ملفات {total}", "@libraryScanProgress": { "description": "Scan progress display", @@ -4910,6 +5009,61 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "Inspect the spectrum and active bit depth for signs of upsampling or padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Limited bandwidth", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No upsampling or padding detected", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Estimated cutoff", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Active / stored bits", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "A lower cutoff can come from mastering. It does not, by itself, prove upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Based on {seconds} seconds of audio. This analysis cannot certify the original master.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "The spectrum contains mirrored bands consistent with upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "A sharp roll-off near {cutoff} and the measured noise floor suggest a lower-rate source.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energy above {cutoff} is mostly steady in the analyzed segment and may be noise.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Up next", + "nowPlayingAudioOutput": "Audio Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Get Tickets", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Open Maps", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Lyrics language options", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Hide Pronunciation", + "nowPlayingShowPronunciation": "Show Pronunciation", + "nowPlayingHideTranslation": "Hide Translation", + "nowPlayingShowTranslation": "Show Translation", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copy track name", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6808,6 +7016,9 @@ "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", "autoMixOn": "AutoMix on", "autoMixOff": "AutoMix off", + "autoplayOn": "Autoplay on", + "autoplayOff": "Autoplay off", + "autoplayFromLibrary": "Autoplay from your Library", "profileTitle": "Profile", "profileSetUp": "Set up your profile", "profileEdit": "Edit name and photo", @@ -6818,6 +7029,9 @@ "profileRemovePhoto": "Remove photo", "profilePhotoError": "Choose a valid image smaller than 20 MB.", "profileSaveError": "Could not save your profile. Please try again.", + "artistUpcomingConcerts": "Upcoming Concerts", + "artistAllUpcomingConcerts": "All Upcoming Concerts", + "artistNoUpcomingConcerts": "No upcoming concerts.", "optionsEmbeddedCoverSizeOriginal": "Original resolution", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index 24bb4a4f..449f4cfb 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -1,4 +1,31 @@ { + "settingsPlaybackSubtitle": "Player, volume, AutoMix, and audio output", + "sectionPlayer": "Player", + "sectionVolumeAndTransitions": "Volume and transitions", + "sectionAudioOutput": "Audio-Output", + "usbBitPerfect": "Hi-res and bit-perfect audio", + "usbBitPerfectDescription": "Preserve source precision on compatible outputs. Choose direct USB or AAudio exclusive below; otherwise Android USB output requires Android 14 or later. Applies from the next track, without AutoMix or normalization. System volume may not control direct USB.", + "usbHardwareVolume": "DAC hardware volume", + "usbVolumeWarningTitle": "Check your listening volume", + "usbVolumeWarning": "Direct USB audio can be much louder than normal playback, and phone volume buttons may not control it. Lower your DAC or amplifier volume before starting. When supported, SpotiFLAC sets the DAC to at most −40 dB on connection; this does not guarantee a safe listening level on every amplifier or headphone.", + "usbVolumeAccept": "Verstanden", + "usbVolumeUnavailable": "Playback is paused because this DAC has no verified hardware volume control. Lower the DAC or amplifier volume, then enable fixed-volume output if needed and select the track again.", + "usbFixedVolume": "Allow fixed-volume USB output", + "usbFixedVolumeDescription": "For DACs without a volume control accessible to the app. Keep off for USB headsets without their own volume control. Applies from the next track.", + "usbFixedVolumeWarning": "The app cannot lower the volume on this output. Audio may start at full level, and the phone volume slider will not help. Only continue after lowering the volume on your DAC or external amplifier. Do not enable this for a headset without its own volume control.", + "dapExclusive": "DAP hi-res (AAudio exclusive)", + "dapExclusiveDescription": "Use Oboe/AAudio at the track's original rate and precision for FLAC/WAV PCM. Requires Android 8.1 or later and compatible hardware. Exclusive access is checked; unavailable formats use normal playback. DSD requires the direct USB driver. Applies from the next track.", + "dapExclusiveUnavailable": "AAudio exclusive access is unavailable for this track and current output. Using normal playback. For a USB DAC, try the direct USB driver.", + "usbDirect": "Direct USB driver", + "usbDirectDescription": "Use exclusive USB audio for FLAC/WAV, DSF/DFF and WavPack DSD, with Android USB permission. Native DSD requires a recognized compatible DAC. Other PCM formats use normal playback. Applies from the next track.", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "Enable only if your DAC explicitly supports DoP. Sends DSF/DFF and WavPack DSD inside a PCM carrier when native DSD is unavailable. An incompatible device may play noise; leave off for ordinary USB headsets.", + "usbDsdUnsupported": "This DSD format or connected DAC is not supported. Playback stopped.", + "usbPermissionDenied": "USB permission was not granted. Using normal playback.", + "usbBitPerfectPending": "Waiting for the next track and a compatible USB output.", + "usbBitPerfectNoDevice": "No USB DAC connected. Using normal audio output.", + "usbBitPerfectFallback": "This device or audio format does not support bit-perfect output. Using normal playback.", + "usbBitPerfectRouteChanged": "The USB audio route changed. Playback paused; select a track to reconnect.", "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Make it\nyour own.", "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", @@ -25,17 +52,43 @@ "upgradeIntroAppearanceBody": "Change themes in Settings → Appearance. In Mornye, scroll down for compact navigation; scroll up to expand it.", "upgradeIntroAutoMixBody": "Match tempo and beats between tracks. Enable it in Settings → Local Library → Playback. Off by default.", "upgradeIntroSettingsBody": "In Mornye, tap your profile on Home to open Settings and edit your name and photo.", - "upgradeIntroSkip": "Skip", - "upgradeIntroContinue": "Continue", + "upgradeIntroSkip": "Überspringen", + "upgradeIntroContinue": "Fortfahren", "upgradeIntroDone": "Start listening", - "upgradeIntroReplay": "What’s new in 5.0", + "upgradeIntroReplay": "Was ist in 5.0 neu", "cacheMotionArtwork": "Offline motion covers", "cacheMotionArtworkDesc": "Album videos saved with downloads. Removing them keeps your music files and static covers.", - "nowPlayingVolume": "Volume", + "nowPlayingVolume": "Lautstärke", "@nowPlayingVolume": { "description": "System volume control label in the Mornye player" }, - "appearanceStyle": "App Style", + "appearanceStyle": "App-Stil", + "appearanceAccentRed": "Rot (Standard)", + "appearanceAccentOrange": "Orange", + "appearanceAccentGreen": "Grün", + "appearanceAccentTeal": "Türkis", + "appearanceAccentBlue": "Blau", + "appearanceAccentPurple": "Lila", + "appearanceAccentPink": "Pink", + "appearanceGlassClarity": "Glastransparenz", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Eingefärbt", + "appearanceGlassClear": "klar", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Use system font", + "appearanceUseSystemFontSubtitle": "Use your device’s default typeface for app text.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -97,7 +150,7 @@ "@historyFilterSingles": { "description": "Filter chip - show singles only" }, - "libraryRecentlyAdded": "Recently Added", + "libraryRecentlyAdded": "Zuletzt hinzugefügt", "libraryDownloads": "Downloads", "libraryNoActiveDownloads": "No active downloads", "librarySearchHint": "Search your library", @@ -239,7 +292,7 @@ "@optionsReplayGainSubtitleOff": { "description": "Subtitle when ReplayGain is disabled" }, - "trackReplayGain": "Rescan ReplayGain", + "trackReplayGain": "ReplayGain neu scannen", "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "ReplayGain entfernen", + "trackRemoveReplayGainSuccess": "ReplayGain tags removed", + "trackRemoveReplayGainFailed": "Failed to remove ReplayGain tags", + "replayGainRemoving": "Removing ReplayGain...", + "replayGainRemoveConfirmMessage": "Remove track and album ReplayGain tags from {count} track(s)? Audio, artwork, and other metadata will be preserved.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Remove RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain removed from {success} of {total} tracks", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -264,7 +349,7 @@ } } }, - "replayGainBatchConfirmTitle": "Add ReplayGain", + "replayGainBatchConfirmTitle": "ReplayGain hinzufügen", "@replayGainBatchConfirmTitle": { "description": "Title of the batch ReplayGain confirmation dialog" }, @@ -306,7 +391,7 @@ "@optionsArtistTagModeJoined": { "description": "Artist tag mode option that joins multiple artists into one value" }, - "optionsArtistTagModeJoinedSubtitle": "Einen Künstler wert wie \"Artist A, Artist B\" für maximale Spieler-Kompatibilität schreiben.", + "optionsArtistTagModeJoinedSubtitle": "Einen Künstler wert wie \"Artist A, Artist B\" für maximale Player-Kompatibilität schreiben.", "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "Erweiterungs-Repo", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -848,7 +941,7 @@ } } }, - "collectionExportM3u": "Export as M3U8", + "collectionExportM3u": "Als M3U8 exportieren", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, @@ -868,11 +961,11 @@ "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, - "collectionExportM3uFailed": "Export failed", + "collectionExportM3uFailed": "Export fehlgeschlagen", "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, - "trackOpenOn": "Open on...", + "trackOpenOn": "Öffnen in…", "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, @@ -888,7 +981,7 @@ "@libraryReviewDuplicatesSubtitle": { "description": "Subtitle for the duplicate review settings row" }, - "duplicatesTitle": "Duplicates", + "duplicatesTitle": "Duplikate", "@duplicatesTitle": { "description": "Title of the duplicate review sheet" }, @@ -896,7 +989,7 @@ "@duplicatesEmpty": { "description": "Shown when the duplicate review sheet finds nothing" }, - "duplicatesKeepBest": "Keep best", + "duplicatesKeepBest": "Behalte das Beste", "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "Lyrics-Modus", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -1606,7 +1701,7 @@ "@trackOpenInSpotify": { "description": "Action - open track in Spotify app" }, - "trackTrackName": "Name des Titels", + "trackTrackName": "Titel Name", "@trackTrackName": { "description": "Metadata label - track title" }, @@ -1654,7 +1749,7 @@ "@trackReplayGainAlbumPeak": { "description": "Metadata label - ReplayGain album peak" }, - "libraryQualityLabelFileFormat": "File format", + "libraryQualityLabelFileFormat": "Datei Format", "@libraryQualityLabelFileFormat": { "description": "Library audio quality label mode that shows the detected file format" }, @@ -1782,7 +1877,7 @@ "@storeFilterDownload": { "description": "Repo filter - download providers" }, - "storeFilterUtility": "Utility", + "storeFilterUtility": "Hilfsmittel", "@storeFilterUtility": { "description": "Repo filter - utility extensions" }, @@ -2081,7 +2176,7 @@ "@downloadAutoConvertSubtitle": { "description": "Explanation of safe automatic post-download conversion" }, - "downloadAutoConvertFormat": "Output format", + "downloadAutoConvertFormat": "Ausgabeformat", "@downloadAutoConvertFormat": { "description": "Automatic conversion output format setting" }, @@ -2089,7 +2184,7 @@ "@downloadAutoConvertFormatSubtitle": { "description": "Automatic conversion format picker explanation" }, - "downloadAutoConvertBitrate": "Output quality", + "downloadAutoConvertBitrate": "Ausgabequalität", "@downloadAutoConvertBitrate": { "description": "Automatic conversion bitrate setting" }, @@ -2607,7 +2702,7 @@ "@librarySourceOffline": { "description": "Library source is temporarily disconnected" }, - "librarySourceDisabled": "Disabled", + "librarySourceDisabled": "Deaktiviert", "@librarySourceDisabled": { "description": "Library source has been disabled by the user" }, @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan pausiert", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% von {total} Dateien", "@libraryScanProgress": { "description": "Scan progress display", @@ -3298,7 +3397,7 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, - "trackReEnrichModeIsrc": "ISRC only", + "trackReEnrichModeIsrc": "Nur ISRC", "@trackReEnrichModeIsrc": { "description": "Batch metadata mode that only writes ISRC" }, @@ -3366,7 +3465,7 @@ "@trackReEnrichNoChanges": { "description": "Message when batch metadata preview has no proposed changes" }, - "trackReEnrichApplyChanges": "Apply changes", + "trackReEnrichApplyChanges": "Änderungen anwenden", "@trackReEnrichApplyChanges": { "description": "Confirmation button in the batch metadata review sheet" }, @@ -4055,7 +4154,7 @@ "@backupTitle": { "description": "App bar title for the backup and restore page" }, - "backupExportSectionTitle": "Create backup", + "backupExportSectionTitle": "Backup erstellen", "@backupExportSectionTitle": { "description": "Section title for the export/backup card" }, @@ -4095,7 +4194,7 @@ "@backupRestoreConfirmMessage": { "description": "Confirmation dialog message before restoring a backup" }, - "backupRestoreConfirmButton": "Restore", + "backupRestoreConfirmButton": "Wiederherstellen", "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, @@ -4119,7 +4218,7 @@ "@backupContentsTitle": { "description": "Header above the list summarizing what the backup contains" }, - "backupSettingsOnly": "Settings only", + "backupSettingsOnly": "Nur Einstellungen", "backupSelectHistory": "Download history", "backupSelectCollections": "Library collections", "backupSelectCollectionsDescription": "Liked tracks, wishlist, favorite artists, playlists and playlist covers.", @@ -4478,7 +4577,7 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for Musixmatch language input field" }, - "downloadMusixmatchLanguageHint": "e.g. en, de, ja", + "downloadMusixmatchLanguageHint": "z.B. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Placeholder for Musixmatch language input" }, @@ -4556,7 +4655,7 @@ "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, - "editMetadataAutoFillSource": "Metadata source", + "editMetadataAutoFillSource": "Metadatenquelle", "@editMetadataAutoFillSource": { "description": "Label for the metadata extension selector in online auto-fill" }, @@ -4564,7 +4663,7 @@ "@editMetadataAutoFillSourceAutomatic": { "description": "Automatic source option that follows configured metadata provider priority" }, - "editMetadataAutoFillFind": "Find metadata", + "editMetadataAutoFillFind": "Metadaten finden", "@editMetadataAutoFillFind": { "description": "Button label for finding an online metadata candidate" }, @@ -4738,11 +4837,11 @@ "@queueEmptyPlaylistsSubtitle": { "description": "Empty state subtitle for the playlists library view" }, - "libraryDefaultView": "Default view", + "libraryDefaultView": "Standardansicht", "@libraryDefaultView": { "description": "Setting title - which library view opens when switching to the Library tab" }, - "libraryDefaultViewLastUsed": "Last used", + "libraryDefaultViewLastUsed": "Zuletzt verwendet", "@libraryDefaultViewLastUsed": { "description": "Default view option - keep the last used library view" }, @@ -4846,7 +4945,7 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, - "audioAnalysisCutoffNotDetected": "Not detected", + "audioAnalysisCutoffNotDetected": "Nicht erkannt", "@audioAnalysisCutoffNotDetected": { "description": "Displayed when no reliable broadband spectral cutoff can be detected" }, @@ -4890,7 +4989,7 @@ "@hiResCheckReasonImaging": { "description": "Reason: spectral imaging from upsampling detected" }, - "hiResCheckMusicContent": "Musical content", + "hiResCheckMusicContent": "Musik-Inhalt", "@hiResCheckMusicContent": { "description": "Label for the highest frequency that still moves with the music" }, @@ -4910,11 +5009,66 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "Inspect the spectrum and active bit depth for signs of upsampling or padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Limited bandwidth", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No upsampling or padding detected", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Estimated cutoff", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Active / stored bits", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "A lower cutoff can come from mastering. It does not, by itself, prove upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Based on {seconds} seconds of audio. This analysis cannot certify the original master.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "The spectrum contains mirrored bands consistent with upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "A sharp roll-off near {cutoff} and the measured noise floor suggest a lower-rate source.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energy above {cutoff} is mostly steady in the analyzed segment and may be noise.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" }, - "hiResCheckRun": "Check", + "hiResCheckRun": "Überprüfen", "@hiResCheckRun": { "description": "Button that starts the Hi-Res authenticity check" }, @@ -4946,7 +5100,7 @@ "@hiResCheckCutoff": { "description": "Label for the highest frequency with real content" }, - "hiResCheckBitsInUse": "Bits in use", + "hiResCheckBitsInUse": "Verwendete Bits", "@hiResCheckBitsInUse": { "description": "Label for effective vs declared bit depth" }, @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "SpotiFLAC Mobile v{version} wird heruntergeladen", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -5406,15 +5573,15 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, - "queueDownloadNext": "Download next", + "queueDownloadNext": "Nächstes herunterladen", "@queueDownloadNext": { "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" }, - "queueMoveUp": "Move up", + "queueMoveUp": "Nach oben", "@queueMoveUp": { "description": "Queue item menu action - move the queued item one position earlier" }, - "queueMoveDown": "Move down", + "queueMoveDown": "Nach unten", "@queueMoveDown": { "description": "Queue item menu action - move the queued item one position later" }, @@ -5434,15 +5601,15 @@ "@editMetadataMusicBrainzNeedsIsrc": { "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" }, - "nowPlayingRepeatOff": "Repeat off", + "nowPlayingRepeatOff": "Wiederholen deaktivieren", "@nowPlayingRepeatOff": { "description": "Repeat toggle tooltip when repeat is disabled" }, - "nowPlayingRepeatAll": "Repeat all", + "nowPlayingRepeatAll": "Alle wiederholen", "@nowPlayingRepeatAll": { "description": "Repeat toggle tooltip when the whole queue repeats" }, - "nowPlayingRepeatOne": "Repeat one", + "nowPlayingRepeatOne": "1x wiederholen", "@nowPlayingRepeatOne": { "description": "Repeat toggle tooltip when the current track repeats" }, @@ -5770,7 +5937,7 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, - "trackAlbumType": "Release Type", + "trackAlbumType": "Veröffentlichungstyp", "@trackAlbumType": { "description": "Label for an album or release type metadata value" }, @@ -5778,7 +5945,7 @@ "@editMetadataFieldAlbumTypeHint": { "description": "Hint for the release type metadata field" }, - "editMetadataFieldExplicit": "Explicit", + "editMetadataFieldExplicit": "Anstößig", "@editMetadataFieldExplicit": { "description": "Label for the explicit content metadata field" }, @@ -5786,7 +5953,7 @@ "@editMetadataFieldExplicitHint": { "description": "Description for the explicit content metadata switch" }, - "metadataExplicitValue": "Explicit", + "metadataExplicitValue": "Anstößig", "@metadataExplicitValue": { "description": "Displayed value when a track is marked explicit" }, @@ -5818,7 +5985,7 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, - "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "libraryFilterMetadataMissingIsrc": "Fehlendes ISRC", "@libraryFilterMetadataMissingIsrc": { "description": "Filter option - items without any ISRC tag" }, @@ -6178,7 +6345,7 @@ "@storeCategoryDownload": { "description": "Store extension category - download" }, - "storeCategoryUtility": "Utility", + "storeCategoryUtility": "Hilfsmittel", "@storeCategoryUtility": { "description": "Store extension category - utility" }, @@ -6190,7 +6357,7 @@ "@storeCategoryIntegration": { "description": "Store extension category - integration" }, - "artistReleases": "Releases", + "artistReleases": "Veröffentlichungen", "@artistReleases": { "description": "Section header for all artist releases" }, @@ -6235,11 +6402,11 @@ "@shareSheetNoExtensions": { "description": "Empty state when no extensions can be searched for cross-service links" }, - "shareSheetNotFound": "Not found", + "shareSheetNotFound": "Nicht gefunden", "@shareSheetNotFound": { "description": "Cross-service share sheet row subtitle when a service has no match" }, - "shareSheetCopyLink": "Copy Link", + "shareSheetCopyLink": "Link kopieren", "@shareSheetCopyLink": { "description": "Tooltip for copying a cross-service link" }, @@ -6250,11 +6417,11 @@ "service": {} } }, - "libraryPlayback": "Playback", + "libraryPlayback": "Wiedergabe", "@libraryPlayback": { "description": "Section header for playback settings in library settings" }, - "libraryExternalPlayer": "External player", + "libraryExternalPlayer": "Externer Player", "@libraryExternalPlayer": { "description": "Setting option to use an external music player" }, @@ -6282,11 +6449,36 @@ "@nowPlayingNothingPlaying": { "description": "Empty state when no track is currently playing" }, - "nowPlayingMinimize": "Minimize", + "nowPlayingMinimize": "Minimieren", "@nowPlayingMinimize": { "description": "Tooltip for minimizing the now playing screen" }, - "nowPlayingUpNext": "Up next", + "nowPlayingUpNext": "Als Nächstes", + "nowPlayingAudioOutput": "Audio-Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Tickets holen", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Karte öffnen", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6294,7 +6486,7 @@ "@nowPlayingPreviousTrack": { "description": "Tooltip for the previous-track playback control" }, - "nowPlayingNextTrack": "Next track", + "nowPlayingNextTrack": "Nächster Titel", "@nowPlayingNextTrack": { "description": "Tooltip for the next-track playback control" }, @@ -6302,7 +6494,7 @@ "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" }, - "nowPlayingSleepTimer": "Sleep timer", + "nowPlayingSleepTimer": "Schlaf Timer", "@nowPlayingSleepTimer": { "description": "Menu item and sheet title for the playback sleep timer" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Lyrics language options", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Hide Pronunciation", + "nowPlayingShowPronunciation": "Show Pronunciation", + "nowPlayingHideTranslation": "Hide Translation", + "nowPlayingShowTranslation": "Show Translation", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6370,11 +6574,11 @@ } } }, - "nowPlayingShuffleOn": "Shuffle on", + "nowPlayingShuffleOn": "Shuffle an", "@nowPlayingShuffleOn": { "description": "Tooltip when shuffle mode is enabled" }, - "nowPlayingPlayInOrder": "Play in order", + "nowPlayingPlayInOrder": "In Reihenfolge abspielen", "@nowPlayingPlayInOrder": { "description": "Tooltip when shuffle mode is disabled" }, @@ -6512,7 +6716,7 @@ "@trackConvertOriginalQuality": { "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" }, - "trackConvertLosslessSuffix": "Lossless", + "trackConvertLosslessSuffix": "Verlustfrei", "@trackConvertLosslessSuffix": { "description": "Suffix used in converted lossless quality labels" }, @@ -6548,15 +6752,15 @@ "@updateSeeReleaseNotes": { "description": "Fallback changelog text when release notes cannot be parsed" }, - "unknownTitle": "Unknown title", + "unknownTitle": "Unbekannter Titel", "@unknownTitle": { "description": "Fallback track title when metadata is missing" }, - "trackPlayNext": "Play next", + "trackPlayNext": "Als Nächstes spielen", "@trackPlayNext": { "description": "Menu action to play a track as the next queue item" }, - "trackAddToQueue": "Add to queue", + "trackAddToQueue": "Zur Warteschlange hinzufügen", "@trackAddToQueue": { "description": "Menu action to add a track to the playback queue" }, @@ -6607,23 +6811,23 @@ "@releaseTypeSingle": { "description": "Badge label for single releases" }, - "trackCoverOnline": "Online cover", + "trackCoverOnline": "Online-Cover", "@trackCoverOnline": { "description": "Label shown when metadata autofill downloaded cover art from the internet" }, - "regionCountryUS": "United States", + "regionCountryUS": "Vereinigte Staaten", "@regionCountryUS": { "description": "Country name for SongLink region picker" }, - "regionCountryGB": "United Kingdom", + "regionCountryGB": "Vereinigtes Königreich", "@regionCountryGB": { "description": "Country name for SongLink region picker" }, - "regionCountryFR": "France", + "regionCountryFR": "Frankreich", "@regionCountryFR": { "description": "Country name for SongLink region picker" }, - "regionCountryDE": "Germany", + "regionCountryDE": "Deutschland", "@regionCountryDE": { "description": "Country name for SongLink region picker" }, @@ -6639,23 +6843,23 @@ "@regionCountryIN": { "description": "Country name for SongLink region picker" }, - "regionCountryID": "Indonesia", + "regionCountryID": "Indonesien", "@regionCountryID": { "description": "Country name for SongLink region picker" }, - "regionCountryBR": "Brazil", + "regionCountryBR": "Brasilien", "@regionCountryBR": { "description": "Country name for SongLink region picker" }, - "regionCountryMX": "Mexico", + "regionCountryMX": "Mexiko", "@regionCountryMX": { "description": "Country name for SongLink region picker" }, - "regionCountryAU": "Australia", + "regionCountryAU": "Australien", "@regionCountryAU": { "description": "Country name for SongLink region picker" }, - "regionCountryCA": "Canada", + "regionCountryCA": "Kanada", "@regionCountryCA": { "description": "Country name for SongLink region picker" }, @@ -6675,11 +6879,11 @@ "@extensionVerificationBrowserSubtitleInApp": { "description": "Subtitle when in-app browser is preferred for extension verification" }, - "extensionVerificationBrowserExternal": "External", + "extensionVerificationBrowserExternal": "Extern", "@extensionVerificationBrowserExternal": { "description": "Chip label for external browser verification mode" }, - "extensionVerificationBrowserInApp": "In-app", + "extensionVerificationBrowserInApp": "In-App", "@extensionVerificationBrowserInApp": { "description": "Chip label for in-app browser verification mode" }, @@ -6712,7 +6916,7 @@ "@extensionVerificationClose": { "description": "Button to dismiss the extension verification help dialog" }, - "extensionVerificationCopyLink": "Copy link", + "extensionVerificationCopyLink": "Link kopieren", "@extensionVerificationCopyLink": { "description": "Button to copy the extension verification URL" }, @@ -6720,7 +6924,7 @@ "@extensionVerificationLinkCopied": { "description": "Snackbar after copying the extension verification URL" }, - "extensionVerificationOpenBrowser": "Open browser", + "extensionVerificationOpenBrowser": "Browser öffnen", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" }, @@ -6761,11 +6965,15 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copy track name", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" }, - "trackOptionCopyArtist": "Copy artist", + "trackOptionCopyArtist": "Künstler kopieren", "@trackOptionCopyArtist": { "description": "Track menu action that copies the artist name" }, @@ -6773,7 +6981,7 @@ "@trackOptionCopyTrackAndArtist": { "description": "Track menu action that copies the track title and artist" }, - "metadataCopyValue": "Copy value", + "metadataCopyValue": "Wert kopieren", "@metadataCopyValue": { "description": "Metadata menu action that copies only the selected value" }, @@ -6781,8 +6989,8 @@ "@metadataCopyField": { "description": "Metadata menu action that copies the selected key and value" }, - "mornyeShowTabs": "Show tabs", - "mornyeSearch": "Search", + "mornyeShowTabs": "Tabs anzeigen", + "mornyeSearch": "Suche", "mornyeContinuePlaying": "Continue Playing", "metadataCopyAll": "Copy all metadata", "@metadataCopyAll": { @@ -6796,30 +7004,36 @@ "@optionsEmbeddedCoverSizeDescription": { "description": "Description shown in the embedded cover size picker" }, - "mornyeFavorite": "Favorite", - "mornyeGoToArtist": "Go to Artist", + "mornyeFavorite": "Favorit", + "mornyeGoToArtist": "Zum Künstler", "@mornyeFavorite": { "description": "Compact context menu action that adds a track to Loved" }, - "mornyeFavorited": "Favorited", + "mornyeFavorited": "Favorisiert", "@mornyeFavorited": { "description": "Selected state of the compact favorite action" }, "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", - "autoMixOn": "AutoMix on", - "autoMixOff": "AutoMix off", - "profileTitle": "Profile", + "autoMixOn": "AutoMix an", + "autoMixOff": "AutoMix aus", + "autoplayOn": "Autoplay an", + "autoplayOff": "Autoplay aus", + "autoplayFromLibrary": "Autoplay from your Library", + "profileTitle": "Profil", "profileSetUp": "Set up your profile", "profileEdit": "Edit name and photo", "backupIncludesProfile": "Includes your profile name and photo", "profileName": "Name", - "profileNameHint": "Your name", - "profileChangePhoto": "Choose photo", - "profileRemovePhoto": "Remove photo", + "profileNameHint": "Dein Name", + "profileChangePhoto": "Bild wählen", + "profileRemovePhoto": "Bild entfernen", "profilePhotoError": "Choose a valid image smaller than 20 MB.", "profileSaveError": "Could not save your profile. Please try again.", + "artistUpcomingConcerts": "Upcoming Concerts", + "artistAllUpcomingConcerts": "All Upcoming Concerts", + "artistNoUpcomingConcerts": "No upcoming concerts.", "optionsEmbeddedCoverSizeOriginal": "Original resolution", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" } -} +} \ No newline at end of file diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index c9dabd98..f2354596 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -1,47 +1,100 @@ { - "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", - "upgradeIntroThemeTitle": "Make it\nyour own.", - "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", - "upgradeIntroThemeMaterialBody": "The familiar layout, with Material controls and your accent color.", - "upgradeIntroThemeMornyeBody": "Glass navigation, a redesigned Library and an immersive player.", - "upgradeIntroRustTitle": "A new engine.\nBuilt with Rust.", - "upgradeIntroRustBody": "In 5.0, the app’s backend has moved from Go to Rust. It is the engine working behind the screens you use every day.", - "upgradeIntroRustEngineTitle": "Working behind the scenes", - "upgradeIntroRustEngineBody": "Rust handles downloads, audio metadata, library scanning and the extension runtime on Android and iOS.", - "upgradeIntroRustMemoryTitle": "More careful with memory", - "upgradeIntroRustMemoryBody": "Reused buffers and fewer copies reduce temporary allocations when processing artwork and extension data.", - "upgradeIntroRustKeepTitle": "Keep your music", - "upgradeIntroRustKeepBody": "No need to download your collection again. Your saved music and settings stay in place, with no new setup required.", - "upgradeIntroWelcomeBody": "A quick look at what has changed, and where to find it.", - "upgradeIntroMornyeBody": "A new look for your player, lyrics and navigation.", - "upgradeIntroLibrarySummary": "Browse your music by playlist, artist or album.", - "upgradeIntroRepoSummary": "Choose your music sources and providers through extensions.", - "upgradeIntroLibraryTitle": "Get to know\nyour Library.", - "upgradeIntroLibraryBody": "In Mornye, browse by category or find your albums in Recently Added.", - "upgradeIntroDownloadsBody": "Pause and retry from Downloads at the top right. Finished music moves to Recently Added.", - "upgradeIntroSearchBody": "Search saved music here. The separate Search tab looks through your extensions.", - "upgradeIntroPlayerTitle": "Set up\nyour player.", - "upgradeIntroPlayerBody": "You can change your theme and playback options at any time. Here is where to find them.", - "upgradeIntroAppearanceBody": "Change themes in Settings → Appearance. In Mornye, scroll down for compact navigation; scroll up to expand it.", - "upgradeIntroAutoMixBody": "Match tempo and beats between tracks. Enable it in Settings → Local Library → Playback. Off by default.", - "upgradeIntroSettingsBody": "In Mornye, tap your profile on Home to open Settings and edit your name and photo.", - "upgradeIntroSkip": "Skip", - "upgradeIntroContinue": "Continue", - "upgradeIntroDone": "Start listening", - "upgradeIntroReplay": "What’s new in 5.0", - "cacheMotionArtwork": "Offline motion covers", - "cacheMotionArtworkDesc": "Album videos saved with downloads. Removing them keeps your music files and static covers.", - "nowPlayingVolume": "Volume", + "settingsPlaybackSubtitle": "Reproductor, volumen, AutoMix y salida de audio", + "sectionPlayer": "Reproductor", + "sectionVolumeAndTransitions": "Volumen y transiciones", + "sectionAudioOutput": "Salida de audio", + "usbBitPerfect": "Audio de alta resolución y sin pérdida de bits", + "usbBitPerfectDescription": "Mantén la precisión de la fuente en salidas compatibles. Elige a continuación entre USB directo o AAudio exclusivo; de lo contrario, la salida USB de Android requiere Android 14 o una versión posterior. Se aplica a partir de la siguiente pista, sin AutoMix ni normalización. Es posible que el volumen del sistema no controle la salida USB directa.", + "usbHardwareVolume": "Volumen del hardware del DAC", + "usbVolumeWarningTitle": "Revisa el volumen de audio", + "usbVolumeWarning": "El audio directo por USB puede ser mucho más alto que la reproducción normal, y es posible que los botones de volumen del teléfono no lo controlen. Baja el volumen de tu DAC o amplificador antes de comenzar. Cuando sea compatible, SpotiFLAC configura el DAC a un máximo de −40 dB al conectarse; esto no garantiza un nivel de escucha seguro en todos los amplificadores o audífonos.", + "usbVolumeAccept": "Entiendo", + "usbVolumeUnavailable": "La reproducción está en pausa porque este DAC no cuenta con un control de volumen de hardware verificado. Baja el volumen del DAC o del amplificador; luego, si es necesario, activa la salida de volumen fijo y vuelve a seleccionar la pista.", + "usbFixedVolume": "Permitir salida USB de volumen fijo", + "usbFixedVolumeDescription": "Para DAC que no tengan un control de volumen accesible desde la app. Mantén esta opción desactivada para audífonos USB que no cuenten con su propio control de volumen. Se aplica a partir de la siguiente pista.", + "usbFixedVolumeWarning": "La aplicación no puede bajar el volumen en esta salida. Es posible que el audio comience al máximo y que el control deslizante de volumen del teléfono no sirva de nada. Solo continúe después de bajar el volumen en su DAC o amplificador externo. No active esta opción para audífonos que no cuenten con su propio control de volumen.", + "dapExclusive": "DAP de alta resolución (exclusivo de AAudio)", + "dapExclusiveDescription": "Utiliza Oboe/AAudio con la frecuencia y precisión originales de la pista para archivos FLAC/WAV PCM. Requiere Android 8.1 o posterior y hardware compatible. La opción de acceso exclusivo está marcada; los formatos no disponibles se reproducen de manera normal. El formato DSD requiere el controlador USB directo. Se aplica a partir de la siguiente pista.", + "dapExclusiveUnavailable": "El acceso exclusivo de AAudio no está disponible para esta pista y la salida actual. Se está utilizando la reproducción normal. Si usas un DAC USB, prueba con el controlador USB directo.", + "usbDirect": "Controlador USB directo", + "usbDirectDescription": "Utiliza audio USB exclusivo para FLAC/WAV, DSF/DFF y WavPack DSD, con permiso USB de Android. El DSD nativo requiere un DAC compatible y reconocido. Los demás formatos PCM se reproducen de manera normal. Se aplica a partir de la siguiente pista.", + "usbDsdOverPcm": "DSD sobre PCM (DoP)", + "usbDsdOverPcmDescription": "Actívalo solo si tu DAC es compatible explícitamente con DoP. Envía DSF/DFF y WavPack DSD dentro de una señal portadora PCM cuando no se dispone de DSD nativo. Un dispositivo incompatible podría reproducir ruido; déjalo desactivado para audífonos USB comunes.", + "usbDsdUnsupported": "No se admite este formato DSD ni este DAC conectado. Se detuvo la reproducción.", + "usbPermissionDenied": "No se concedió el permiso USB. Se está utilizando la reproducción normal.", + "usbBitPerfectPending": "A la espera de la próxima pista y de una salida USB compatible.", + "usbBitPerfectNoDevice": "No hay ningún DAC USB conectado. Se está utilizando la salida de audio normal.", + "usbBitPerfectFallback": "Este dispositivo o formato de audio no admite la salida con fidelidad bit a bit. Se está utilizando la reproducción normal.", + "usbBitPerfectRouteChanged": "La conexión de audio USB ha cambiado. La reproducción se ha detenido; selecciona una pista para volver a conectarte.", + "upgradeIntroWelcome": "Bienvenido a\nSpotiFLAC-Mobile 5.0", + "upgradeIntroThemeTitle": "Hazlo\na tu manera.", + "upgradeIntroThemeBody": "Elige un estilo. Tu elección se aplica de inmediato y puedes cambiarla más adelante en «Apariencia».", + "upgradeIntroThemeMaterialBody": "El diseño que ya conoces, con controles de Material y tu color de acento.", + "upgradeIntroThemeMornyeBody": "Navegación «Glass», una biblioteca rediseñada y un reproductor inmersivo.", + "upgradeIntroRustTitle": "Un nuevo motor.\nDesarrollado con Rust.", + "upgradeIntroRustBody": "En la versión 5.0, el backend de la app pasó de Go a Rust. Es el motor que funciona detrás de las pantallas que usas todos los días.", + "upgradeIntroRustEngineTitle": "Trabajando detrás de escena", + "upgradeIntroRustEngineBody": "Rust se encarga de las descargas, los metadatos de audio, el escaneo de bibliotecas y el tiempo de ejecución de las extensiones en Android e iOS.", + "upgradeIntroRustMemoryTitle": "Más cuidado con la memoria", + "upgradeIntroRustMemoryBody": "El uso de búferes reutilizados y un menor número de copias reduce las asignaciones temporales al procesar material gráfico y datos de extensión.", + "upgradeIntroRustKeepTitle": "Guarda tu música", + "upgradeIntroRustKeepBody": "No es necesario que vuelvas a descargar tu colección. Tu música guardada y tus configuraciones se mantienen tal como están, sin necesidad de volver a configurarlas.", + "upgradeIntroWelcomeBody": "Un vistazo rápido a lo que ha cambiado y dónde encontrarlo.", + "upgradeIntroMornyeBody": "Un nuevo diseño para tu reproductor, las letras de las canciones y la navegación.", + "upgradeIntroLibrarySummary": "Explora tu música por lista de reproducción, artista o álbum.", + "upgradeIntroRepoSummary": "Elige tus fuentes y proveedores de música mediante extensiones.", + "upgradeIntroLibraryTitle": "Conoce\ntu biblioteca.", + "upgradeIntroLibraryBody": "En Mornye, navega por categoría o busca tus álbumes en «Agregados recientemente».", + "upgradeIntroDownloadsBody": "Haz una pausa y vuelve a intentarlo desde la sección «Descargas», en la esquina superior derecha. La música que ya se ha reproducido se mueve a «Agregados recientemente».", + "upgradeIntroSearchBody": "Busca aquí la música guardada. La pestaña «Buscar», que se encuentra por separado, revisa tus extensiones.", + "upgradeIntroPlayerTitle": "Configura\ntu reproductor.", + "upgradeIntroPlayerBody": "Puedes cambiar el tema y las opciones de reproducción en cualquier momento. Aquí te indicamos dónde encontrarlas.", + "upgradeIntroAppearanceBody": "Cambia los temas en Configuración → Apariencia. En Mornye, desplázate hacia abajo para ver la navegación compacta; desplázate hacia arriba para expandirla.", + "upgradeIntroAutoMixBody": "Sincroniza el tempo y los compases entre las canciones. Actívalo en Configuración → Biblioteca local → Reproducción. Desactivado por defecto.", + "upgradeIntroSettingsBody": "En Mornye, toca tu perfil en la pantalla de inicio para abrir Configuración y editar tu nombre y tu foto.", + "upgradeIntroSkip": "Saltar", + "upgradeIntroContinue": "Continuar", + "upgradeIntroDone": "Empieza a escuchar", + "upgradeIntroReplay": "Novedades de la versión 5.0", + "cacheMotionArtwork": "Cubiertas de movimiento sin conexión", + "cacheMotionArtworkDesc": "Los videos de los álbumes se guardan junto con las descargas. Al eliminarlos, se conservan tus archivos de música y las portadas estáticas.", + "nowPlayingVolume": "Volúmen", "@nowPlayingVolume": { "description": "System volume control label in the Mornye player" }, - "appearanceStyle": "App Style", + "appearanceStyle": "Estilo de la aplicación", + "appearanceAccentRed": "Rojo (predeterminado)", + "appearanceAccentOrange": "Naranja", + "appearanceAccentGreen": "Verde", + "appearanceAccentTeal": "Verde azulado", + "appearanceAccentBlue": "Azul", + "appearanceAccentPurple": "Morado", + "appearanceAccentPink": "Rosado", + "appearanceGlassClarity": "Transparencia del vidrio", + "appearanceGlassClaritySubtitle": "Ajusta la transparencia en los menús y la navegación de Mornye. Se conserva el contraste del texto.", + "appearanceGlassTinted": "Tintado", + "appearanceGlassClear": "Borrar", + "appearanceGlassClarityBlurOff": "El vidrio se ve opaco en este dispositivo. Activa “{setting}” para ajustar la claridad.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "El vidrio se mantiene opaco mientras está activada la configuración de alto contraste del sistema.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Usar la fuente del sistema", + "appearanceUseSystemFontSubtitle": "Utiliza la fuente predeterminada de tu dispositivo para el texto de la aplicación.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, "@@locale": "es_ES", "@@last_modified": "2026-04-28", - "appName": "SpotiFLAC Mobile", + "appName": "SpotiFLAC", "@appName": { "description": "App name - DO NOT TRANSLATE" }, @@ -97,11 +150,11 @@ "@historyFilterSingles": { "description": "Filter chip - show singles only" }, - "libraryRecentlyAdded": "Recently Added", - "libraryDownloads": "Downloads", - "libraryNoActiveDownloads": "No active downloads", - "librarySearchHint": "Search your library", - "libraryEmptyCollection": "Your music will appear here", + "libraryRecentlyAdded": "Agregados recientemente", + "libraryDownloads": "Descargas", + "libraryNoActiveDownloads": "No hay descargas activas", + "librarySearchHint": "Busca en tu biblioteca", + "libraryEmptyCollection": "Tu música aparecerá aquí", "historySearchHint": "Buscar en historial...", "@historySearchHint": { "description": "Search bar placeholder in history" @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Eliminar ReplayGain", + "trackRemoveReplayGainSuccess": "Se han eliminado las etiquetas de ReplayGain", + "trackRemoveReplayGainFailed": "No se pudieron eliminar las etiquetas de ReplayGain", + "replayGainRemoving": "Eliminando ReplayGain...", + "replayGainRemoveConfirmMessage": "¿Deseas eliminar las etiquetas ReplayGain de las {count} pistas? Se conservarán el audio, las imágenes y otros metadatos.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Eliminar RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "Se ha eliminado ReplayGain de {success} de {total} pistas", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Solo el artista principal", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Escribe solo el primer artista, por ejemplo, «Artista A», en los campos «Artista» y «Artista del álbum» en todos los formatos, para que los reproductores muestren un solo artista.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "Repositorio de extensiones", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Mantener la pantalla encendida mientras se ven las letras de las canciones", + "lyricsKeepScreenOnSubtitle": "Evitar que la pantalla se apague mientras están abiertas las letras de las canciones, incluso cuando la reproducción está en pausa.", "lyricsMode": "Modo Letras", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -1638,19 +1733,19 @@ "@trackAudioQuality": { "description": "Metadata label - audio quality" }, - "trackReplayGainTrackGain": "ReplayGain Track Gain", + "trackReplayGainTrackGain": "ReplayGain - Ganancia de pista", "@trackReplayGainTrackGain": { "description": "Metadata label - ReplayGain track gain" }, - "trackReplayGainTrackPeak": "ReplayGain Track Peak", + "trackReplayGainTrackPeak": "ReplayGain: Pico de pista", "@trackReplayGainTrackPeak": { "description": "Metadata label - ReplayGain track peak" }, - "trackReplayGainAlbumGain": "ReplayGain Album Gain", + "trackReplayGainAlbumGain": "ReplayGain: Ganancia del álbum", "@trackReplayGainAlbumGain": { "description": "Metadata label - ReplayGain album gain" }, - "trackReplayGainAlbumPeak": "ReplayGain Album Peak", + "trackReplayGainAlbumPeak": "ReplayGain: Pico del álbum", "@trackReplayGainAlbumPeak": { "description": "Metadata label - ReplayGain album peak" }, @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% de {total} archivos", "@libraryScanProgress": { "description": "Scan progress display", @@ -3008,7 +3107,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", + "tutorialSettingsDesc": "Ajusta las descargas, la reproducción, el comportamiento de la biblioteca, la apariencia y el almacenamiento.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -3016,7 +3115,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", + "tutorialSettingsTip2": "Configurar la calidad, la concurrencia, los nombres de archivo y las preferencias de conversión", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -3024,7 +3123,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", + "tutorialReadyMessage": "Ya estás listo. Selecciona tus extensiones y, a continuación, busca o pega un enlace compatible.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3266,7 +3365,7 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichBatchSubtitle": "Choose an online or manual update, then review every change before writing", + "trackReEnrichBatchSubtitle": "Elige entre una actualización en línea o manual, y luego revisa cada cambio antes de escribir", "@trackReEnrichBatchSubtitle": { "description": "Subtitle for batch metadata update choices" }, @@ -3298,59 +3397,59 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, - "trackReEnrichModeIsrc": "ISRC only", + "trackReEnrichModeIsrc": "Solo ISRC", "@trackReEnrichModeIsrc": { "description": "Batch metadata mode that only writes ISRC" }, - "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "trackReEnrichModeIsrcSubtitle": "Busca y agrega el identificador de la grabación sin modificar las demás etiquetas", "@trackReEnrichModeIsrcSubtitle": { "description": "Explanation for the ISRC-only batch metadata mode" }, - "trackReEnrichModeMissing": "Fill missing tags", + "trackReEnrichModeMissing": "Completa las etiquetas que faltan", "@trackReEnrichModeMissing": { "description": "Batch metadata mode that fills only empty tags" }, - "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "trackReEnrichModeMissingSubtitle": "Conserva los valores existentes y llena solo los campos que estén vacíos", "@trackReEnrichModeMissingSubtitle": { "description": "Explanation for the fill-missing batch metadata mode" }, - "trackReEnrichModeReplace": "Update selected tags", + "trackReEnrichModeReplace": "Actualizar las etiquetas seleccionadas", "@trackReEnrichModeReplace": { "description": "Batch metadata mode that replaces selected tag groups" }, - "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "trackReEnrichModeReplaceSubtitle": "Elige qué valores existentes pueden ser reemplazados por metadatos en línea", "@trackReEnrichModeReplaceSubtitle": { "description": "Explanation for the selected-tag batch metadata mode" }, - "trackReEnrichModeManual": "Set common values", + "trackReEnrichModeManual": "Establecer valores comunes", "@trackReEnrichModeManual": { "description": "Batch metadata mode that applies shared values to every selected track" }, - "trackReEnrichModeManualSubtitle": "Apply the same values to every selected track", + "trackReEnrichModeManualSubtitle": "Aplica los mismos valores a todas las pistas seleccionadas", "@trackReEnrichModeManualSubtitle": { "description": "Explanation for the manual shared-value batch metadata mode" }, - "trackReEnrichManualFieldsTitle": "Values to apply", + "trackReEnrichManualFieldsTitle": "Valores que se deben aplicar", "@trackReEnrichManualFieldsTitle": { "description": "Heading above manual batch metadata inputs" }, - "trackReEnrichManualHint": "Leave a field empty to keep its current value. Track titles, numbers, and ISRCs stay unchanged.", + "trackReEnrichManualHint": "Deja un campo en blanco para mantener su valor actual. Los títulos de las pistas, los números y los códigos ISRC no se modifican.", "@trackReEnrichManualHint": { "description": "Safety explanation for manual batch metadata inputs" }, - "trackReEnrichFieldsTitle": "Tags to update", + "trackReEnrichFieldsTitle": "Etiquetas para actualizar", "@trackReEnrichFieldsTitle": { "description": "Heading above batch re-enrich field checkboxes" }, - "trackReEnrichReview": "Review changes", + "trackReEnrichReview": "Revisar cambios", "@trackReEnrichReview": { "description": "Button that searches metadata and opens the batch change review" }, - "trackReEnrichReviewTitle": "Review metadata changes", + "trackReEnrichReviewTitle": "Revisar los cambios en los metadatos", "@trackReEnrichReviewTitle": { "description": "Title of the batch metadata review sheet" }, - "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "trackReEnrichReviewSubtitle": "{changeCount} cambios propuestos en {trackCount} pistas", "@trackReEnrichReviewSubtitle": { "description": "Summary shown above proposed batch metadata changes", "placeholders": { @@ -3362,15 +3461,15 @@ } } }, - "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "trackReEnrichNoChanges": "No se encontraron cambios en los metadatos de las pistas seleccionadas.", "@trackReEnrichNoChanges": { "description": "Message when batch metadata preview has no proposed changes" }, - "trackReEnrichApplyChanges": "Apply changes", + "trackReEnrichApplyChanges": "Aplicar cambios", "@trackReEnrichApplyChanges": { "description": "Confirmation button in the batch metadata review sheet" }, - "trackReEnrichRefreshOnline": "Refresh from online", + "trackReEnrichRefreshOnline": "Actualizar desde Internet", "@trackReEnrichRefreshOnline": { "description": "Proposed value when lyrics will be refreshed during re-enrich" }, @@ -3408,15 +3507,15 @@ "@trackReEnrichSearching": { "description": "Snackbar while searching metadata from internet for local items" }, - "trackReEnrichPreparing": "Preparing metadata changes...", + "trackReEnrichPreparing": "Preparando los cambios en los metadatos...", "@trackReEnrichPreparing": { "description": "Progress message while preparing manual batch metadata changes" }, "trackReEnrichSuccess": "Información ", - "trackReEnrichMetadataSaved": "Metadata saved", - "trackReEnrichLyricsUpdated": "Lyrics updated", - "trackReEnrichLyricsPreserved": "No new lyrics found; existing lyrics kept", - "trackReEnrichLyricsDisabled": "Lyrics not updated: lyric downloading is disabled in Settings", + "trackReEnrichMetadataSaved": "Metadatos guardados", + "trackReEnrichLyricsUpdated": "Letra actualizada", + "trackReEnrichLyricsPreserved": "No se encontraron nuevas letras; se mantuvieron las letras existentes", + "trackReEnrichLyricsDisabled": "Las letras no se actualizan: la descarga de letras está desactivada en Configuración", "@trackReEnrichSuccess": { "description": "Snackbar after successful re-enrichment" }, @@ -4007,7 +4106,7 @@ "@lyricsProviderAppleMusicDesc": { "description": "Description for Apple Music provider" }, - "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, direct API)", + "lyricsProviderQqMusicDesc": "QQ Music (ideal para canciones chinas, API directa)", "@lyricsProviderQqMusicDesc": { "description": "Description for QQ Music provider" }, @@ -4119,14 +4218,14 @@ "@backupContentsTitle": { "description": "Header above the list summarizing what the backup contains" }, - "backupSettingsOnly": "Settings only", - "backupSelectHistory": "Download history", - "backupSelectCollections": "Library collections", - "backupSelectCollectionsDescription": "Liked tracks, wishlist, favorite artists, playlists and playlist covers.", - "backupSelectExtensions": "Extensions and their settings", - "backupSelectedExportDescription": "Save the selected categories to a backup file. Audio files are not included.", - "backupSelectAtLeastOne": "Select at least one category to create a backup.", - "backupSelectedRestoreMessage": "Only the categories listed below will be restored. Categories not included in this backup will stay unchanged. Restoring can replace existing data and cannot be undone.", + "backupSettingsOnly": "Solo configuraciones", + "backupSelectHistory": "Historial de descargas", + "backupSelectCollections": "Colecciones de la biblioteca", + "backupSelectCollectionsDescription": "Canciones que te gustaron, lista de deseos, artistas favoritos, listas de reproducción y portadas de listas de reproducción.", + "backupSelectExtensions": "Extensiones y su configuración", + "backupSelectedExportDescription": "Guarda las categorías seleccionadas en un archivo de respaldo. No se incluyen los archivos de audio.", + "backupSelectAtLeastOne": "Selecciona al menos una categoría para crear una copia de seguridad.", + "backupSelectedRestoreMessage": "Solo se restaurarán las categorías que se enumeran a continuación. Las categorías que no estén incluidas en esta copia de seguridad permanecerán sin cambios. La restauración puede reemplazar los datos existentes y no se puede deshacer.", "backupContentsSettings": "Configuración de la aplicación", "@backupContentsSettings": { "description": "Backup contents row label for settings" @@ -4290,10 +4389,10 @@ "@downloadLocationSubtitle": { "description": "Subtitle shown in the download location picker sheet" }, - "storageAutomaticFolder": "Automatic folder", - "storageAutomaticDownloadFolder": "Uses Download/SpotiFLAC when writable, otherwise app storage", - "storageSafRecommended": "Choose folder (Recommended)", - "storageDownloadFolderHint": "In the Android folder picker, open Download and select SpotiFLAC. If it does not exist, create it using New folder, then tap Use this folder to grant access.", + "storageAutomaticFolder": "Carpeta automática", + "storageAutomaticDownloadFolder": "Utiliza «Descargar/SpotiFLAC» si es un dispositivo grabable; de lo contrario, utiliza el almacenamiento de la aplicación", + "storageSafRecommended": "Selecciona una carpeta (recomendado)", + "storageDownloadFolderHint": "En el selector de carpetas de Android, abre la carpeta «Descargas» y selecciona «SpotiFLAC». Si no existe, créala con la opción «Nueva carpeta» y, a continuación, toca «Usar esta carpeta» para otorgar acceso.", "storageModeAppFolder": "Carpeta de la App (Recomendado)", "@storageModeAppFolder": { "description": "Storage mode option - app-managed folder" @@ -4374,7 +4473,7 @@ "@downloadNetworkCompatibilityMode": { "description": "Setting for legacy TLS/network handling" }, - "downloadNetworkCompatibilityModeEnabled": "Allowing legacy HTTP endpoints; TLS verification remains enabled", + "downloadNetworkCompatibilityModeEnabled": "Se permiten los puntos finales HTTP heredados; la verificación de TLS sigue habilitada", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is on" }, @@ -4725,7 +4824,7 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, - "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "queuePlaylistCount": "{count, plural, =1{1 lista de reproducción} other {{count} listas de reproducción}}", "@queuePlaylistCount": { "description": "Playlist count label with plural support", "placeholders": { @@ -4830,27 +4929,27 @@ "@audioAnalysisLufs": { "description": "Integrated loudness metric label" }, - "audioAnalysisTruePeak": "True Peak", + "audioAnalysisTruePeak": "Pico real", "@audioAnalysisTruePeak": { "description": "True peak metric label" }, - "audioAnalysisClipping": "Clipping", + "audioAnalysisClipping": "Recorte", "@audioAnalysisClipping": { "description": "Clipping metric label" }, - "audioAnalysisNoClipping": "No clipping", + "audioAnalysisNoClipping": "Sin recortes", "@audioAnalysisNoClipping": { "description": "Displayed when no clipped samples were detected" }, - "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "audioAnalysisSpectralCutoff": "Corte espectral", "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, - "audioAnalysisCutoffNotDetected": "Not detected", + "audioAnalysisCutoffNotDetected": "No se detectó", "@audioAnalysisCutoffNotDetected": { "description": "Displayed when no reliable broadband spectral cutoff can be detected" }, - "audioAnalysisChannelStats": "Per-channel Stats", + "audioAnalysisChannelStats": "Estadísticas por canal", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" }, @@ -4862,39 +4961,39 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "downloadRedownloadFakeHiRes": "Re-download fake Hi-Res", + "downloadRedownloadFakeHiRes": "Volver a descargar archivos falsos de alta resolución", "@downloadRedownloadFakeHiRes": { "description": "Setting title: automatically replace downloads that measure as fake Hi-Res" }, - "downloadRedownloadFakeHiResSubtitle": "Off by default. Check Hi-Res downloads and replace only when every audio sample is preserved. Keep the original if verification or processing fails", + "downloadRedownloadFakeHiResSubtitle": "Desactivado por defecto. Marca la opción «Descargas de alta resolución» y reemplaza solo cuando se conserven todas las muestras de audio. Conserva el original si falla la verificación o el procesamiento", "@downloadRedownloadFakeHiResSubtitle": { "description": "Setting subtitle for the fake Hi-Res re-download toggle" }, - "hiResCheckVerdictFakeCertain": "Fake Hi-Res", + "hiResCheckVerdictFakeCertain": "Falsa alta resolución", "@hiResCheckVerdictFakeCertain": { "description": "Verdict: an exact fingerprint (padded bits or upsampling pattern) proves the file is not real Hi-Res" }, - "hiResCheckVerdictFakeSuspect": "Possibly a filtered master", + "hiResCheckVerdictFakeSuspect": "Posiblemente una pista maestra filtrada", "@hiResCheckVerdictFakeSuspect": { "description": "Verdict: fails the cutoff test but may be a genuine master low-pass filtered in mastering" }, - "hiResCheckReasonSampleHold": "Every sample is repeated: upsampled by duplication", + "hiResCheckReasonSampleHold": "Cada muestra se repite: se aumenta su resolución mediante duplicación", "@hiResCheckReasonSampleHold": { "description": "Reason: sample-and-hold upsampling detected" }, - "hiResCheckReasonInterpolation": "In-between samples are linearly interpolated", + "hiResCheckReasonInterpolation": "Las muestras intermedias se interpolan linealmente", "@hiResCheckReasonInterpolation": { "description": "Reason: linear-interpolation upsampling detected" }, - "hiResCheckReasonImaging": "Content above 22 kHz mirrors the audible band", + "hiResCheckReasonImaging": "El contenido por encima de los 22 kHz refleja la banda audible", "@hiResCheckReasonImaging": { "description": "Reason: spectral imaging from upsampling detected" }, - "hiResCheckMusicContent": "Musical content", + "hiResCheckMusicContent": "Contenido musical", "@hiResCheckMusicContent": { "description": "Label for the highest frequency that still moves with the music" }, - "hiResCheckUltrasonicNoise": "Above {cutoff} only steady noise (typical of DSD or analog tape transfers): a {rate} file would hold all the music", + "hiResCheckUltrasonicNoise": "Por encima de {cutoff} solo se escucha ruido constante (típico del DSD o de las transferencias de cinta analógica): un archivo de {rate} contendría toda la música", "@hiResCheckUltrasonicNoise": { "description": "Shown when the ultrasonic content of a Hi-Res file is noise rather than music", "placeholders": { @@ -4906,55 +5005,110 @@ } } }, - "hiResCheckTitle": "Hi-Res Authenticity", + "hiResCheckTitle": "Autenticidad en alta resolución", "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, - "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", + "hiResCheckSummary": "Revisa el espectro y la profundidad de bits activa para detectar indicios de sobremuestreo o relleno.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Ancho de banda limitado", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No se detectó ningún remuestreo ni relleno", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Puntuación de corte estimada", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Bits activos / almacenados", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "Un umbral más bajo puede deberse a la masterización. Esto, por sí solo, no prueba que se haya realizado un sobremuestreo.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Basado en {seconds} segundos de audio. Este análisis no puede certificar la grabación original.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "El espectro contiene bandas reflejadas que concuerdan con el sobremuestreo.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "Una caída brusca cerca de {cutoff} y el nivel de ruido de fondo medido sugieren que se trata de una fuente de baja frecuencia.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "La energía por encima de {cutoff} se mantiene prácticamente constante en el segmento analizado y podría tratarse de ruido.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckDescription": "Detecta archivos falsos de alta resolución que han sido remuestreados o a los que se les han agregado bits", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" }, - "hiResCheckRun": "Check", + "hiResCheckRun": "Verificar", "@hiResCheckRun": { "description": "Button that starts the Hi-Res authenticity check" }, - "hiResCheckChecking": "Checking Hi-Res authenticity...", + "hiResCheckChecking": "Verificando la autenticidad de la alta resolución...", "@hiResCheckChecking": { "description": "Loading text while the Hi-Res check runs" }, - "hiResCheckVerdictFake": "Likely fake Hi-Res", + "hiResCheckVerdictFake": "Probablemente sea una imagen falsa en alta resolución", "@hiResCheckVerdictFake": { "description": "Verdict: the file claims Hi-Res but does not measure as it" }, - "hiResCheckVerdictGenuine": "Measures as genuine Hi-Res", + "hiResCheckVerdictGenuine": "Se reproduce con auténtica alta resolución", "@hiResCheckVerdictGenuine": { "description": "Verdict: no upsampling or padded bit depth found" }, - "hiResCheckVerdictStandard": "Standard definition, nothing to flag", + "hiResCheckVerdictStandard": "Definición estándar, nada que destacar", "@hiResCheckVerdictStandard": { "description": "Verdict: neither sample rate nor bit depth claims Hi-Res" }, - "hiResCheckVerdictInconclusive": "Inconclusive: the analyzed segment is too quiet or short", + "hiResCheckVerdictInconclusive": "No concluyente: el segmento analizado es demasiado silencioso o demasiado corto", "@hiResCheckVerdictInconclusive": { "description": "Verdict: analysis could not reach a reliable conclusion" }, - "hiResCheckUnsupported": "Only FLAC and WAV files can be checked", + "hiResCheckUnsupported": "Solo se pueden revisar archivos FLAC y WAV", "@hiResCheckUnsupported": { "description": "Shown when the file format cannot be decoded by the Hi-Res check" }, - "hiResCheckCutoff": "Content cutoff", + "hiResCheckCutoff": "Corte de contenido", "@hiResCheckCutoff": { "description": "Label for the highest frequency with real content" }, - "hiResCheckBitsInUse": "Bits in use", + "hiResCheckBitsInUse": "Bits en uso", "@hiResCheckBitsInUse": { "description": "Label for effective vs declared bit depth" }, - "hiResCheckDisclaimer": "The spectrum stops early, but nothing proves it was upsampled: it may be a genuine master low-pass filtered in mastering. It is not replaced automatically.", + "hiResCheckDisclaimer": "El espectro se corta antes de tiempo, pero no hay nada que demuestre que se haya aumentado la resolución: podría tratarse de una masterización genuina filtrada con un filtro de paso bajo durante la masterización. No se reemplaza automáticamente.", "@hiResCheckDisclaimer": { "description": "Caveat shown under a fake Hi-Res verdict" }, - "hiResCheckFailed": "Hi-Res check failed: {error}", + "hiResCheckFailed": "Fallo en la verificación de alta resolución: {error}", "@hiResCheckFailed": { "description": "Error shown when the Hi-Res check fails", "placeholders": { @@ -4963,7 +5117,7 @@ } } }, - "hiResCheckReasonRate": "Declares {sampleRate} but content stops at ~{cutoff}", + "hiResCheckReasonRate": "Indica {sampleRate}, pero el contenido se detiene en ~{cutoff}", "@hiResCheckReasonRate": { "description": "Reason for a fake verdict caused by upsampling", "placeholders": { @@ -4975,7 +5129,7 @@ } } }, - "hiResCheckReasonDepth": "Declares {declared}-bit but only {effective} bits carry data", + "hiResCheckReasonDepth": "Declara {declared} bits, pero solo los bits {effective} contienen datos", "@hiResCheckReasonDepth": { "description": "Reason for a fake verdict caused by padded bit depth", "placeholders": { @@ -4991,11 +5145,11 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsHomeFeedProvider": "Home Feed Provider", + "extensionsHomeFeedProvider": "Proveedor de noticias de inicio", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" }, - "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "extensionsHomeFeedDescription": "Elige qué extensión muestra el feed de inicio en la pantalla principal", "@extensionsHomeFeedDescription": { "description": "Extensions page - description for home feed provider picker" }, @@ -5011,11 +5165,11 @@ "@extensionsHomeFeedOff": { "description": "Extensions page - home feed provider option: off" }, - "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "extensionsHomeFeedOffSubtitle": "No mostrar el feed de inicio en la pantalla principal", "@extensionsHomeFeedOffSubtitle": { "description": "Extensions page - subtitle for off home feed option" }, - "extensionsHomeFeedUse": "Use {extensionName} home feed", + "extensionsHomeFeedUse": "Usa el feed de inicio de {extensionName}", "@extensionsHomeFeedUse": { "description": "Extensions page - subtitle for a specific extension home feed option", "placeholders": { @@ -5024,7 +5178,7 @@ } } }, - "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "extensionsNoHomeFeedExtensions": "No se permiten extensiones con la fuente de origen", "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, @@ -5032,7 +5186,7 @@ "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" }, - "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "cancelDownloadContent": "Esto cancelará la descarga activa de «{trackName}».", "@cancelDownloadContent": { "description": "Dialog body when confirming cancellation of an active download", "placeholders": { @@ -5049,19 +5203,19 @@ "@queueCancelledTitle": { "description": "Dialog title when opening a cancelled queue item" }, - "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "queueCancelledMessage": "Esta descarga se canceló. Inténtalo de nuevo o elimínala de la fila.", "@queueCancelledMessage": { "description": "Dialog body when opening a cancelled queue item" }, - "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "metadataSaveFailedFfmpeg": "No se pudieron guardar los metadatos mediante FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" }, - "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "metadataSaveFailedStorage": "No se pudieron volver a escribir los metadatos en el almacenamiento", "@metadataSaveFailedStorage": { "description": "Snackbar error when writing metadata file back to storage fails" }, - "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "snackbarFolderPickerFailed": "No se pudo abrir el selector de carpetas: {error}", "@snackbarFolderPickerFailed": { "description": "Snackbar shown when folder picker fails to open", "placeholders": { @@ -5070,7 +5224,7 @@ } } }, - "notifDownloadingTrack": "Downloading {trackName}", + "notifDownloadingTrack": "Descargando {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", "placeholders": { @@ -5092,7 +5246,7 @@ "@notifEmbeddingMetadata": { "description": "Notification body while embedding metadata into a downloaded track" }, - "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "notifAlreadyInLibraryCount": "Ya está en la biblioteca ({completed}/{total})", "@notifAlreadyInLibraryCount": { "description": "Notification title when track is already in library, with count", "placeholders": { @@ -5104,11 +5258,11 @@ } } }, - "notifAlreadyInLibrary": "Already in Library", + "notifAlreadyInLibrary": "Ya está en la biblioteca", "@notifAlreadyInLibrary": { "description": "Notification title when track is already in library" }, - "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "notifDownloadCompleteCount": "Descargas completas ({completed}/{total})", "@notifDownloadCompleteCount": { "description": "Notification title when download is complete, with count", "placeholders": { @@ -5124,7 +5278,7 @@ "@notifDownloadComplete": { "description": "Notification title when a single download is complete" }, - "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "notifDownloadsFinished": "Descargas finalizadas ({completed} finalizadas, {failed} fallidas)", "@notifDownloadsFinished": { "description": "Notification title when queue finishes with some failures", "placeholders": { @@ -5136,11 +5290,11 @@ } } }, - "notifVerificationRequiredTitle": "Verification required", + "notifVerificationRequiredTitle": "Se requiere verificación", "@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": "Abre la aplicación para completar la verificación y reanudar las descargas", "@notifVerificationRequiredBody": { "description": "Notification body prompting the user to return to the app to solve a verification challenge" }, @@ -5148,7 +5302,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 pista descargada con éxito} other{{count} pistas descargadas con éxito}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -5157,7 +5311,7 @@ } } }, - "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "notifDownloadsFinishedBody": "{completed, plural, =1{1 pista descargada} other{{completed} pistas descargadas}}, {failed, plural, =1{1 falló} other{{failed} fallaron}}", "@notifDownloadsFinishedBody": { "description": "Notification body when queue finishes with failures", "placeholders": { @@ -5173,7 +5327,7 @@ "@notifDownloadsCanceledTitle": { "description": "Notification title when downloads are canceled by the user" }, - "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "notifDownloadsCanceledBody": "{count, plural, =1{1 descarga cancelada por el usuario} other{{count} descargas canceladas por el usuario}}", "@notifDownloadsCanceledBody": { "description": "Notification body when downloads are canceled by the user", "placeholders": { @@ -5186,7 +5340,7 @@ "@notifScanningLibrary": { "description": "Notification title while scanning local library" }, - "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", + "notifLibraryScanProgressWithTotal": "{scanned}/{total} archivos • {percentage} %", "@notifLibraryScanProgressWithTotal": { "description": "Notification body for library scan progress when total is known", "placeholders": { @@ -5201,7 +5355,7 @@ } } }, - "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", + "notifLibraryScanProgressNoTotal": "{scanned} archivos escaneados • {percentage} %", "@notifLibraryScanProgressNoTotal": { "description": "Notification body for library scan progress when total is unknown", "placeholders": { @@ -5217,7 +5371,7 @@ "@notifLibraryScanComplete": { "description": "Notification title when library scan finishes" }, - "notifLibraryScanCompleteBody": "{count} tracks indexed", + "notifLibraryScanCompleteBody": "{count} pistas indexadas", "@notifLibraryScanCompleteBody": { "description": "Notification body for library scan complete - number of indexed tracks", "placeholders": { @@ -5226,7 +5380,7 @@ } } }, - "notifLibraryScanExcluded": "{count} excluded", + "notifLibraryScanExcluded": "{count} excluido", "@notifLibraryScanExcluded": { "description": "Library scan complete suffix - excluded track count", "placeholders": { @@ -5248,15 +5402,28 @@ "@notifLibraryScanFailed": { "description": "Notification title when library scan fails" }, - "notifLibraryScanCancelled": "Library scan cancelled", + "notifLibraryScanCancelled": "Escaneo de la biblioteca cancelado", "@notifLibraryScanCancelled": { "description": "Notification title when library scan is cancelled by the user" }, - "notifLibraryScanStopped": "Scan stopped before completion.", + "notifLibraryScanStopped": "El escaneo se detuvo antes de completarse.", "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, - "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "notifLibraryScanPaused": "Escaneo de la biblioteca en pausa", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "Se han escaneado {count} archivos. Ve a la sección “Reanudar en la biblioteca local” para continuar desde aquí.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifDownloadingUpdate": "Descargar SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", "placeholders": { @@ -5265,7 +5432,7 @@ } } }, - "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "notifUpdateProgress": "{received} / {total} MB • {percentage} %", "@notifUpdateProgress": { "description": "Notification body showing update download progress", "placeholders": { @@ -5284,7 +5451,7 @@ "@notifUpdateReady": { "description": "Notification title when app update download is complete" }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "notifUpdateReadyBody": "Se ha descargado SpotiFLAC Mobile v{version}. Toca para instalar.", "@notifUpdateReadyBody": { "description": "Notification body when app update is ready to install", "placeholders": { @@ -5293,11 +5460,11 @@ } } }, - "notifUpdateFailed": "Update Failed", + "notifUpdateFailed": "La actualización falló", "@notifUpdateFailed": { "description": "Notification title when app update download fails" }, - "notifUpdateFailedBody": "Could not download update. Try again later.", + "notifUpdateFailedBody": "No se pudo descargar la actualización. Inténtalo de nuevo más tarde.", "@notifUpdateFailedBody": { "description": "Notification body when app update download fails" }, @@ -5305,11 +5472,11 @@ "@searchTracks": { "description": "Search filter label - tracks" }, - "homeSearchHintDefault": "Paste supported URL or search...", + "homeSearchHintDefault": "Pega una URL válida o realiza una búsqueda...", "@homeSearchHintDefault": { "description": "Default placeholder for the main search field on Home" }, - "homeSearchHintProvider": "Search with {providerName}...", + "homeSearchHintProvider": "Buscar con {providerName}...", "@homeSearchHintProvider": { "description": "Placeholder for the main search field when a provider is selected", "placeholders": { @@ -5318,11 +5485,11 @@ } } }, - "homeImportCsvTooltip": "Import playlist (CSV, M3U)", + "homeImportCsvTooltip": "Importar lista de reproducción (CSV, M3U)", "@homeImportCsvTooltip": { "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, - "homeChangeSearchProviderTooltip": "Change search provider", + "homeChangeSearchProviderTooltip": "Cambiar el proveedor de búsqueda", "@homeChangeSearchProviderTooltip": { "description": "Tooltip for the Home search provider picker" }, @@ -5354,11 +5521,11 @@ "@optionsEmbedMetadataSubtitleOn": { "description": "Subtitle when metadata embedding is enabled" }, - "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "optionsEmbedMetadataSubtitleOff": "Desactivado (avanzado): omitir toda la incrustación de metadatos", "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "trackCoverNoEmbeddedArt": "No embedded album art found", + "trackCoverNoEmbeddedArt": "No se encontró ninguna carátula de álbum incorporada", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" }, @@ -5386,15 +5553,15 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, - "trackCoverResolution": "Cover resolution", + "trackCoverResolution": "Resolución de la portada", "@trackCoverResolution": { "description": "Label for selecting the embedded cover art resolution" }, - "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "trackCoverResolutionHint": "Establece el lado más largo al guardar. Al ampliar la imagen no se añaden detalles.", "@trackCoverResolutionHint": { "description": "Explanation below the embedded cover art resolution selector" }, - "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "trackCoverResizeFailed": "No se pudo ajustar el tamaño de la imagen de portada. Intenta con otro tamaño o con otra imagen.", "@trackCoverResizeFailed": { "description": "Error shown when resizing cover art before saving metadata fails" }, @@ -5406,47 +5573,47 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, - "queueDownloadNext": "Download next", + "queueDownloadNext": "Descargar siguiente", "@queueDownloadNext": { "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" }, - "queueMoveUp": "Move up", + "queueMoveUp": "Subir", "@queueMoveUp": { "description": "Queue item menu action - move the queued item one position earlier" }, - "queueMoveDown": "Move down", + "queueMoveDown": "Bajar", "@queueMoveDown": { "description": "Queue item menu action - move the queued item one position later" }, - "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "editMetadataMusicBrainzButton": "Obtener de MusicBrainz", "@editMetadataMusicBrainzButton": { "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" }, - "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "editMetadataMusicBrainzFilled": "Actualizado a partir de MusicBrainz", "@editMetadataMusicBrainzFilled": { "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" }, - "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "editMetadataMusicBrainzNothing": "No se encontró nada en MusicBrainz", "@editMetadataMusicBrainzNothing": { "description": "Snackbar when the MusicBrainz lookup returns no data" }, - "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "editMetadataMusicBrainzNeedsIsrc": "Requiere una etiqueta ISRC", "@editMetadataMusicBrainzNeedsIsrc": { "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" }, - "nowPlayingRepeatOff": "Repeat off", + "nowPlayingRepeatOff": "Repetir hasta que se apague", "@nowPlayingRepeatOff": { "description": "Repeat toggle tooltip when repeat is disabled" }, - "nowPlayingRepeatAll": "Repeat all", + "nowPlayingRepeatAll": "Repetir todo", "@nowPlayingRepeatAll": { "description": "Repeat toggle tooltip when the whole queue repeats" }, - "nowPlayingRepeatOne": "Repeat one", + "nowPlayingRepeatOne": "Repite uno", "@nowPlayingRepeatOne": { "description": "Repeat toggle tooltip when the current track repeats" }, - "queueNetworkFailedOffline": "{count} downloads failed while offline", + "queueNetworkFailedOffline": "{count} descargas fallaron mientras estaba sin conexión", "@queueNetworkFailedOffline": { "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", "placeholders": { @@ -5455,11 +5622,11 @@ } } }, - "queueDownloadedFileMissing": "Downloaded file missing", + "queueDownloadedFileMissing": "Falta el archivo descargado", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" }, - "queueCheckingDownloadedFile": "Checking downloaded file...", + "queueCheckingDownloadedFile": "Verificando el archivo descargado...", "@queueCheckingDownloadedFile": { "description": "Accessibility label while the app checks whether a just-completed download has appeared at its final path yet. Not about authentication or a download session." }, @@ -5467,11 +5634,11 @@ "@queueDownloadCompleted": { "description": "Accessibility label for completed download state in queue" }, - "queueRateLimitTitle": "Service rate limited", + "queueRateLimitTitle": "Tasa de servicio limitada", "@queueRateLimitTitle": { "description": "Title shown on a failed queue item when the download service rate limits requests" }, - "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "queueRateLimitMessage": "Es posible que esta pista aún esté disponible. Espera unos minutos, reduce el número de descargas simultáneas y vuelve a intentarlo.", "@queueRateLimitMessage": { "description": "Explanation shown on a failed queue item when the download service rate limits requests" }, @@ -5484,15 +5651,15 @@ } } }, - "logAutoScrollOn": "Auto-scroll ON", + "logAutoScrollOn": "Desplazamiento automático ACTIVADO", "@logAutoScrollOn": { "description": "Tooltip when auto-scroll is enabled on the log screen" }, - "logAutoScrollOff": "Auto-scroll OFF", + "logAutoScrollOff": "Desplazamiento automático DESACTIVADO", "@logAutoScrollOff": { "description": "Tooltip when auto-scroll is disabled on the log screen" }, - "logCopyLogs": "Copy logs", + "logCopyLogs": "Copiar registros", "@logCopyLogs": { "description": "Tooltip for copying logs" }, @@ -5500,59 +5667,59 @@ "@logClearSearch": { "description": "Tooltip for clearing the log search field" }, - "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "logIssueIspBlockingLabel": "SE HA DETECTADO UN BLOQUEO DEL PROVEEDOR DE SERVICIOS DE INTERNET", "@logIssueIspBlockingLabel": { "description": "Diagnostic badge label when ISP blocking is detected" }, - "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "logIssueIspBlockingDescription": "Es posible que tu proveedor de servicios de Internet esté bloqueando el acceso a los servicios de descarga", "@logIssueIspBlockingDescription": { "description": "Diagnostic badge description for ISP blocking" }, - "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "logIssueIspBlockingSuggestion": "Intenta usar una VPN o cambia el DNS a 1.1.1.1 u 8.8.8.8", "@logIssueIspBlockingSuggestion": { "description": "Diagnostic badge suggestion for ISP blocking" }, - "logIssueRateLimitedLabel": "RATE LIMITED", + "logIssueRateLimitedLabel": "LÍMITE DE TASA", "@logIssueRateLimitedLabel": { "description": "Diagnostic badge label when the service rate limits requests" }, - "logIssueRateLimitedDescription": "Too many requests to the service", + "logIssueRateLimitedDescription": "Demasiadas solicitudes al servicio", "@logIssueRateLimitedDescription": { "description": "Diagnostic badge description for rate limiting" }, - "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "logIssueRateLimitedSuggestion": "Espera unos minutos antes de volver a intentarlo", "@logIssueRateLimitedSuggestion": { "description": "Diagnostic badge suggestion for rate limiting" }, - "logIssueNetworkErrorLabel": "NETWORK ERROR", + "logIssueNetworkErrorLabel": "ERROR DE RED", "@logIssueNetworkErrorLabel": { "description": "Diagnostic badge label for generic network errors" }, - "logIssueNetworkErrorDescription": "Connection issues detected", + "logIssueNetworkErrorDescription": "Se han detectado problemas de conexión", "@logIssueNetworkErrorDescription": { "description": "Diagnostic badge description for generic network errors" }, - "logIssueNetworkErrorSuggestion": "Check your internet connection", + "logIssueNetworkErrorSuggestion": "Revisa tu conexión a Internet", "@logIssueNetworkErrorSuggestion": { "description": "Diagnostic badge suggestion for generic network errors" }, - "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "logIssueTrackNotFoundLabel": "NO SE ENCONTRÓ LA PISTA", "@logIssueTrackNotFoundLabel": { "description": "Diagnostic badge label when a track is unavailable" }, - "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "logIssueTrackNotFoundDescription": "Algunas canciones no se pudieron encontrar en los servicios de descarga", "@logIssueTrackNotFoundDescription": { "description": "Diagnostic badge description when a track is unavailable" }, - "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "logIssueTrackNotFoundSuggestion": "Es posible que la pista no esté disponible en calidad sin pérdida", "@logIssueTrackNotFoundSuggestion": { "description": "Diagnostic badge suggestion when a track is unavailable" }, - "clickableLookingUpArtist": "Looking up artist...", + "clickableLookingUpArtist": "Buscando al artista...", "@clickableLookingUpArtist": { "description": "Snackbar shown while clickable artist metadata is being resolved" }, - "clickableInformationUnavailable": "{type} information not available", + "clickableInformationUnavailable": "{type} información no disponible", "@clickableInformationUnavailable": { "description": "Snackbar shown when clickable metadata cannot open a destination", "placeholders": { @@ -5569,7 +5736,7 @@ "@extensionDetailsInformation": { "description": "Section title for extension metadata information" }, - "extensionUtilityFunctions": "Utility Functions", + "extensionUtilityFunctions": "Funciones de utilidad", "@extensionUtilityFunctions": { "description": "Capability label for utility-only extensions" }, @@ -5577,11 +5744,11 @@ "@actionDismiss": { "description": "Generic action - dismiss" }, - "setupChangeFolderTooltip": "Change folder", + "setupChangeFolderTooltip": "Cambiar de carpeta", "@setupChangeFolderTooltip": { "description": "Tooltip for editing the selected download folder" }, - "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "a11yOpenTrackByArtist": "Abrir la canción {trackName} de {artistName}", "@a11yOpenTrackByArtist": { "description": "Accessibility label for opening a track item", "placeholders": { @@ -5722,7 +5889,7 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, - "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "downloadDeduplicationWithQualityVariants": "Se omitirán los archivos existentes con la calidad seleccionada", "@downloadDeduplicationWithQualityVariants": { "description": "Deduplication subtitle when separate quality versions are allowed" }, @@ -5730,15 +5897,15 @@ "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, - "downloadQualityVariants": "Allow different quality versions", + "downloadQualityVariants": "Permitir versiones de diferente calidad", "@downloadQualityVariants": { "description": "Setting to retain multiple quality versions of the same track" }, - "downloadQualityVariantsDescription": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "downloadQualityVariantsDescription": "Conserva todas las versiones de calidad; agrega su calidad medida al nombre del archivo solo cuando el nombre ya esté en uso", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, - "trackOptionDownloadQualityVariant": "Download another quality", + "trackOptionDownloadQualityVariant": "Descargar otra calidad", "@trackOptionDownloadQualityVariant": { "description": "Track menu action to download another quality version" }, @@ -5770,31 +5937,31 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, - "trackAlbumType": "Release Type", + "trackAlbumType": "Tipo de comunicado", "@trackAlbumType": { "description": "Label for an album or release type metadata value" }, - "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "editMetadataFieldAlbumTypeHint": "Álbum, sencillo, EP, recopilatorio...", "@editMetadataFieldAlbumTypeHint": { "description": "Hint for the release type metadata field" }, - "editMetadataFieldExplicit": "Explicit", + "editMetadataFieldExplicit": "Explícito", "@editMetadataFieldExplicit": { "description": "Label for the explicit content metadata field" }, - "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "editMetadataFieldExplicitHint": "Marca esta pista como que contiene contenido explícito", "@editMetadataFieldExplicitHint": { "description": "Description for the explicit content metadata switch" }, - "metadataExplicitValue": "Explicit", + "metadataExplicitValue": "Explícito", "@metadataExplicitValue": { "description": "Displayed value when a track is marked explicit" }, - "editMetadataFieldUpc": "UPC / Barcode", + "editMetadataFieldUpc": "UPC / Código de barras", "@editMetadataFieldUpc": { "description": "Label for the release barcode metadata field" }, - "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "editMetadataFieldUpcHint": "UPC, EAN o GTIN numéricos", "@editMetadataFieldUpcHint": { "description": "Hint for the release barcode metadata field" }, @@ -5818,7 +5985,7 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, - "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "libraryFilterMetadataMissingIsrc": "Falta el código ISRC", "@libraryFilterMetadataMissingIsrc": { "description": "Filter option - items without any ISRC tag" }, @@ -5914,11 +6081,11 @@ } }, "queueDownloadStarting": "Comenzando...", - "queueCheckingDownloadSession": "Checking download session...", - "queueResolvingDownloadMetadata": "Resolving track metadata...", - "queueResolvingDownloadStream": "Preparing audio stream...", - "queueWaitingForVerification": "Waiting for verification...", - "queueResumingAfterVerification": "Resuming after verification...", + "queueCheckingDownloadSession": "Verificando la sesión de descarga...", + "queueResolvingDownloadMetadata": "Se están recuperando los metadatos de la pista...", + "queueResolvingDownloadStream": "Preparando la transmisión de audio...", + "queueWaitingForVerification": "Esperando la verificación...", + "queueResumingAfterVerification": "Continuando después de la verificación...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -6010,7 +6177,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "downloadNativeWorkerSubtitle": "Servicio en segundo plano de Android para descargas de extensiones", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -6194,11 +6361,11 @@ "@artistReleases": { "description": "Section header for all artist releases" }, - "editMetadataSelectNone": "None", + "editMetadataSelectNone": "Ninguno", "@editMetadataSelectNone": { "description": "Button to clear selected fields for auto-fill" }, - "queueRetryAllFailed": "Retry {count} failed", + "queueRetryAllFailed": "{count} intentos fallidos", "@queueRetryAllFailed": { "description": "Button to retry every failed download in the queue", "placeholders": { @@ -6207,54 +6374,54 @@ } } }, - "settingsSaveDownloadHistory": "Save download history", + "settingsSaveDownloadHistory": "Guardar historial de descargas", "@settingsSaveDownloadHistory": { "description": "Settings switch title for storing completed downloads in history" }, - "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "settingsSaveDownloadHistorySubtitle": "Mantener las descargas completadas en las vistas de historial y biblioteca", "@settingsSaveDownloadHistorySubtitle": { "description": "Settings switch subtitle for storing completed downloads in history" }, - "dialogDisableHistoryTitle": "Turn off download history?", + "dialogDisableHistoryTitle": "¿Desactivar el historial de descargas?", "@dialogDisableHistoryTitle": { "description": "Confirmation dialog title shown before disabling download history" }, - "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "dialogDisableHistoryMessage": "Se borrará el historial existente. Los archivos descargados no se eliminarán.", "@dialogDisableHistoryMessage": { "description": "Confirmation dialog message shown before disabling download history" }, - "dialogDisableAndClear": "Turn off and clear", + "dialogDisableAndClear": "Desactivar y borrar", "@dialogDisableAndClear": { "description": "Confirmation action to disable download history and clear existing entries" }, - "openInOtherServices": "Open in Other Services", + "openInOtherServices": "Abrir en otros servicios", "@openInOtherServices": { "description": "Title and tooltip for finding the current collection in other services" }, - "shareSheetNoExtensions": "No other compatible services", + "shareSheetNoExtensions": "No hay otros servicios compatibles", "@shareSheetNoExtensions": { "description": "Empty state when no extensions can be searched for cross-service links" }, - "shareSheetNotFound": "Not found", + "shareSheetNotFound": "No se encontró", "@shareSheetNotFound": { "description": "Cross-service share sheet row subtitle when a service has no match" }, - "shareSheetCopyLink": "Copy Link", + "shareSheetCopyLink": "Copiar enlace", "@shareSheetCopyLink": { "description": "Tooltip for copying a cross-service link" }, - "shareSheetLinkCopied": "{service} link copied", + "shareSheetLinkCopied": "{service} enlace copiado", "@shareSheetLinkCopied": { "description": "Snackbar after copying a cross-service link", "placeholders": { "service": {} } }, - "libraryPlayback": "Playback", + "libraryPlayback": "Reproducción", "@libraryPlayback": { "description": "Section header for playback settings in library settings" }, - "libraryExternalPlayer": "External player", + "libraryExternalPlayer": "Reproductor externo", "@libraryExternalPlayer": { "description": "Setting option to use an external music player" }, @@ -6262,51 +6429,76 @@ "@libraryExternalPlayerSubtitle": { "description": "Subtitle for external player option" }, - "libraryBuiltInPreviewPlayer": "Built-in preview player", + "libraryBuiltInPreviewPlayer": "Reproductor de vista previa integrado", "@libraryBuiltInPreviewPlayer": { "description": "Setting option to use the built-in preview player" }, - "libraryBuiltInPreviewPlayerSubtitle": "Quick local previews inside SpotiFLAC Mobile", + "libraryBuiltInPreviewPlayerSubtitle": "Vistas previas rápidas y locales dentro de SpotiFLAC Mobile", "@libraryBuiltInPreviewPlayerSubtitle": { "description": "Subtitle for built-in preview player option" }, - "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", + "libraryBuiltInPlayerInfo": "El reproductor integrado es una herramienta de vista previa que permite revisar rápidamente las canciones guardadas localmente. Usa un reproductor de música externo para escucharlas.", "@libraryBuiltInPlayerInfo": { "description": "Info note explaining the built-in player is for previews only" }, - "nowPlayingTitle": "Now Playing", + "nowPlayingTitle": "Ahora en pantalla", "@nowPlayingTitle": { "description": "Title for the now playing screen" }, - "nowPlayingNothingPlaying": "Nothing is playing", + "nowPlayingNothingPlaying": "No se está reproduciendo nada", "@nowPlayingNothingPlaying": { "description": "Empty state when no track is currently playing" }, - "nowPlayingMinimize": "Minimize", + "nowPlayingMinimize": "Minimizar", "@nowPlayingMinimize": { "description": "Tooltip for minimizing the now playing screen" }, - "nowPlayingUpNext": "Up next", + "nowPlayingUpNext": "A continuación", + "nowPlayingAudioOutput": "Salida de audio", + "nowPlayingWrittenBy": "Escrito por: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Letra: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Comprar boletos", + "concertSetList": "Lista de canciones del concierto", + "concertSetListButton": "Lista de canciones", + "concertAddToCalendar": "Agregar al calendario", + "concertOpenMaps": "Abrir mapas", + "concertDetailsUnavailable": "Por el momento no hay información disponible sobre el concierto.", + "concertCalendarUnavailable": "No se puede abrir el calendario.", + "nowPlayingAudioOutputUnavailable": "No se pueden abrir las configuraciones de salida de audio.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, - "nowPlayingPreviousTrack": "Previous track", + "nowPlayingPreviousTrack": "Pista anterior", "@nowPlayingPreviousTrack": { "description": "Tooltip for the previous-track playback control" }, - "nowPlayingNextTrack": "Next track", + "nowPlayingNextTrack": "Siguiente pista", "@nowPlayingNextTrack": { "description": "Tooltip for the next-track playback control" }, - "nowPlayingDetails": "Details", + "nowPlayingDetails": "Detalles", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" }, - "nowPlayingSleepTimer": "Sleep timer", + "nowPlayingSleepTimer": "Temporizador de apagado", "@nowPlayingSleepTimer": { "description": "Menu item and sheet title for the playback sleep timer" }, - "nowPlayingSleepTimerActive": "Ends at {time}", + "nowPlayingSleepTimerActive": "Termina a las {time}", "@nowPlayingSleepTimerActive": { "description": "Active sleep timer deadline shown in the player menu", "placeholders": { @@ -6315,7 +6507,7 @@ } } }, - "nowPlayingSleepTimerMinutes": "{minutes, plural, =1{1 minute} other{{minutes} minutes}}", + "nowPlayingSleepTimerMinutes": "{minutes, plural, =1{1 minuto} other{{minutes} minutos}}", "@nowPlayingSleepTimerMinutes": { "description": "Duration choice for the playback sleep timer", "placeholders": { @@ -6324,11 +6516,11 @@ } } }, - "nowPlayingSleepTimerOff": "Turn off sleep timer", + "nowPlayingSleepTimerOff": "Desactivar el temporizador de apagado automático", "@nowPlayingSleepTimerOff": { "description": "Action to cancel the active playback sleep timer" }, - "nowPlayingSleepTimerSet": "Sleep timer set for {duration}", + "nowPlayingSleepTimerSet": "Temporizador de apagado configurado para {duration}", "@nowPlayingSleepTimerSet": { "description": "Confirmation after setting the playback sleep timer", "placeholders": { @@ -6337,31 +6529,43 @@ } } }, - "nowPlayingSleepTimerCancelled": "Sleep timer turned off", + "nowPlayingSleepTimerCancelled": "El temporizador de apagado está desactivado", "@nowPlayingSleepTimerCancelled": { "description": "Confirmation after cancelling the playback sleep timer" }, - "nowPlayingOpenInExternalPlayer": "Open in external player", + "nowPlayingOpenInExternalPlayer": "Abrir en un reproductor externo", "@nowPlayingOpenInExternalPlayer": { "description": "Menu item to open the current track in an external player" }, - "nowPlayingTabPlayer": "Player", + "nowPlayingTabPlayer": "Reproductor", "@nowPlayingTabPlayer": { "description": "Tab label for the player view" }, - "nowPlayingTabLyrics": "Lyrics", + "nowPlayingTabLyrics": "Letra de la canción", "@nowPlayingTabLyrics": { "description": "Tab label for the lyrics view" }, - "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingNoLyrics": "Este archivo no contiene letras", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Opciones de idioma para las letras de las canciones", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Ocultar pronunciación", + "nowPlayingShowPronunciation": "Mostrar pronunciación", + "nowPlayingHideTranslation": "Ocultar traducción", + "nowPlayingShowTranslation": "Mostrar traducción", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, - "nowPlayingLibraryEmpty": "Your library is empty", + "nowPlayingLibraryEmpty": "Tu biblioteca está vacía", "@nowPlayingLibraryEmpty": { "description": "Snackbar when shuffle library is requested but library has no tracks" }, - "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", + "nowPlayingShuffleLibraryFailed": "No se pudo mezclar la biblioteca: {error}", "@nowPlayingShuffleLibraryFailed": { "description": "Snackbar when shuffling the library fails", "placeholders": { @@ -6370,31 +6574,31 @@ } } }, - "nowPlayingShuffleOn": "Shuffle on", + "nowPlayingShuffleOn": "Sigue adelante", "@nowPlayingShuffleOn": { "description": "Tooltip when shuffle mode is enabled" }, - "nowPlayingPlayInOrder": "Play in order", + "nowPlayingPlayInOrder": "Reproducir en orden", "@nowPlayingPlayInOrder": { "description": "Tooltip when shuffle mode is disabled" }, - "nowPlayingShuffleLibrary": "Shuffle library", + "nowPlayingShuffleLibrary": "Mezclar la biblioteca", "@nowPlayingShuffleLibrary": { "description": "Button label to shuffle and play the entire local library" }, - "nowPlayingQueueEmpty": "Queue is empty", + "nowPlayingQueueEmpty": "La fila está vacía", "@nowPlayingQueueEmpty": { "description": "Empty state when the playback queue has no items" }, - "nowPlayingNoMetadata": "No metadata available", + "nowPlayingNoMetadata": "No hay metadatos disponibles", "@nowPlayingNoMetadata": { "description": "Empty state when track metadata cannot be loaded" }, - "announcementUnableToOpenLink": "Unable to open link. Please try again.", + "announcementUnableToOpenLink": "No se pudo abrir el enlace. Inténtalo de nuevo.", "@announcementUnableToOpenLink": { "description": "Snackbar shown when an announcement CTA link cannot be opened" }, - "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", + "trackConvertLosslessOutputWithCap": "Salida sin pérdida con límite de {quality}", "@trackConvertLosslessOutputWithCap": { "description": "Hint shown when lossless conversion will cap bit depth or sample rate", "placeholders": { @@ -6403,7 +6607,7 @@ } } }, - "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", + "trackConvertConfirmMessageLosslessCapped": "¿Convertir de {sourceFormat} a {targetFormat} ({quality})?\n\nEl archivo de salida se mantendrá en un códec sin pérdida, pero la profundidad de bits y la frecuencia de muestreo se limitarán. El archivo original se eliminará después de la conversión.\n", "@trackConvertConfirmMessageLosslessCapped": { "description": "Confirmation dialog message for capped lossless conversion of a single file", "placeholders": { @@ -6418,7 +6622,7 @@ } } }, - "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", + "selectionBatchConvertConfirmMessageLosslessCapped": "¿Convertir {count} {count, plural, =1{pista} other{pistas}} a {format} ({quality})?\n\nEl archivo de salida se mantendrá en un códec sin pérdida, pero la profundidad de bits y la frecuencia de muestreo se limitarán. Los archivos originales se eliminarán después de la conversión.", "@selectionBatchConvertConfirmMessageLosslessCapped": { "description": "Confirmation dialog message for capped lossless batch conversion", "placeholders": { @@ -6463,19 +6667,19 @@ } } }, - "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", + "aboutPaxsenixSubtitle": "Servicio de letras de canciones para Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou y Genius", "@aboutPaxsenixSubtitle": { "description": "Subtitle for Paxsenix special thanks entry on the about page" }, - "snackbarPlayingNext": "Playing next", + "snackbarPlayingNext": "Próxima reproducción", "@snackbarPlayingNext": { "description": "Snackbar when a track is inserted as the next queue item" }, - "snackbarAddedToQueueGeneric": "Added to queue", + "snackbarAddedToQueueGeneric": "Agregado a la fila", "@snackbarAddedToQueueGeneric": { "description": "Snackbar when a track is added to the playback queue without naming it" }, - "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", + "selectionDeletePlaylistsCount": "Eliminar {count} {count, plural, =1{lista de reproducción} other{listas de reproducción}}", "@selectionDeletePlaylistsCount": { "description": "Button label for deleting multiple selected playlists", "placeholders": { @@ -6484,23 +6688,23 @@ } } }, - "actionShuffle": "Shuffle", + "actionShuffle": "Reproducción aleatoria", "@actionShuffle": { "description": "Tooltip for shuffle playback action" }, - "downloadPrimaryArtistOnlyOn": "Primary only: On", + "downloadPrimaryArtistOnlyOn": "Solo primaria: Activado", "@downloadPrimaryArtistOnlyOn": { "description": "Status label when primary-artist-only folder naming is enabled" }, - "downloadPrimaryArtistOnlyOff": "Primary only: Off", + "downloadPrimaryArtistOnlyOff": "Solo primaria: Desactivado", "@downloadPrimaryArtistOnlyOff": { "description": "Status label when primary-artist-only folder naming is disabled" }, - "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", + "downloadAlbumArtistMetadataPrimaryOnly": "Metadatos de «Álbum» y «Artista»: solo los principales", "@downloadAlbumArtistMetadataPrimaryOnly": { "description": "Status label when album-artist folder filtering uses primary artist only" }, - "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", + "downloadAlbumArtistMetadataFull": "Metadatos del álbum y del artista: Completos", "@downloadAlbumArtistMetadataFull": { "description": "Status label when album-artist folder filtering uses full metadata" }, @@ -6508,11 +6712,11 @@ "@trackConvertOriginal": { "description": "Label for keeping original bit depth or sample rate during conversion" }, - "trackConvertOriginalQuality": "Original quality", + "trackConvertOriginalQuality": "Calidad original", "@trackConvertOriginalQuality": { "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" }, - "trackConvertLosslessSuffix": "Lossless", + "trackConvertLosslessSuffix": "Sin pérdida de calidad", "@trackConvertLosslessSuffix": { "description": "Suffix used in converted lossless quality labels" }, @@ -6524,7 +6728,7 @@ "@trackConvertResampler": { "description": "Section label for lossless conversion resampler options" }, - "trackConvertDitherNone": "None", + "trackConvertDitherNone": "Ninguno", "@trackConvertDitherNone": { "description": "Lossless conversion dither option with no dithering applied" }, @@ -6532,7 +6736,7 @@ "@trackConvertDitherTriangular": { "description": "Lossless conversion triangular probability density function dither option" }, - "trackConvertDitherTriangularHp": "Triangular HP", + "trackConvertDitherTriangularHp": "HP triangular", "@trackConvertDitherTriangularHp": { "description": "Lossless conversion high-pass triangular dither option" }, @@ -6544,23 +6748,23 @@ "@trackConvertResamplerSoxr": { "description": "Lossless conversion SoX resampler option" }, - "updateSeeReleaseNotes": "See release notes for details.", + "updateSeeReleaseNotes": "Consulte las notas de la versión para obtener más detalles.", "@updateSeeReleaseNotes": { "description": "Fallback changelog text when release notes cannot be parsed" }, - "unknownTitle": "Unknown title", + "unknownTitle": "Título desconocido", "@unknownTitle": { "description": "Fallback track title when metadata is missing" }, - "trackPlayNext": "Play next", + "trackPlayNext": "Reproducir siguiente", "@trackPlayNext": { "description": "Menu action to play a track as the next queue item" }, - "trackAddToQueue": "Add to queue", + "trackAddToQueue": "Agregar a la fila", "@trackAddToQueue": { "description": "Menu action to add a track to the playback queue" }, - "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", + "snackbarExtensionInstalledEnable": "{extensionName} está instalada. Actívala en Configuración > Extensiones", "@snackbarExtensionInstalledEnable": { "description": "Snackbar after installing an extension from the repo tab", "placeholders": { @@ -6569,7 +6773,7 @@ } } }, - "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", + "snackbarExtensionUpdatedVersion": "{extensionName} se ha actualizado a la versión v{version}", "@snackbarExtensionUpdatedVersion": { "description": "Snackbar after updating an extension from the repo tab", "placeholders": { @@ -6581,7 +6785,7 @@ } } }, - "snackbarFailedToInstallNamed": "Failed to install {extensionName}", + "snackbarFailedToInstallNamed": "No se pudo instalar {extensionName}", "@snackbarFailedToInstallNamed": { "description": "Snackbar when extension install fails in the repo tab", "placeholders": { @@ -6590,7 +6794,7 @@ } } }, - "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", + "snackbarFailedToUpdateNamed": "No se pudo actualizar {extensionName}", "@snackbarFailedToUpdateNamed": { "description": "Snackbar when extension update fails in the repo tab", "placeholders": { @@ -6603,35 +6807,35 @@ "@releaseTypeEp": { "description": "Badge label for EP releases" }, - "releaseTypeSingle": "Single", + "releaseTypeSingle": "Sencillo", "@releaseTypeSingle": { "description": "Badge label for single releases" }, - "trackCoverOnline": "Online cover", + "trackCoverOnline": "Portada en línea", "@trackCoverOnline": { "description": "Label shown when metadata autofill downloaded cover art from the internet" }, - "regionCountryUS": "United States", + "regionCountryUS": "Estados Unidos", "@regionCountryUS": { "description": "Country name for SongLink region picker" }, - "regionCountryGB": "United Kingdom", + "regionCountryGB": "Reino Unido", "@regionCountryGB": { "description": "Country name for SongLink region picker" }, - "regionCountryFR": "France", + "regionCountryFR": "Francia", "@regionCountryFR": { "description": "Country name for SongLink region picker" }, - "regionCountryDE": "Germany", + "regionCountryDE": "Alemania", "@regionCountryDE": { "description": "Country name for SongLink region picker" }, - "regionCountryJP": "Japan", + "regionCountryJP": "Japón", "@regionCountryJP": { "description": "Country name for SongLink region picker" }, - "regionCountryKR": "South Korea", + "regionCountryKR": "Corea del Sur", "@regionCountryKR": { "description": "Country name for SongLink region picker" }, @@ -6643,11 +6847,11 @@ "@regionCountryID": { "description": "Country name for SongLink region picker" }, - "regionCountryBR": "Brazil", + "regionCountryBR": "Brasil", "@regionCountryBR": { "description": "Country name for SongLink region picker" }, - "regionCountryMX": "Mexico", + "regionCountryMX": "México", "@regionCountryMX": { "description": "Country name for SongLink region picker" }, @@ -6655,7 +6859,7 @@ "@regionCountryAU": { "description": "Country name for SongLink region picker" }, - "regionCountryCA": "Canada", + "regionCountryCA": "Canadá", "@regionCountryCA": { "description": "Country name for SongLink region picker" }, @@ -6663,27 +6867,27 @@ "@regionCountryXK": { "description": "Country name for SongLink region picker" }, - "extensionVerificationBrowserTitle": "Verification browser", + "extensionVerificationBrowserTitle": "Navegador de verificación", "@extensionVerificationBrowserTitle": { "description": "Settings option title for extension verification browser preference" }, - "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", + "extensionVerificationBrowserSubtitleExternal": "Abre primero los desafíos en el navegador predeterminado", "@extensionVerificationBrowserSubtitleExternal": { "description": "Subtitle when external browser is preferred for extension verification" }, - "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", + "extensionVerificationBrowserSubtitleInApp": "Abre primero los desafíos en el navegador integrado en la aplicación", "@extensionVerificationBrowserSubtitleInApp": { "description": "Subtitle when in-app browser is preferred for extension verification" }, - "extensionVerificationBrowserExternal": "External", + "extensionVerificationBrowserExternal": "Externo", "@extensionVerificationBrowserExternal": { "description": "Chip label for external browser verification mode" }, - "extensionVerificationBrowserInApp": "In-app", + "extensionVerificationBrowserInApp": "Dentro de la aplicación", "@extensionVerificationBrowserInApp": { "description": "Chip label for in-app browser verification mode" }, - "extensionVerificationUnavailable": "No verification page is available for {extension}. Retry the download to request a new challenge.", + "extensionVerificationUnavailable": "No hay ninguna página de verificación disponible para {extension}. Vuelve a intentar la descarga para solicitar un nuevo código de verificación.", "@extensionVerificationUnavailable": { "description": "Shown when the app cannot retrieve a pending verification challenge", "placeholders": { @@ -6692,43 +6896,43 @@ } } }, - "extensionVerificationHelpTitleManual": "Open verification manually", + "extensionVerificationHelpTitleManual": "Abrir la verificación manualmente", "@extensionVerificationHelpTitleManual": { "description": "Dialog title when automatic browser launch for verification fails" }, - "extensionVerificationHelpTitleWaiting": "Verification still waiting", + "extensionVerificationHelpTitleWaiting": "La verificación sigue pendiente", "@extensionVerificationHelpTitleWaiting": { "description": "Dialog title when verification is taking longer than expected" }, - "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", + "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile no pudo abrir el navegador automáticamente. Abre este enlace en tu navegador o cópialo manualmente.", "@extensionVerificationHelpMessageManual": { "description": "Dialog message when automatic browser launch for verification fails" }, - "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", + "extensionVerificationHelpMessageWaiting": "Si el navegador no se abrió, o si la verificación terminó pero no regresaste a SpotiFLAC Mobile, abre este enlace de nuevo o cópialo manualmente.", "@extensionVerificationHelpMessageWaiting": { "description": "Dialog message when verification may need manual browser help" }, - "extensionVerificationClose": "Close", + "extensionVerificationClose": "Cerrar", "@extensionVerificationClose": { "description": "Button to dismiss the extension verification help dialog" }, - "extensionVerificationCopyLink": "Copy link", + "extensionVerificationCopyLink": "Copiar enlace", "@extensionVerificationCopyLink": { "description": "Button to copy the extension verification URL" }, - "extensionVerificationLinkCopied": "Verification link copied", + "extensionVerificationLinkCopied": "Se copió el enlace de verificación", "@extensionVerificationLinkCopied": { "description": "Snackbar after copying the extension verification URL" }, - "extensionVerificationOpenBrowser": "Open browser", + "extensionVerificationOpenBrowser": "Abrir el navegador", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" }, - "settingsSearchHint": "Search settings", + "settingsSearchHint": "Configuración de búsqueda", "@settingsSearchHint": { "description": "Placeholder of the search field on the Settings tab" }, - "settingsSearchNoResults": "No settings match \"{query}\"", + "settingsSearchNoResults": "No hay configuraciones que coincidan con «{query}»", "@settingsSearchNoResults": { "description": "Shown when a Settings search returns nothing", "placeholders": { @@ -6737,88 +6941,98 @@ } } }, - "settingsGroupInterface": "Extensions & appearance", + "settingsGroupInterface": "Extensiones y apariencia", "@settingsGroupInterface": { "description": "Settings group covering look and feel" }, - "settingsGroupContent": "Content & metadata", + "settingsGroupContent": "Contenido y metadatos", "@settingsGroupContent": { "description": "Settings group covering the library, metadata and lyrics" }, - "settingsGroupDownloads": "Downloads & files", + "settingsGroupDownloads": "Descargas y archivos", "@settingsGroupDownloads": { "description": "Settings group covering download behaviour and storage" }, - "settingsGroupSystem": "System", + "settingsGroupSystem": "Sistema", "@settingsGroupSystem": { "description": "Settings group covering app-level data, cache and logs" }, - "settingsGroupHelp": "About & support", + "settingsGroupHelp": "Acerca de y soporte", "@settingsGroupHelp": { "description": "Settings group covering the about page and donations" }, - "libraryFilterMetadataMissingLyrics": "Missing lyrics", + "libraryFilterMetadataMissingLyrics": "Letra que falta", "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, - "trackOptionCopyTrackName": "Copy track name", + "libraryFilterMetadataMissingReplayGain": "Falta ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, + "trackOptionCopyTrackName": "Copiar el nombre de la pista", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" }, - "trackOptionCopyArtist": "Copy artist", + "trackOptionCopyArtist": "Artista de copias", "@trackOptionCopyArtist": { "description": "Track menu action that copies the artist name" }, - "trackOptionCopyTrackAndArtist": "Copy track and artist", + "trackOptionCopyTrackAndArtist": "Copiar canción y artista", "@trackOptionCopyTrackAndArtist": { "description": "Track menu action that copies the track title and artist" }, - "metadataCopyValue": "Copy value", + "metadataCopyValue": "Copiar valor", "@metadataCopyValue": { "description": "Metadata menu action that copies only the selected value" }, - "metadataCopyField": "Copy field and value", + "metadataCopyField": "Copiar campo y valor", "@metadataCopyField": { "description": "Metadata menu action that copies the selected key and value" }, - "mornyeShowTabs": "Show tabs", - "mornyeSearch": "Search", - "mornyeContinuePlaying": "Continue Playing", + "mornyeShowTabs": "Mostrar pestañas", + "mornyeSearch": "Buscar", + "mornyeContinuePlaying": "Seguir escuchando", "metadataCopyAll": "Copy all metadata", "@metadataCopyAll": { "description": "Metadata menu action that copies every visible key and value" }, - "optionsEmbeddedCoverSize": "Embedded Cover Size", + "optionsEmbeddedCoverSize": "Tamaño de la portada integrada", "@optionsEmbeddedCoverSize": { "description": "Metadata setting that limits downloaded artwork resolution before it is embedded" }, - "optionsEmbeddedCoverSizeDescription": "Downscale remotely downloaded cover art before embedding it. Images already within the limit are kept unchanged.", + "optionsEmbeddedCoverSizeDescription": "Reduce la resolución de las portadas descargadas de forma remota antes de insertarlas. Las imágenes que ya están dentro del límite se mantienen sin cambios.", "@optionsEmbeddedCoverSizeDescription": { "description": "Description shown in the embedded cover size picker" }, - "mornyeFavorite": "Favorite", - "mornyeGoToArtist": "Go to Artist", + "mornyeFavorite": "Favorito", + "mornyeGoToArtist": "Ir a Artista", "@mornyeFavorite": { "description": "Compact context menu action that adds a track to Loved" }, - "mornyeFavorited": "Favorited", + "mornyeFavorited": "Agregado a favoritos", "@mornyeFavorited": { "description": "Selected state of the compact favorite action" }, - "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", - "autoMixOn": "AutoMix on", - "autoMixOff": "AutoMix off", - "profileTitle": "Profile", - "profileSetUp": "Set up your profile", - "profileEdit": "Edit name and photo", - "backupIncludesProfile": "Includes your profile name and photo", - "profileName": "Name", - "profileNameHint": "Your name", - "profileChangePhoto": "Choose photo", - "profileRemovePhoto": "Remove photo", - "profilePhotoError": "Choose a valid image smaller than 20 MB.", - "profileSaveError": "Could not save your profile. Please try again.", - "optionsEmbeddedCoverSizeOriginal": "Original resolution", + "autoMixDescription": "Mezcla canciones con sincronización de ritmos y ajuste de tempo que conserva el tono. Utiliza fundido cruzado cuando no es posible sincronizar los ritmos.", + "autoMixOn": "AutoMix activado", + "autoMixOff": "AutoMix desactivado", + "autoplayOn": "Reproducción automática activada", + "autoplayOff": "Reproducción automática desactivada", + "autoplayFromLibrary": "Reproducción automática desde tu biblioteca", + "profileTitle": "Perfil", + "profileSetUp": "Configura tu perfil", + "profileEdit": "Editar nombre y foto", + "backupIncludesProfile": "Incluye tu nombre de perfil y tu foto", + "profileName": "Nombre", + "profileNameHint": "Tu nombre", + "profileChangePhoto": "Elige una foto", + "profileRemovePhoto": "Eliminar foto", + "profilePhotoError": "Elige una imagen válida que no supere los 20 MB.", + "profileSaveError": "No se pudo guardar tu perfil. Inténtalo de nuevo.", + "artistUpcomingConcerts": "Próximos conciertos", + "artistAllUpcomingConcerts": "Todos los próximos conciertos", + "artistNoUpcomingConcerts": "No hay conciertos programados.", + "optionsEmbeddedCoverSizeOriginal": "Resolución original", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" } diff --git a/lib/l10n/arb/app_fr.arb b/lib/l10n/arb/app_fr.arb index 77ad8cc5..236da3e3 100644 --- a/lib/l10n/arb/app_fr.arb +++ b/lib/l10n/arb/app_fr.arb @@ -1,41 +1,94 @@ { - "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", - "upgradeIntroThemeTitle": "Make it\nyour own.", - "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", - "upgradeIntroThemeMaterialBody": "The familiar layout, with Material controls and your accent color.", - "upgradeIntroThemeMornyeBody": "Glass navigation, a redesigned Library and an immersive player.", - "upgradeIntroRustTitle": "A new engine.\nBuilt with Rust.", - "upgradeIntroRustBody": "In 5.0, the app’s backend has moved from Go to Rust. It is the engine working behind the screens you use every day.", + "settingsPlaybackSubtitle": "Lecteur, volume, AutoMix et sortie audio", + "sectionPlayer": "Lecteur", + "sectionVolumeAndTransitions": "Volume et transitions", + "sectionAudioOutput": "Sortie audio", + "usbBitPerfect": "Audio haute résolution et sans perte", + "usbBitPerfectDescription": "Conservez la précision de la source sur les sorties compatibles. Choisissez ci-dessous « USB direct » ou « AAudio exclusif » ; sinon, la sortie USB Android nécessite Android 14 ou une version ultérieure. S'applique à partir du morceau suivant, sans AutoMix ni normalisation. Le volume système peut ne pas contrôler la sortie USB directe.", + "usbHardwareVolume": "Volume du matériel DAC", + "usbVolumeWarningTitle": "Vérifiez le volume de votre appareil audio", + "usbVolumeWarning": "Le son USB direct peut être beaucoup plus fort qu'une lecture normale, et les boutons de volume du téléphone peuvent ne pas permettre de le régler. Baissez le volume de votre DAC ou de votre amplificateur avant de commencer. Lorsque cette fonctionnalité est prise en charge, SpotiFLAC règle le DAC à −40 dB au maximum lors de la connexion ; cela ne garantit toutefois pas un niveau d'écoute sûr sur tous les amplificateurs ou casques.", + "usbVolumeAccept": "Je comprends", + "usbVolumeUnavailable": "La lecture est en pause car ce DAC ne dispose pas d'un contrôle du volume matériel vérifié. Baissez le volume du DAC ou de l'amplificateur, puis activez la sortie à volume fixe si nécessaire et sélectionnez à nouveau la piste.", + "usbFixedVolume": "Autoriser la sortie USB à volume fixe", + "usbFixedVolumeDescription": "Pour les DAC ne disposant pas d'un réglage du volume accessible depuis l'application. À laisser désactivé pour les casques USB ne disposant pas de leur propre réglage du volume. S'applique à partir du morceau suivant.", + "usbFixedVolumeWarning": "L'application ne peut pas réduire le volume sur cette sortie. Le son peut démarrer à plein volume, et le curseur de volume du téléphone ne servira à rien. Ne poursuivez l'opération qu'après avoir réduit le volume sur votre DAC ou votre amplificateur externe. N'activez pas cette fonction pour un casque ne disposant pas de son propre contrôle de volume.", + "dapExclusive": "DAP haute résolution (exclusivité AAudio)", + "dapExclusiveDescription": "Utilisez Oboe/AAudio à la fréquence et à la précision d'origine de la piste pour les fichiers FLAC/WAV PCM. Nécessite Android 8.1 ou une version ultérieure, ainsi qu'un matériel compatible. L'option « Accès exclusif » est cochée ; les formats non pris en charge sont lus en mode normal. Le format DSD nécessite le pilote USB direct. S'applique à partir de la piste suivante.", + "dapExclusiveUnavailable": "L'accès exclusif AAudio n'est pas disponible pour ce morceau et cette sortie. La lecture s'effectue en mode normal. Pour un DAC USB, essayez le pilote USB direct.", + "usbDirect": "Pilote USB direct", + "usbDirectDescription": "Utilisez la fonction audio USB exclusive pour les formats FLAC/WAV, DSF/DFF et WavPack DSD, avec l'autorisation USB Android. Le DSD natif nécessite un DAC compatible et reconnu. Les autres formats PCM sont lus normalement. Cette fonction s'applique à partir de la piste suivante.", + "usbDsdOverPcm": "DSD sur PCM (DoP)", + "usbDsdOverPcmDescription": "À activer uniquement si votre DAC prend explicitement en charge le DoP. Envoie des fichiers DSF/DFF et WavPack DSD dans une porteuse PCM lorsque le DSD natif n'est pas disponible. Un périphérique incompatible peut émettre du bruit ; laissez cette option désactivée pour les casques USB classiques.", + "usbDsdUnsupported": "Ce format DSD ou ce DAC connecté n'est pas pris en charge. La lecture s'est arrêtée.", + "usbPermissionDenied": "L'autorisation USB n'a pas été accordée. Lecture normale.", + "usbBitPerfectPending": "En attendant le prochain morceau et une sortie USB compatible.", + "usbBitPerfectNoDevice": "Aucun DAC USB n'est connecté. La sortie audio standard est utilisée.", + "usbBitPerfectFallback": "Cet appareil ou ce format audio ne prend pas en charge la sortie « bit-perfect ». Lecture normale.", + "usbBitPerfectRouteChanged": "La connexion audio USB a changé. La lecture est en pause ; sélectionnez un morceau pour rétablir la connexion.", + "upgradeIntroWelcome": "Bienvenue dans\nSpotiFLAC-Mobile 5.0", + "upgradeIntroThemeTitle": "Faites-en\nvotre propre version.", + "upgradeIntroThemeBody": "Choisissez un thème. Votre choix s'applique immédiatement, et vous pourrez le modifier ultérieurement dans la section « Apparence ».", + "upgradeIntroThemeMaterialBody": "Une mise en page familière, avec les commandes Material et votre couleur d'accent.", + "upgradeIntroThemeMornyeBody": "Navigation en verre, bibliothèque repensée et lecteur immersif.", + "upgradeIntroRustTitle": "Un nouveau moteur.\nDéveloppé avec Rust.", + "upgradeIntroRustBody": "Dans la version 5.0, le backend de l'application est passé de Go à Rust. Il s'agit du moteur qui fonctionne en arrière-plan des écrans que vous utilisez tous les jours.", "upgradeIntroRustEngineTitle": "Travaille en arrière-plan", - "upgradeIntroRustEngineBody": "Rust handles downloads, audio metadata, library scanning and the extension runtime on Android and iOS.", - "upgradeIntroRustMemoryTitle": "More careful with memory", - "upgradeIntroRustMemoryBody": "Reused buffers and fewer copies reduce temporary allocations when processing artwork and extension data.", - "upgradeIntroRustKeepTitle": "Keep your music", - "upgradeIntroRustKeepBody": "No need to download your collection again. Your saved music and settings stay in place, with no new setup required.", - "upgradeIntroWelcomeBody": "A quick look at what has changed, and where to find it.", - "upgradeIntroMornyeBody": "A new look for your player, lyrics and navigation.", - "upgradeIntroLibrarySummary": "Browse your music by playlist, artist or album.", - "upgradeIntroRepoSummary": "Choose your music sources and providers through extensions.", - "upgradeIntroLibraryTitle": "Get to know\nyour Library.", - "upgradeIntroLibraryBody": "In Mornye, browse by category or find your albums in Recently Added.", - "upgradeIntroDownloadsBody": "Pause and retry from Downloads at the top right. Finished music moves to Recently Added.", - "upgradeIntroSearchBody": "Search saved music here. The separate Search tab looks through your extensions.", - "upgradeIntroPlayerTitle": "Set up\nyour player.", - "upgradeIntroPlayerBody": "You can change your theme and playback options at any time. Here is where to find them.", - "upgradeIntroAppearanceBody": "Change themes in Settings → Appearance. In Mornye, scroll down for compact navigation; scroll up to expand it.", - "upgradeIntroAutoMixBody": "Match tempo and beats between tracks. Enable it in Settings → Local Library → Playback. Off by default.", - "upgradeIntroSettingsBody": "In Mornye, tap your profile on Home to open Settings and edit your name and photo.", - "upgradeIntroSkip": "Skip", - "upgradeIntroContinue": "Continue", - "upgradeIntroDone": "Start listening", - "upgradeIntroReplay": "What’s new in 5.0", - "cacheMotionArtwork": "Offline motion covers", - "cacheMotionArtworkDesc": "Album videos saved with downloads. Removing them keeps your music files and static covers.", + "upgradeIntroRustEngineBody": "Rust gère les téléchargements, les métadonnées audio, l'analyse des bibliothèques et l'exécution des extensions sur Android et iOS.", + "upgradeIntroRustMemoryTitle": "Faire plus attention à sa mémoire", + "upgradeIntroRustMemoryBody": "La réutilisation des tampons et la réduction du nombre de copies permettent de limiter les allocations temporaires lors du traitement des illustrations et des données d'extension.", + "upgradeIntroRustKeepTitle": "Conservez votre musique", + "upgradeIntroRustKeepBody": "Inutile de télécharger à nouveau votre bibliothèque. Votre musique et vos paramètres enregistrés sont conservés, aucune nouvelle configuration n'est nécessaire.", + "upgradeIntroWelcomeBody": "Un aperçu rapide des changements apportés et des endroits où les trouver.", + "upgradeIntroMornyeBody": "Un nouveau look pour votre lecteur, les paroles et la navigation.", + "upgradeIntroLibrarySummary": "Parcourez votre musique par playlist, artiste ou album.", + "upgradeIntroRepoSummary": "Choisissez vos sources musicales et vos fournisseurs grâce aux extensions.", + "upgradeIntroLibraryTitle": "Découvrez\nvotre bibliothèque.", + "upgradeIntroLibraryBody": "Sur Mornye, parcourez les albums par catégorie ou retrouvez vos albums dans la section « Ajouts récents ».", + "upgradeIntroDownloadsBody": "Mettez en pause, puis réessayez depuis la rubrique « Téléchargements » en haut à droite. Les morceaux terminés sont déplacés vers la rubrique « Ajoutés récemment ».", + "upgradeIntroSearchBody": "Recherchez ici la musique que vous avez enregistrée. L'onglet « Recherche » distinct passe en revue vos extensions.", + "upgradeIntroPlayerTitle": "Configurez\nvotre lecteur.", + "upgradeIntroPlayerBody": "Vous pouvez modifier votre thème et vos options de lecture à tout moment. Voici où les trouver.", + "upgradeIntroAppearanceBody": "Pour changer de thème, rendez-vous dans Paramètres → Apparence. Dans Mornye, faites défiler vers le bas pour afficher la navigation compacte ; faites défiler vers le haut pour l'agrandir.", + "upgradeIntroAutoMixBody": "Synchroniser le tempo et les temps entre les morceaux. Activez cette option dans Paramètres → Bibliothèque locale → Lecture. Désactivée par défaut.", + "upgradeIntroSettingsBody": "Dans Mornye, appuyez sur votre profil depuis la page d'accueil pour ouvrir les Paramètres et modifier votre nom et votre photo.", + "upgradeIntroSkip": "Passer", + "upgradeIntroContinue": "Continuer", + "upgradeIntroDone": "Commencez à écouter", + "upgradeIntroReplay": "Nouveautés de la version 5.0", + "cacheMotionArtwork": "Couverture de mouvement hors ligne", + "cacheMotionArtworkDesc": "Les clips vidéo des albums sont enregistrés avec les téléchargements. Si vous les supprimez, vos fichiers musicaux et vos pochettes d'album resteront intacts.", "nowPlayingVolume": "Volume", "@nowPlayingVolume": { "description": "System volume control label in the Mornye player" }, - "appearanceStyle": "App Style", + "appearanceStyle": "Style de l'application", + "appearanceAccentRed": "Rouge (par défaut)", + "appearanceAccentOrange": "Orange", + "appearanceAccentGreen": "Vert", + "appearanceAccentTeal": "Bleu sarcelle", + "appearanceAccentBlue": "Bleu", + "appearanceAccentPurple": "Violet", + "appearanceAccentPink": "Rose", + "appearanceGlassClarity": "Transparence du verre", + "appearanceGlassClaritySubtitle": "Régler la transparence des menus et de la navigation dans Mornye. Le contraste du texte est conservé.", + "appearanceGlassTinted": "Teinté", + "appearanceGlassClear": "Effacer", + "appearanceGlassClarityBlurOff": "Le verre est opaque sur cet appareil. Activez « {setting} » pour régler la transparence.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Le verre reste opaque lorsque le réglage « contraste élevé » du système est activé.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Utiliser la police système", + "appearanceUseSystemFontSubtitle": "Utilisez la police par défaut de votre appareil pour le texte de l'application.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -97,11 +150,11 @@ "@historyFilterSingles": { "description": "Filter chip - show singles only" }, - "libraryRecentlyAdded": "Recently Added", - "libraryDownloads": "Downloads", - "libraryNoActiveDownloads": "No active downloads", - "librarySearchHint": "Search your library", - "libraryEmptyCollection": "Your music will appear here", + "libraryRecentlyAdded": "Ajouts récents", + "libraryDownloads": "Téléchargements", + "libraryNoActiveDownloads": "Aucun téléchargement en cours", + "librarySearchHint": "Rechercher dans votre bibliothèque", + "libraryEmptyCollection": "Votre musique apparaîtra ici", "historySearchHint": "Historique de recherche...", "@historySearchHint": { "description": "Search bar placeholder in history" @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Supprimer ReplayGain", + "trackRemoveReplayGainSuccess": "Suppression des balises ReplayGain", + "trackRemoveReplayGainFailed": "Impossible de supprimer les balises ReplayGain", + "replayGainRemoving": "Suppression de ReplayGain...", + "replayGainRemoveConfirmMessage": "Souhaitez-vous supprimer les balises ReplayGain des {count} titres ? Les données audio, les pochettes et les autres métadonnées seront conservées.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Supprimer RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain supprimé de {success} sur {total} titres", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Artiste principal uniquement", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Dans tous les formats, indiquez uniquement le premier artiste (par exemple « Artiste A ») dans les champs « Artiste » et « Artiste de l'album », afin que les lecteurs n'affichent qu'un seul artiste.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "Référentiel d'extensions", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Garder l'écran allumé pendant l'affichage des paroles", + "lyricsKeepScreenOnSubtitle": "Empêcher la mise en veille de l'écran lorsque les paroles sont affichées, y compris lorsque la lecture est en pause.", "lyricsMode": "Mode Paroles", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -1638,19 +1733,19 @@ "@trackAudioQuality": { "description": "Metadata label - audio quality" }, - "trackReplayGainTrackGain": "ReplayGain Track Gain", + "trackReplayGainTrackGain": "ReplayGain - Gain par piste", "@trackReplayGainTrackGain": { "description": "Metadata label - ReplayGain track gain" }, - "trackReplayGainTrackPeak": "ReplayGain Track Peak", + "trackReplayGainTrackPeak": "ReplayGain – Pic de piste", "@trackReplayGainTrackPeak": { "description": "Metadata label - ReplayGain track peak" }, - "trackReplayGainAlbumGain": "ReplayGain Album Gain", + "trackReplayGainAlbumGain": "ReplayGain - Gain de l'album", "@trackReplayGainAlbumGain": { "description": "Metadata label - ReplayGain album gain" }, - "trackReplayGainAlbumPeak": "ReplayGain Album Peak", + "trackReplayGainAlbumPeak": "ReplayGain – Valeur maximale de l'album", "@trackReplayGainAlbumPeak": { "description": "Metadata label - ReplayGain album peak" }, @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Numérisation en pause", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress} % des {total} fichiers", "@libraryScanProgress": { "description": "Scan progress display", @@ -3413,10 +3512,10 @@ "description": "Progress message while preparing manual batch metadata changes" }, "trackReEnrichSuccess": "Métadonnées réenrichies avec succès", - "trackReEnrichMetadataSaved": "Metadata saved", - "trackReEnrichLyricsUpdated": "Lyrics updated", - "trackReEnrichLyricsPreserved": "No new lyrics found; existing lyrics kept", - "trackReEnrichLyricsDisabled": "Lyrics not updated: lyric downloading is disabled in Settings", + "trackReEnrichMetadataSaved": "Métadonnées enregistrées", + "trackReEnrichLyricsUpdated": "Paroles mises à jour", + "trackReEnrichLyricsPreserved": "Aucune nouvelle parole n'a été trouvée ; les paroles existantes ont été conservées", + "trackReEnrichLyricsDisabled": "Paroles non mises à jour : le téléchargement des paroles est désactivé dans les paramètres", "@trackReEnrichSuccess": { "description": "Snackbar after successful re-enrichment" }, @@ -4119,14 +4218,14 @@ "@backupContentsTitle": { "description": "Header above the list summarizing what the backup contains" }, - "backupSettingsOnly": "Settings only", - "backupSelectHistory": "Download history", - "backupSelectCollections": "Library collections", - "backupSelectCollectionsDescription": "Liked tracks, wishlist, favorite artists, playlists and playlist covers.", - "backupSelectExtensions": "Extensions and their settings", - "backupSelectedExportDescription": "Save the selected categories to a backup file. Audio files are not included.", - "backupSelectAtLeastOne": "Select at least one category to create a backup.", - "backupSelectedRestoreMessage": "Only the categories listed below will be restored. Categories not included in this backup will stay unchanged. Restoring can replace existing data and cannot be undone.", + "backupSettingsOnly": "Paramètres uniquement", + "backupSelectHistory": "Historique des téléchargements", + "backupSelectCollections": "Fonds de la bibliothèque", + "backupSelectCollectionsDescription": "Titres appréciés, liste de souhaits, artistes préférés, playlists et pochettes de playlists.", + "backupSelectExtensions": "Les extensions et leurs paramètres", + "backupSelectedExportDescription": "Enregistrez les catégories sélectionnées dans un fichier de sauvegarde. Les fichiers audio ne sont pas inclus.", + "backupSelectAtLeastOne": "Sélectionnez au moins une catégorie pour créer une sauvegarde.", + "backupSelectedRestoreMessage": "Seules les catégories répertoriées ci-dessous seront restaurées. Les catégories non incluses dans cette sauvegarde resteront inchangées. La restauration peut remplacer les données existantes et ne peut pas être annulée.", "backupContentsSettings": "Paramètres de l'application", "@backupContentsSettings": { "description": "Backup contents row label for settings" @@ -4290,10 +4389,10 @@ "@downloadLocationSubtitle": { "description": "Subtitle shown in the download location picker sheet" }, - "storageAutomaticFolder": "Automatic folder", - "storageAutomaticDownloadFolder": "Uses Download/SpotiFLAC when writable, otherwise app storage", - "storageSafRecommended": "Choose folder (Recommended)", - "storageDownloadFolderHint": "In the Android folder picker, open Download and select SpotiFLAC. If it does not exist, create it using New folder, then tap Use this folder to grant access.", + "storageAutomaticFolder": "Dossier automatique", + "storageAutomaticDownloadFolder": "Utilise « Download/SpotiFLAC » si l'espace de stockage est accessible en écriture, sinon le stockage de l'application", + "storageSafRecommended": "Choisir un dossier (recommandé)", + "storageDownloadFolderHint": "Dans le sélecteur de dossiers Android, ouvrez le dossier « Téléchargements » et sélectionnez « SpotiFLAC ». S'il n'existe pas, créez-le à l'aide de l'option « Nouveau dossier », puis appuyez sur « Utiliser ce dossier » pour autoriser l'accès.", "storageModeAppFolder": "Dossier « Applications » (recommandé)", "@storageModeAppFolder": { "description": "Storage mode option - app-managed folder" @@ -4862,39 +4961,39 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "downloadRedownloadFakeHiRes": "Re-download fake Hi-Res", + "downloadRedownloadFakeHiRes": "Télécharger à nouveau la fausse version haute résolution", "@downloadRedownloadFakeHiRes": { "description": "Setting title: automatically replace downloads that measure as fake Hi-Res" }, - "downloadRedownloadFakeHiResSubtitle": "Off by default. Check Hi-Res downloads and replace only when every audio sample is preserved. Keep the original if verification or processing fails", + "downloadRedownloadFakeHiResSubtitle": "Désactivé par défaut. Cochez « Téléchargements haute résolution » et ne remplacez les fichiers que si tous les échantillons audio sont conservés. Conservez l'original en cas d'échec de la vérification ou du traitement.", "@downloadRedownloadFakeHiResSubtitle": { "description": "Setting subtitle for the fake Hi-Res re-download toggle" }, - "hiResCheckVerdictFakeCertain": "Fake Hi-Res", + "hiResCheckVerdictFakeCertain": "Fausse haute résolution", "@hiResCheckVerdictFakeCertain": { "description": "Verdict: an exact fingerprint (padded bits or upsampling pattern) proves the file is not real Hi-Res" }, - "hiResCheckVerdictFakeSuspect": "Possibly a filtered master", + "hiResCheckVerdictFakeSuspect": "Peut-être une piste principale filtrée", "@hiResCheckVerdictFakeSuspect": { "description": "Verdict: fails the cutoff test but may be a genuine master low-pass filtered in mastering" }, - "hiResCheckReasonSampleHold": "Every sample is repeated: upsampled by duplication", + "hiResCheckReasonSampleHold": "Chaque échantillon est répété : suréchantillonné par duplication", "@hiResCheckReasonSampleHold": { "description": "Reason: sample-and-hold upsampling detected" }, - "hiResCheckReasonInterpolation": "In-between samples are linearly interpolated", + "hiResCheckReasonInterpolation": "Les échantillons intermédiaires sont interpolés de manière linéaire", "@hiResCheckReasonInterpolation": { "description": "Reason: linear-interpolation upsampling detected" }, - "hiResCheckReasonImaging": "Content above 22 kHz mirrors the audible band", + "hiResCheckReasonImaging": "Les fréquences supérieures à 22 kHz reflètent la bande audible", "@hiResCheckReasonImaging": { "description": "Reason: spectral imaging from upsampling detected" }, - "hiResCheckMusicContent": "Musical content", + "hiResCheckMusicContent": "Contenu musical", "@hiResCheckMusicContent": { "description": "Label for the highest frequency that still moves with the music" }, - "hiResCheckUltrasonicNoise": "Above {cutoff} only steady noise (typical of DSD or analog tape transfers): a {rate} file would hold all the music", + "hiResCheckUltrasonicNoise": "Au-dessus de {cutoff}, on n'entend qu'un bruit constant (typique du DSD ou des transferts à partir de bandes analogiques) : un fichier {rate} contiendrait l'intégralité de la musique", "@hiResCheckUltrasonicNoise": { "description": "Shown when the ultrasonic content of a Hi-Res file is noise rather than music", "placeholders": { @@ -4906,55 +5005,110 @@ } } }, - "hiResCheckTitle": "Hi-Res Authenticity", + "hiResCheckTitle": "Authenticité haute résolution", "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, - "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", + "hiResCheckSummary": "Vérifiez le spectre et la profondeur de bits active pour détecter d'éventuels signes de suréchantillonnage ou de remplissage.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Bande passante limitée", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "Aucun suréchantillonnage ni remplissage détecté", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Seuil estimé", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Bits actifs / stockés", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "Une fréquence de coupure inférieure peut résulter du mastering. Elle ne prouve pas, en soi, qu'il y a eu suréchantillonnage.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Sur la base de {seconds} secondes d'enregistrement audio. Cette analyse ne permet pas de certifier l'authenticité de la source originale.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "Le spectre présente des bandes symétriques, ce qui correspond à un suréchantillonnage.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "Une forte atténuation en proximité de {cutoff} et le niveau de bruit de fond mesuré laissent supposer une source à faible débit.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "L'énergie au-dessus de {cutoff} est globalement stable dans le segment analysé et pourrait correspondre à du bruit.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckDescription": "Détecter les faux fichiers « haute résolution » issus d'un suréchantillonnage ou d'un remplissage binaire", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" }, - "hiResCheckRun": "Check", + "hiResCheckRun": "Vérifier", "@hiResCheckRun": { "description": "Button that starts the Hi-Res authenticity check" }, - "hiResCheckChecking": "Checking Hi-Res authenticity...", + "hiResCheckChecking": "Vérification de l'authenticité de la haute résolution...", "@hiResCheckChecking": { "description": "Loading text while the Hi-Res check runs" }, - "hiResCheckVerdictFake": "Likely fake Hi-Res", + "hiResCheckVerdictFake": "Probablement une fausse image haute résolution", "@hiResCheckVerdictFake": { "description": "Verdict: the file claims Hi-Res but does not measure as it" }, - "hiResCheckVerdictGenuine": "Measures as genuine Hi-Res", + "hiResCheckVerdictGenuine": "Offre une véritable haute résolution", "@hiResCheckVerdictGenuine": { "description": "Verdict: no upsampling or padded bit depth found" }, - "hiResCheckVerdictStandard": "Standard definition, nothing to flag", + "hiResCheckVerdictStandard": "Définition standard, rien à signaler", "@hiResCheckVerdictStandard": { "description": "Verdict: neither sample rate nor bit depth claims Hi-Res" }, - "hiResCheckVerdictInconclusive": "Inconclusive: the analyzed segment is too quiet or short", + "hiResCheckVerdictInconclusive": "Résultat non concluant : le segment analysé est trop silencieux ou trop court", "@hiResCheckVerdictInconclusive": { "description": "Verdict: analysis could not reach a reliable conclusion" }, - "hiResCheckUnsupported": "Only FLAC and WAV files can be checked", + "hiResCheckUnsupported": "Seuls les fichiers FLAC et WAV peuvent être vérifiés", "@hiResCheckUnsupported": { "description": "Shown when the file format cannot be decoded by the Hi-Res check" }, - "hiResCheckCutoff": "Content cutoff", + "hiResCheckCutoff": "Fin du contenu", "@hiResCheckCutoff": { "description": "Label for the highest frequency with real content" }, - "hiResCheckBitsInUse": "Bits in use", + "hiResCheckBitsInUse": "Bits utilisés", "@hiResCheckBitsInUse": { "description": "Label for effective vs declared bit depth" }, - "hiResCheckDisclaimer": "The spectrum stops early, but nothing proves it was upsampled: it may be a genuine master low-pass filtered in mastering. It is not replaced automatically.", + "hiResCheckDisclaimer": "Le spectre s'arrête prématurément, mais rien ne prouve qu'il ait été suréchantillonné : il peut s'agir d'un master authentique ayant subi un filtrage passe-bas lors du mastering. Il n'est pas remplacé automatiquement.", "@hiResCheckDisclaimer": { "description": "Caveat shown under a fake Hi-Res verdict" }, - "hiResCheckFailed": "Hi-Res check failed: {error}", + "hiResCheckFailed": "Échec de la vérification haute résolution : {error}", "@hiResCheckFailed": { "description": "Error shown when the Hi-Res check fails", "placeholders": { @@ -4963,7 +5117,7 @@ } } }, - "hiResCheckReasonRate": "Declares {sampleRate} but content stops at ~{cutoff}", + "hiResCheckReasonRate": "Indique {sampleRate}, mais le contenu s'arrête à environ {cutoff}", "@hiResCheckReasonRate": { "description": "Reason for a fake verdict caused by upsampling", "placeholders": { @@ -4975,7 +5129,7 @@ } } }, - "hiResCheckReasonDepth": "Declares {declared}-bit but only {effective} bits carry data", + "hiResCheckReasonDepth": "Déclare {declared} bits, mais seuls les {effective} bits contiennent des données", "@hiResCheckReasonDepth": { "description": "Reason for a fake verdict caused by padded bit depth", "placeholders": { @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "La numérisation de la bibliothèque est en pause", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} fichiers analysés. Rendez-vous dans les paramètres de la bibliothèque locale pour reprendre à partir de là.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Télécharger SpotiFLAC v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -6266,7 +6433,7 @@ "@libraryBuiltInPreviewPlayer": { "description": "Setting option to use the built-in preview player" }, - "libraryBuiltInPreviewPlayerSubtitle": "Quick local previews inside SpotiFLAC Mobile", + "libraryBuiltInPreviewPlayerSubtitle": "Aperçus rapides en local dans SpotiFLAC Mobile", "@libraryBuiltInPreviewPlayerSubtitle": { "description": "Subtitle for built-in preview player option" }, @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "À suivre", + "nowPlayingAudioOutput": "Sortie audio", + "nowPlayingWrittenBy": "Écrit par : {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Paroles : {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Acheter des billets", + "concertSetList": "Liste des morceaux du concert", + "concertSetListButton": "Liste des morceaux", + "concertAddToCalendar": "Ajouter au calendrier", + "concertOpenMaps": "Ouvrir Maps", + "concertDetailsUnavailable": "Les informations concernant le concert ne sont pas disponibles pour le moment.", + "concertCalendarUnavailable": "Impossible d'ouvrir le calendrier.", + "nowPlayingAudioOutputUnavailable": "Impossible d'ouvrir les paramètres de sortie audio.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "Ce fichier ne contient pas de paroles", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Options de langue pour les paroles", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Masquer la prononciation", + "nowPlayingShowPronunciation": "Afficher la prononciation", + "nowPlayingHideTranslation": "Masquer la traduction", + "nowPlayingShowTranslation": "Afficher la traduction", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "ReplayGain manquant", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copier le titre de la piste", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6781,9 +6989,9 @@ "@metadataCopyField": { "description": "Metadata menu action that copies the selected key and value" }, - "mornyeShowTabs": "Show tabs", - "mornyeSearch": "Search", - "mornyeContinuePlaying": "Continue Playing", + "mornyeShowTabs": "Afficher les onglets", + "mornyeSearch": "Rechercher", + "mornyeContinuePlaying": "Continuer à lire", "metadataCopyAll": "Copier toutes les métadonnées", "@metadataCopyAll": { "description": "Metadata menu action that copies every visible key and value" @@ -6796,28 +7004,34 @@ "@optionsEmbeddedCoverSizeDescription": { "description": "Description shown in the embedded cover size picker" }, - "mornyeFavorite": "Favorite", - "mornyeGoToArtist": "Go to Artist", + "mornyeFavorite": "Favoris", + "mornyeGoToArtist": "Aller à la page de l'artiste", "@mornyeFavorite": { "description": "Compact context menu action that adds a track to Loved" }, - "mornyeFavorited": "Favorited", + "mornyeFavorited": "Ajouté aux favoris", "@mornyeFavorited": { "description": "Selected state of the compact favorite action" }, - "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", - "autoMixOn": "AutoMix on", - "autoMixOff": "AutoMix off", - "profileTitle": "Profile", - "profileSetUp": "Set up your profile", - "profileEdit": "Edit name and photo", - "backupIncludesProfile": "Includes your profile name and photo", - "profileName": "Name", - "profileNameHint": "Your name", - "profileChangePhoto": "Choose photo", - "profileRemovePhoto": "Remove photo", - "profilePhotoError": "Choose a valid image smaller than 20 MB.", - "profileSaveError": "Could not save your profile. Please try again.", + "autoMixDescription": "Mélangez des morceaux grâce à la synchronisation des rythmes et à l'ajustement du tempo tout en conservant la hauteur tonale. Utilise un fondu enchaîné lorsque les rythmes ne peuvent pas être synchronisés.", + "autoMixOn": "AutoMix activé", + "autoMixOff": "AutoMix désactivé", + "autoplayOn": "Lecture automatique activée", + "autoplayOff": "Lecture automatique désactivée", + "autoplayFromLibrary": "Lecture automatique à partir de votre bibliothèque", + "profileTitle": "Profil", + "profileSetUp": "Configurez votre profil", + "profileEdit": "Modifier le nom et la photo", + "backupIncludesProfile": "Comprend le nom et la photo de votre profil", + "profileName": "Nom", + "profileNameHint": "Votre nom", + "profileChangePhoto": "Choisir une photo", + "profileRemovePhoto": "Supprimer la photo", + "profilePhotoError": "Choisissez une image valide dont la taille est inférieure à 20 Mo.", + "profileSaveError": "Impossible d'enregistrer votre profil. Veuillez réessayer.", + "artistUpcomingConcerts": "Prochains concerts", + "artistAllUpcomingConcerts": "Tous les concerts à venir", + "artistNoUpcomingConcerts": "Aucun concert prévu.", "optionsEmbeddedCoverSizeOriginal": "Résolution originale", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" diff --git a/lib/l10n/arb/app_hi.arb b/lib/l10n/arb/app_hi.arb index 99189ce5..799a22fd 100644 --- a/lib/l10n/arb/app_hi.arb +++ b/lib/l10n/arb/app_hi.arb @@ -1,4 +1,31 @@ { + "settingsPlaybackSubtitle": "Player, volume, AutoMix, and audio output", + "sectionPlayer": "Player", + "sectionVolumeAndTransitions": "Volume and transitions", + "sectionAudioOutput": "Audio output", + "usbBitPerfect": "Hi-res and bit-perfect audio", + "usbBitPerfectDescription": "Preserve source precision on compatible outputs. Choose direct USB or AAudio exclusive below; otherwise Android USB output requires Android 14 or later. Applies from the next track, without AutoMix or normalization. System volume may not control direct USB.", + "usbHardwareVolume": "DAC hardware volume", + "usbVolumeWarningTitle": "Check your listening volume", + "usbVolumeWarning": "Direct USB audio can be much louder than normal playback, and phone volume buttons may not control it. Lower your DAC or amplifier volume before starting. When supported, SpotiFLAC sets the DAC to at most −40 dB on connection; this does not guarantee a safe listening level on every amplifier or headphone.", + "usbVolumeAccept": "I understand", + "usbVolumeUnavailable": "Playback is paused because this DAC has no verified hardware volume control. Lower the DAC or amplifier volume, then enable fixed-volume output if needed and select the track again.", + "usbFixedVolume": "Allow fixed-volume USB output", + "usbFixedVolumeDescription": "For DACs without a volume control accessible to the app. Keep off for USB headsets without their own volume control. Applies from the next track.", + "usbFixedVolumeWarning": "The app cannot lower the volume on this output. Audio may start at full level, and the phone volume slider will not help. Only continue after lowering the volume on your DAC or external amplifier. Do not enable this for a headset without its own volume control.", + "dapExclusive": "DAP hi-res (AAudio exclusive)", + "dapExclusiveDescription": "Use Oboe/AAudio at the track's original rate and precision for FLAC/WAV PCM. Requires Android 8.1 or later and compatible hardware. Exclusive access is checked; unavailable formats use normal playback. DSD requires the direct USB driver. Applies from the next track.", + "dapExclusiveUnavailable": "AAudio exclusive access is unavailable for this track and current output. Using normal playback. For a USB DAC, try the direct USB driver.", + "usbDirect": "Direct USB driver", + "usbDirectDescription": "Use exclusive USB audio for FLAC/WAV, DSF/DFF and WavPack DSD, with Android USB permission. Native DSD requires a recognized compatible DAC. Other PCM formats use normal playback. Applies from the next track.", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "Enable only if your DAC explicitly supports DoP. Sends DSF/DFF and WavPack DSD inside a PCM carrier when native DSD is unavailable. An incompatible device may play noise; leave off for ordinary USB headsets.", + "usbDsdUnsupported": "This DSD format or connected DAC is not supported. Playback stopped.", + "usbPermissionDenied": "USB permission was not granted. Using normal playback.", + "usbBitPerfectPending": "Waiting for the next track and a compatible USB output.", + "usbBitPerfectNoDevice": "No USB DAC connected. Using normal audio output.", + "usbBitPerfectFallback": "This device or audio format does not support bit-perfect output. Using normal playback.", + "usbBitPerfectRouteChanged": "The USB audio route changed. Playback paused; select a track to reconnect.", "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Make it\nyour own.", "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", @@ -36,6 +63,32 @@ "description": "System volume control label in the Mornye player" }, "appearanceStyle": "App Style", + "appearanceAccentRed": "Red (default)", + "appearanceAccentOrange": "Orange", + "appearanceAccentGreen": "Green", + "appearanceAccentTeal": "Teal", + "appearanceAccentBlue": "Blue", + "appearanceAccentPurple": "Purple", + "appearanceAccentPink": "Pink", + "appearanceGlassClarity": "Glass clarity", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Tinted", + "appearanceGlassClear": "Clear", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Use system font", + "appearanceUseSystemFontSubtitle": "Use your device’s default typeface for app text.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Remove ReplayGain", + "trackRemoveReplayGainSuccess": "ReplayGain tags removed", + "trackRemoveReplayGainFailed": "Failed to remove ReplayGain tags", + "replayGainRemoving": "Removing ReplayGain...", + "replayGainRemoveConfirmMessage": "Remove track and album ReplayGain tags from {count} track(s)? Audio, artwork, and other metadata will be preserved.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Remove RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain removed from {success} of {total} tracks", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "Extension Repo", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "Lyrics Mode", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% of {total} files", "@libraryScanProgress": { "description": "Scan progress display", @@ -4910,6 +5009,61 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "Inspect the spectrum and active bit depth for signs of upsampling or padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Limited bandwidth", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No upsampling or padding detected", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Estimated cutoff", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Active / stored bits", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "A lower cutoff can come from mastering. It does not, by itself, prove upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Based on {seconds} seconds of audio. This analysis cannot certify the original master.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "The spectrum contains mirrored bands consistent with upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "A sharp roll-off near {cutoff} and the measured noise floor suggest a lower-rate source.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energy above {cutoff} is mostly steady in the analyzed segment and may be noise.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Up next", + "nowPlayingAudioOutput": "Audio Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Get Tickets", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Open Maps", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Lyrics language options", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Hide Pronunciation", + "nowPlayingShowPronunciation": "Show Pronunciation", + "nowPlayingHideTranslation": "Hide Translation", + "nowPlayingShowTranslation": "Show Translation", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copy track name", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6808,6 +7016,9 @@ "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", "autoMixOn": "AutoMix on", "autoMixOff": "AutoMix off", + "autoplayOn": "Autoplay on", + "autoplayOff": "Autoplay off", + "autoplayFromLibrary": "Autoplay from your Library", "profileTitle": "Profile", "profileSetUp": "Set up your profile", "profileEdit": "Edit name and photo", @@ -6818,8 +7029,11 @@ "profileRemovePhoto": "Remove photo", "profilePhotoError": "Choose a valid image smaller than 20 MB.", "profileSaveError": "Could not save your profile. Please try again.", + "artistUpcomingConcerts": "Upcoming Concerts", + "artistAllUpcomingConcerts": "All Upcoming Concerts", + "artistNoUpcomingConcerts": "No upcoming concerts.", "optionsEmbeddedCoverSizeOriginal": "Original resolution", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" } -} +} \ No newline at end of file diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index 4b197453..62260109 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -43,71 +43,154 @@ "extensionAccountRestartLogin": "Mulai ulang login akun untuk melanjutkan.", "extensionAccountRequiredValue": "Masukkan nilai.", "extensionAccountInvalidNumber": "Masukkan angka yang valid.", - "settingsPlaybackSubtitle": "Pemutar, volume, AutoMix, dan keluaran audio", + "appearanceGlassClearPerformance": "Kaca sangat bening dapat memakai lebih banyak daya dan terasa kurang lancar di perangkat lama. Kurangi kebeningan jika perlu.", + "libraryFilterIncompleteAlbums": "Album belum lengkap", + "@libraryFilterIncompleteAlbums": { + "description": "Library filter for albums with confirmed missing track positions" + }, + "libraryAlbumCompletenessUnknown": "Kelengkapan album belum diketahui", + "@libraryAlbumCompletenessUnknown": { + "description": "Library filter and status for missing, conflicting or ambiguous album track counts" + }, + "libraryAlbumMissingTracks": "{present}/{expected} lagu · kurang {missing}", + "@libraryAlbumMissingTracks": { + "description": "Album completeness badge tooltip", + "placeholders": { + "present": { + "type": "int" + }, + "expected": { + "type": "int" + }, + "missing": { + "type": "int" + } + } + }, + "autoMixSettingsTitle": "Transisi mix", + "autoMixAutomaticDuration": "Durasi otomatis", + "autoMixDuration": "Durasi mix", + "autoMixEffect": "Efek transisi", + "autoMixEffectAuto": "Otomatis", + "autoMixEffectCrossfade": "Crossfade", + "autoMixEffectMuffled": "Redam", + "autoMixEffectEcho": "Gema", + "autoMixEffectPitch": "Nada", + "autoMixEffectCustom": "Kustom", + "autoMixEffectsHelp": "Efek diterapkan pada akhir lagu yang keluar selama mix. Lagu pendek memakai overlap yang lebih singkat.", + "autoMixSpeed": "Kecepatan", + "autoMixPitch": "Nada (semitone)", + "autoMixEcho": "Gema", + "autoMixLowPass": "Filter redam", + "autoMixMixing": "Mixing", + "autoMixCrossfading": "Crossfade", + "motionArtwork": "Artwork bergerak", + "listeningStats": "Statistik mendengarkan", + "listeningStatsRecord": "Catat waktu mendengarkan", + "listeningStatsDescription": "Disimpan hanya di perangkat ini, mulai sekarang. Hanya mencatat player bawaan; pause, buffering, dan seek tidak menambah waktu dengar. Pemutaran dihitung setelah 30 detik.", + "listeningStatsEmpty": "Putar musik dengan player bawaan untuk memulai ringkasan mendengarkan. Riwayat sebelumnya tidak dapat dipulihkan.", + "listeningStatsDays": "{days} hari", + "listeningStatsMinutes": "{minutes} menit", + "listeningStatsTotals": "{plays} pemutaran · {tracks} lagu · {days} hari aktif", + "listeningStatsPreviousYear": "Tahun sebelumnya", + "listeningStatsNextYear": "Tahun berikutnya", + "listeningStatsActivity": "Hari mendengarkan terbaru · menit", + "listeningStatsTopArtists": "Artis teratas", + "listeningStatsTopTracks": "Lagu teratas", + "listeningStatsLoadError": "Statistik mendengarkan tidak dapat dimuat", + "listeningStatsClear": "Hapus statistik mendengarkan", + "listeningStatsClearError": "Statistik mendengarkan tidak dapat dihapus. Silakan coba lagi.", + "listeningStatsClearDescription": "Hapus semua statistik mendengarkan di perangkat ini? Musik dan playlist tetap tersimpan.", + "weeklyReleases": "Rilis baru", + "weeklyReleasesDescription": "Album dan single terbaru dari artis favorit, melalui extension metadata yang terpasang.", + "weeklyReleasesEmpty": "Tidak ditemukan rilis dengan tanggal dalam periode ini. Tambahkan artis favorit atau coba periode lebih panjang.", + "weeklyReleasesUnavailable": "Beberapa artis tidak dapat diperiksa. Hasil tersimpan tetap dipertahankan. Penyedia mungkin tidak memberikan katalog artis atau tanggal rilis lengkap.", + "weeklyReleasesLoadError": "Rilis baru tidak dapat diperiksa. Tarik untuk memuat ulang.", + "motionArtworkDescription": "Putar berulang cover video dari penyedia metadata. Matikan untuk memakai cover diam dan menghemat baterai.", + "libraryLoading": "Memuat Library…", + "libraryLoadFailed": "Library tidak dapat dimuat. Coba lagi untuk memuat folder tersimpan dan indeks lagu.", + "discordPresenceDescription": "Tampilkan judul, artis, album, dan progres musik dari pemutar bawaan di profil Discord Anda. File audio dan cover lokal tidak diunggah. Status dihapus saat musik dijeda atau dihentikan.", + "discordPresenceDisabled": "Nonaktif", + "discordPresenceLink": "Hubungkan akun Discord", + "discordPresenceConnecting": "Menghubungkan ke Discord…", + "discordPresenceReady": "Siap saat musik diputar", + "discordPresenceActive": "Menampilkan lagu saat ini", + "discordPresenceUnavailable": "Discord tidak tersedia. Mencoba lagi saat musik diputar.", + "discordPresenceBuildUnavailable": "SDK Discord tidak tersedia di build ini.", + "discordPresenceAndroidHelp": "Pasang Discord dan masuk di ponsel ini. Izinkan berbagi aktivitas di Discord. Pemutar eksternal tidak didukung.", + "discordPresenceIosHelp": "Hubungkan akun melalui Discord dan izinkan berbagi aktivitas. Ketuk untuk menghubungkan ulang jika otorisasi gagal.", + "discordPresenceDisconnect": "Putuskan dan lupakan akun", + "playbackAutomation": "Pemutaran otomatis", + "playbackPauseOnMute": "Jeda saat volume nol", + "snackbarPlaybackMuted": "Volume media nol. Lagu dijeda. Tekan play lagi untuk tetap memutar.", + "playbackPauseOnMuteDescription": "Jeda saat volume media nol dan lanjutkan saat dinaikkan. Jeda manual tetap dihormati. Hanya untuk keluaran audio standar.", + "playbackOnHeadphonesConnected": "Putar saat earphone terhubung", + "playbackOnHeadphonesConnectedDescription": "Lanjutkan lagu saat earphone kabel atau Bluetooth terhubung. Pemutaran dijeda saat dilepas. Hanya untuk pemutar bawaan.", + "settingsPlaybackSubtitle": "Pemutar, volume, AutoMix, dan output audio", "sectionPlayer": "Pemutar", "sectionVolumeAndTransitions": "Volume dan transisi", - "sectionAudioOutput": "Keluaran audio", - "usbBitPerfect": "Audio hi-res dan bit-perfect", + "sectionAudioOutput": "Output audio", + "usbBitPerfect": "Audio Hi-Res dan Bit-Perfect", + "usbBitPerfectDescription": "Pertahankan kualitas audio di perangkat output yang didukung. Pilih Direct USB atau AAudio Exclusive di bawah; juga, output USB Android butuh Android 14+. Berlaku di lagu selanjutnya, tanpa AutoMix & normalisasi. Mungkin Anda tidak dapat mengatur volume.", "usbHardwareVolume": "Volume hardware DAC", - "usbVolumeWarningTitle": "Periksa volume sebelum memutar", - "usbVolumeWarning": "Audio USB langsung bisa jauh lebih keras daripada pemutaran biasa, dan tombol volume HP mungkin tidak berpengaruh. Turunkan volume DAC atau amplifier sebelum memutar. Jika didukung, SpotiFLAC mengatur volume DAC paling tinggi −40 dB saat tersambung; angka ini tidak menjamin tingkat suara yang aman untuk semua amplifier atau headphone.", - "usbVolumeAccept": "Saya mengerti", - "usbVolumeUnavailable": "Pemutaran dijeda karena DAC ini tidak memiliki kontrol volume hardware yang terverifikasi. Turunkan volume DAC atau amplifier, lalu aktifkan keluaran volume tetap jika diperlukan dan pilih lagunya kembali.", - "usbFixedVolume": "Izinkan keluaran USB volume tetap", - "usbFixedVolumeDescription": "Untuk DAC yang kontrol volumenya tidak bisa diakses aplikasi. Biarkan mati pada headset USB tanpa kontrol volume sendiri. Berlaku mulai lagu berikutnya.", - "usbFixedVolumeWarning": "Aplikasi tidak bisa menurunkan volume keluaran ini. Suara bisa mulai pada tingkat penuh dan slider volume HP tidak akan membantu. Lanjutkan hanya setelah menurunkan volume pada DAC atau amplifier eksternal. Jangan aktifkan untuk headset tanpa kontrol volume sendiri.", - "dapExclusive": "Hi-res DAP (AAudio eksklusif)", - "dapExclusiveDescription": "Gunakan Oboe/AAudio pada laju sampel dan presisi asli lagu PCM FLAC/WAV. Memerlukan Android 8.1 atau lebih baru dan perangkat kompatibel. Akses eksklusif diperiksa; format yang tidak didukung memakai pemutaran biasa. DSD memerlukan driver USB langsung. Berlaku mulai lagu berikutnya.", - "dapExclusiveUnavailable": "Akses AAudio eksklusif tidak tersedia untuk lagu dan keluaran saat ini. Memakai pemutaran biasa. Untuk DAC USB, coba driver USB langsung.", - "usbDirect": "Driver USB langsung", - "usbDirectDescription": "Gunakan audio USB eksklusif untuk FLAC/WAV, DSF/DFF dan WavPack DSD, dengan izin USB Android. Native DSD memerlukan DAC kompatibel yang dikenali. Format PCM lainnya memakai pemutaran biasa. Berlaku mulai lagu berikutnya.", + "usbVolumeWarningTitle": "Periksa volume Anda", + "usbVolumeWarning": "Memutar dengan Direct USB akan membuat suara lebih keras dari biasanya, dan tombol volume mungkin tidak akan berfungsi. Pelankan volume DAC atau amplifier Anda sebelum mendengar. Bila mendukung, SpotiFLAC mengatur volume DAC pada -40dB saat terhubung; tapi ini tidak menjamin suara akan berada di batas aman.", + "usbVolumeAccept": "Saya paham", + "usbVolumeUnavailable": "Pemutaran dijeda karena kontrol volume pada hardware DAC tidak dapat diverifikasi. Turunkan volume DAC atau Amplifier, lalu hidupkan volume output tetap bila dibutuhkan lalu putar lagi.", + "usbFixedVolume": "Izinkan volume tetap output USB", + "usbFixedVolumeDescription": "Untuk DAC yang tidak dapat dikontrol volume oleh aplikasi. Matikan bila menggunakan headset USB yang tidak punya kontrol volume. Berlaku di lagu selanjutnya.", + "usbFixedVolumeWarning": "Aplikasi tidak dapat menurunkan volume output ini. Audio mungkin terdengar sangat kencang, dan kontrol volume perangkat tidak dapat berfungsi. Lanjutkan setelan menurunkan volume DAC/Amplifier Anda. Jangan hidupkan bila headset Anda tidak punya kontrol volume.", + "dapExclusive": "Hi-Res DAP (eksklusif AAudio)", + "dapExclusiveDescription": "Gunakan Oboe/AAudio pada sample rate dan presisi asli FLAC/WAV PCM. Butuh Android 8.1+ dan hardware didukung. Akses eksklusif diperiksa; format tak didukung akan gunakan pemutaran normal. DSD butuh driver Direct USB. Berlaku di lagu selanjutnya.", + "dapExclusiveUnavailable": "Akses eksklusif AAudio tidak tersedia di lagu dan output ini. Lagu akan diputar normal. Jika pakai DAC USB, coba pakai driver Direct USB.", + "usbDirect": "Driver Direct USB", + "usbDirectDescription": "Gunakan audio USB eksklusif pada FLAC/WAV, DSF/DFF, dan WavPack DSD dengan izin USB Android. DSD Native butuh DAC yang didukung dan dikenali. Format PCM lain akan diputar normal. Berlaku di lagu selanjutnya.", "usbDsdOverPcm": "DSD melalui PCM (DoP)", - "usbDsdOverPcmDescription": "Aktifkan hanya jika DAC Anda mendukung DoP. Mengirim DSF/DFF dan WavPack DSD di dalam pembawa PCM saat native DSD tidak tersedia. Perangkat yang tidak kompatibel dapat menghasilkan suara bising; biarkan mati untuk headset USB biasa.", - "usbDsdUnsupported": "Format DSD atau DAC yang tersambung tidak didukung. Pemutaran dihentikan.", - "usbPermissionDenied": "Izin USB tidak diberikan. Memakai pemutaran biasa.", - "usbBitPerfectDescription": "Pertahankan presisi audio asli pada keluaran kompatibel. Pilih USB langsung atau AAudio eksklusif di bawah; keluaran USB Android biasa memerlukan Android 14 atau lebih baru. Berlaku mulai lagu berikutnya, tanpa AutoMix atau normalisasi. Volume sistem mungkin tidak mengatur USB langsung.", - "usbBitPerfectPending": "Menunggu lagu berikutnya dan keluaran USB yang kompatibel.", - "usbBitPerfectNoDevice": "DAC USB tidak terhubung. Menggunakan keluaran audio biasa.", - "usbBitPerfectFallback": "Perangkat atau format audio ini tidak mendukung keluaran bit-perfect. Menggunakan pemutaran biasa.", - "usbBitPerfectRouteChanged": "Keluaran audio USB berubah. Pemutaran dijeda; pilih lagu untuk menyambungkan kembali.", - "upgradeIntroWelcome": "Selamat datang di\nSpotiFLAC-Mobile 5.0", - "upgradeIntroThemeTitle": "Pilih\ntampilanmu.", - "upgradeIntroThemeBody": "Pilih tema yang kamu suka. Pilihan langsung diterapkan dan bisa diubah lagi lewat Tampilan.", - "upgradeIntroThemeMaterialBody": "Tampilan yang sudah familiar, dengan kontrol Material dan warna aksen pilihanmu.", - "upgradeIntroThemeMornyeBody": "Navigasi kaca, Library yang ditata ulang, dan player dengan artwork memenuhi layar.", - "upgradeIntroRustTitle": "Mesin baru.\nDibangun dengan Rust.", - "upgradeIntroRustBody": "Di versi 5.0, backend aplikasi beralih dari Go ke Rust. Inilah mesin yang bekerja di balik layar yang kamu gunakan setiap hari.", + "usbDsdOverPcmDescription": "Hidupkan bila DAC Anda mendukung DoP. Mengirim DSF/DFF & WavPack DSD dalam carrier PCM saat DSD native tidak tersedia. Bila tak didukung mungkin membuat suara desis; biarkan mati bila menggunakan headset USB biasa.", + "usbDsdUnsupported": "Format DSD/DAC terhubung tidak didukung. Pemutaran berhenti.", + "usbPermissionDenied": "Izin USB tidak diberikan. Menggunakan pemutaran normal.", + "usbBitPerfectPending": "Menunggu lagu selanjutnya dan output USB yang didukung.", + "usbBitPerfectNoDevice": "Tiada DAC USB terhubung. Menggunakan pemutaran normal.", + "usbBitPerfectFallback": "Perangkat atau format audio tidak mendukung output Bit-Perfect. Menggunakan pemutaran normal.", + "usbBitPerfectRouteChanged": "Rute audio USB berubah. Pemutaran dijeda; pilih lagu untuk menghubungkan ulang.", + "upgradeIntroWelcome": "Selamat datang di SpotiFLAC-Mobile 5.0", + "upgradeIntroThemeTitle": "Pilih \ntampilan Anda.", + "upgradeIntroThemeBody": "Pilih tampilan yang Anda suka. Pilihan langsung diterapkan dan Anda dapat mengubahnya lewat Tampilan.", + "upgradeIntroThemeMaterialBody": "Tampilan yang familiar, estetika Material dengan warna aksen pilihan Anda.", + "upgradeIntroThemeMornyeBody": "Tampilan Liquid Glass, Koleksi yang didesain ulang dengan pemutar yang cantik.", + "upgradeIntroRustTitle": "Engine baru.\nDibuat dengan Rust.", + "upgradeIntroRustBody": "Di versi 5.0, backend aplikasi dialihkan dari Go ke Rust. Ini adalah engine yang bekerja di balik layar yang Anda gunakan tiap hari.", "upgradeIntroRustEngineTitle": "Bekerja di balik layar", - "upgradeIntroRustEngineBody": "Rust menangani unduhan, metadata audio, pemindaian Library, dan runtime extension di Android serta iOS.", - "upgradeIntroRustMemoryTitle": "Lebih hemat alokasi memori", - "upgradeIntroRustMemoryBody": "Buffer dipakai ulang dan penyalinan data dikurangi saat mengolah artwork serta data extension, sehingga alokasi sementara lebih sedikit.", - "upgradeIntroRustKeepTitle": "Musikmu tetap tersimpan", - "upgradeIntroRustKeepBody": "Tidak perlu mengunduh ulang koleksimu. Musik dan pengaturan yang tersimpan tetap tersedia, tanpa pengaturan tambahan.", - "upgradeIntroWelcomeBody": "Kenali perubahan terbaru dan tempat menemukannya.", - "upgradeIntroMornyeBody": "Tampilan baru untuk player, lirik, dan navigasi.", - "upgradeIntroLibrarySummary": "Jelajahi musik berdasarkan playlist, artis, atau album.", - "upgradeIntroRepoSummary": "Pilih sumber musik dan penyedia layanan melalui extension.", - "upgradeIntroLibraryTitle": "Kenali\nLibrary barumu.", - "upgradeIntroLibraryBody": "Di Mornye, jelajahi musik per kategori atau temukan albummu di Baru Ditambahkan.", - "upgradeIntroDownloadsBody": "Jeda dan coba lagi lewat Unduhan di kanan atas. Musik yang selesai masuk ke Baru Ditambahkan.", - "upgradeIntroSearchBody": "Cari musik tersimpan di sini. Tab Search terpisah mencari musik dari extension.", - "upgradeIntroPlayerTitle": "Atur\nplayer-mu.", - "upgradeIntroPlayerBody": "Tema dan pilihan pemutaran bisa kamu ubah kapan saja. Berikut tempat menemukannya.", - "upgradeIntroAppearanceBody": "Ubah tema di Pengaturan → Tampilan. Di Mornye, gulir ke bawah untuk navigasi ringkas, ke atas untuk memunculkan tab lagi.", - "upgradeIntroAutoMixBody": "Cocokkan tempo dan beat antar lagu. Aktifkan di Pengaturan → Local Library → Playback. Awalnya nonaktif.", - "upgradeIntroSettingsBody": "Di Mornye, ketuk profil di Home untuk membuka Pengaturan dan mengubah nama serta foto.", + "upgradeIntroRustEngineBody": "Rust menangani download, metadata audio, pemindaian koleksi, dan runtime ekstensi di Android dan iOS.", + "upgradeIntroRustMemoryTitle": "Lebih hemat penggunaan memori", + "upgradeIntroRustMemoryBody": "Pemakaian ulang buffer dan pengurangan penyalinan data dapat mengurangi penggunaan memori saat memroses artwork dan data ekstensi.", + "upgradeIntroRustKeepTitle": "Musik Anda tetap ada", + "upgradeIntroRustKeepBody": "Tidak perlu mendownload ulang koleksi Anda. Musik tersimpan dan setelan Anda masih sama, tidak perlu penyiapan ulang.", + "upgradeIntroWelcomeBody": "Sedikit pemahaman mengenai apa yang baru, dan di mana mencarinya.", + "upgradeIntroMornyeBody": "Tampilan pemutar, lirik, dan navigasi baru Anda.", + "upgradeIntroLibrarySummary": "Telusuri musik Anda lewat playlist, artis, atau album.", + "upgradeIntroRepoSummary": "Pilih sumber musik dan provider Anda melalui ekstensi.", + "upgradeIntroLibraryTitle": "Mengenal Koleksi Anda.", + "upgradeIntroLibraryBody": "Di tampilan Mornye, telusuri dengan kategori atau cari album Anda di Baru Ditambahkan.", + "upgradeIntroDownloadsBody": "Jeda dan coba lagi dari Download di kanan atas. Lagu yang didownload akan muncul di Baru Ditambahkan.", + "upgradeIntroSearchBody": "Telusuri lagu tersimpan di sini. Tab Penelusuran kini dipisah dan ada di kanan Repo.", + "upgradeIntroPlayerTitle": "Atur\npemutar Anda.", + "upgradeIntroPlayerBody": "Anda dapat mengatur setelan tema dan pemutaran kapan saja. Atur saja di sini.", + "upgradeIntroAppearanceBody": "Atur tema lewat Setelan → Tampilan. Di Mornye, gulir bawah akan mengecilkan bilah navigasi; dan sebaliknya akan mengembalikannya.", + "upgradeIntroAutoMixBody": "Cocokkan tempo dan beat pada setiap lagu. Hidupkan di Setelan → Koleksi Lokal → Pemutaran. Defaultnya dimatikan.", + "upgradeIntroSettingsBody": "Di Mornye, ketuk foto profil di kanan atas untuk membuka Setelan dan mengedit nama dan foto profil.", "upgradeIntroSkip": "Lewati", "upgradeIntroContinue": "Lanjut", "upgradeIntroDone": "Mulai mendengarkan", - "upgradeIntroReplay": "Yang baru di 5.0", + "upgradeIntroReplay": "Yang baru di versi 5.0", "cacheMotionArtwork": "Cover bergerak offline", - "cacheMotionArtworkDesc": "Video album yang disimpan saat download. Menghapusnya tetap menyimpan file musik dan cover biasa.", + "cacheMotionArtworkDesc": "Video album yang didownload. Menghapusnya tidak akan menghapus file musik dan cover biasa.", "nowPlayingVolume": "Volume", "@nowPlayingVolume": { - "description": "Label kontrol volume sistem di pemutar Mornye" + "description": "System volume control label in the Mornye player" }, "appearanceStyle": "Gaya Aplikasi", - "appearanceAccentRed": "Merah (bawaan)", + "appearanceAccentRed": "Merah (default)", "appearanceAccentOrange": "Oranye", "appearanceAccentGreen": "Hijau", "appearanceAccentTeal": "Hijau kebiruan", @@ -115,16 +198,26 @@ "appearanceAccentPurple": "Ungu", "appearanceAccentPink": "Merah muda", "appearanceGlassClarity": "Kebeningan kaca", - "appearanceGlassClaritySubtitle": "Atur transparansi menu dan navigasi Mornye. Kontras tulisan tetap dijaga.", - "appearanceGlassTinted": "Pekat", + "appearanceGlassClaritySubtitle": "Atur kebeningan kaca menu dan navigasi Mornye. Kontras teks tetap terjaga.", + "appearanceGlassTinted": "Berwarna", "appearanceGlassClear": "Bening", - "appearanceGlassClearPerformance": "Kaca sangat bening dapat memakai lebih banyak daya dan terasa kurang lancar di perangkat lama. Kurangi kebeningan jika perlu.", - "appearanceGlassClarityBlurOff": "Kaca dibuat pekat di perangkat ini. Aktifkan “{setting}” untuk mengatur kebeningan.", - "appearanceGlassClarityHighContrast": "Kaca tetap pekat selama pengaturan kontras tinggi sistem aktif.", + "appearanceGlassClarityBlurOff": "Efek kaca mati di perangkat ini. Hidupkan \"{setting}\" untuk atur kebeningan kaca.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Efek kaca mati jika setelan kontras tinggi sistem dihidupkan.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, "appearanceUseSystemFont": "Gunakan font sistem", - "appearanceUseSystemFontSubtitle": "Gunakan jenis huruf bawaan perangkat untuk teks aplikasi.", + "appearanceUseSystemFontSubtitle": "Menggunakan font default perangkat untuk aplikasi.", "@appearanceStyle": { - "description": "Bagian tampilan untuk memilih gaya visual aplikasi" + "description": "Appearance section for choosing the app visual style" }, "@@locale": "id", "@@last_modified": "2026-04-28", @@ -185,10 +278,10 @@ "description": "Filter chip - show singles only" }, "libraryRecentlyAdded": "Baru Ditambahkan", - "libraryDownloads": "Unduhan", - "libraryNoActiveDownloads": "Tidak ada unduhan aktif", - "librarySearchHint": "Cari di koleksi musik", - "libraryEmptyCollection": "Musikmu akan muncul di sini", + "libraryDownloads": "Download", + "libraryNoActiveDownloads": "Tidak sedang download", + "librarySearchHint": "Telusuri koleksi Anda", + "libraryEmptyCollection": "Musik Anda akan muncul di sini", "historySearchHint": "Telusuri histori...", "@historySearchHint": { "description": "Search bar placeholder in history" @@ -233,7 +326,7 @@ "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, - "downloadFolderOrganization": "Organisasi Folder", + "downloadFolderOrganization": "Atur Folder", "@downloadFolderOrganization": { "description": "Title of the folder organization picker bottom sheet" }, @@ -261,7 +354,7 @@ "@appearanceDynamicColorSubtitle": { "description": "Subtitle for dynamic color" }, - "appearanceHistoryView": "Tampilan Histori", + "appearanceHistoryView": "Tampilan Koleksi", "@appearanceHistoryView": { "description": "Layout style for history" }, @@ -310,7 +403,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Simpan lirik berjalan dalam file lagu yang terdownload", + "optionsEmbedLyricsSubtitle": "Simpan lirik berjalan dalam file lagu yang didownload", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -342,6 +435,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Hapus ReplayGain", + "trackRemoveReplayGainSuccess": "Tag ReplayGain dihapus", + "trackRemoveReplayGainFailed": "Gagal menghapus tag ReplayGain", + "replayGainRemoving": "Menghapus ReplayGain...", + "replayGainRemoveConfirmMessage": "Hapus tag ReplayGain dari {count} lagu? Audio, cover, dan metadata lain akan tetap disimpan.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Hapus RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain dihapus pada {success} dari {total} lagu", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -355,7 +480,7 @@ "@replayGainBatchConfirmTitle": { "description": "Title of the batch ReplayGain confirmation dialog" }, - "replayGainBatchConfirmMessage": "Analisis kenyaringan dan tulis tag ReplayGain ke {count} trek?", + "replayGainBatchConfirmMessage": "Analisis kenyaringan dan tambah tag ReplayGain ke {count} lagu?", "@replayGainBatchConfirmMessage": { "description": "Message of the batch ReplayGain confirmation dialog", "placeholders": { @@ -368,8 +493,8 @@ "@replayGainBatchAnalyzing": { "description": "Progress dialog title while batch scanning ReplayGain" }, - "replayGainBatchSuccess": "ReplayGain ditambahkan ke {success} dari {total} trek", - "replayGainUnsupportedDecoder": "Sebagian trek tidak dapat dianalisis karena codec audionya belum didukung decoder ReplayGain. File trek tersebut tidak diubah.", + "replayGainBatchSuccess": "ReplayGain ditambah ke {success} dari {total} lagu", + "replayGainUnsupportedDecoder": "Beberapa lagu tidak dapat dianalisis karena decoder ReplayGain tidak mendukung codec audio-nya. File tidak diubah.", "@replayGainBatchSuccess": { "description": "Snackbar after batch ReplayGain completes", "placeholders": { @@ -393,7 +518,7 @@ "@optionsArtistTagModeJoined": { "description": "Artist tag mode option that joins multiple artists into one value" }, - "optionsArtistTagModeJoinedSubtitle": "Tulis semua ARTIS dalam satu tag \"Artis A, Artis B\", mendukung lebih banyak pemutar,", + "optionsArtistTagModeJoinedSubtitle": "Tulis semua ARTIS dalam satu tag \"Artis A, Artis B\", mendukung lebih banyak pemutar.", "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, @@ -406,8 +531,14 @@ "description": "Subtitle for split Vorbis artist tag mode" }, "optionsArtistTagModePrimary": "Artis utama saja", - "optionsArtistTagModePrimarySubtitle": "Tulis hanya artis pertama, seperti \"Artis A\", ke Artis dan Artis Album di semua format, agar pemutar menampilkan satu artis.", - "optionsExtensionStore": "Repo Ekstensi", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Hanya cantumkan artis utama, seperti \"Artis A\", pada Artis dan Artis Album di semua format, jadi pemutar hanya memunculkan satu artis.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, + "optionsExtensionStore": "Repo", "@optionsExtensionStore": { "description": "Show/hide repo tab" }, @@ -480,7 +611,7 @@ "@extensionsUninstall": { "description": "Uninstall extension button" }, - "storeTitle": "Repo Ekstensi", + "storeTitle": "Repo", "@storeTitle": { "description": "Repo screen title" }, @@ -512,7 +643,7 @@ "@aboutMobileDeveloper": { "description": "Role description for mobile dev" }, - "aboutOriginalCreator": "Pencipta SpotiFLAC asli", + "aboutOriginalCreator": "Pembuat SpotiFLAC asli", "@aboutOriginalCreator": { "description": "Role description for original creator" }, @@ -600,7 +731,7 @@ "@aboutUnituneDesc": { "description": "Credit for the UniTune resolver" }, - "aboutMusicBrainzDesc": "Database musik terbuka dimaintain oleh MetaBrainz dan komunitasnya, untuk merekam cross-reference.", + "aboutMusicBrainzDesc": "Database musik terbuka yang dirawat oleh MetaBrainz dan komunitasnya, untuk merekam cross-reference.", "@aboutMusicBrainzDesc": { "description": "Credit for the MusicBrainz database" }, @@ -666,7 +797,7 @@ "@setupStorageAccessRequired": { "description": "Title when storage access needed" }, - "setupStorageAccessMessageAndroid11": "Android 11+ memerlukan izin \"Akses semua file\" untuk menyimpan file ke folder unduhan pilihan Anda.", + "setupStorageAccessMessageAndroid11": "Android 11+ butuh izin \"Akses semua file\" untuk menyimpan file ke folder download pilihan Anda.", "@setupStorageAccessMessageAndroid11": { "description": "Android 11+ specific explanation" }, @@ -688,7 +819,7 @@ } } }, - "setupPermissionRequiredMessage": "Izin {permissionType} diperlukan untuk pengalaman terbaik. Anda dapat mengubahnya nanti di Pengaturan.", + "setupPermissionRequiredMessage": "Izin {permissionType} diperlukan untuk pengalaman terbaik. Anda dapat mengubahnya nanti di Setelan.", "@setupPermissionRequiredMessage": { "description": "Generic permission required message", "placeholders": { @@ -713,7 +844,7 @@ "@setupDownloadLocationTitle": { "description": "Download location dialog title" }, - "setupDownloadLocationIosMessage": "Di iOS, unduhan disimpan ke folder Documents aplikasi. Anda dapat mengaksesnya melalui aplikasi Files.", + "setupDownloadLocationIosMessage": "Di iOS, download disimpan ke folder Documents aplikasi. Anda dapat mengaksesnya melalui aplikasi Files.", "@setupDownloadLocationIosMessage": { "description": "iOS-specific folder info" }, @@ -721,7 +852,7 @@ "@setupAppDocumentsFolder": { "description": "iOS documents folder option" }, - "setupAppDocumentsFolderSubtitle": "Direkomendasikan - dapat diakses via aplikasi Files", + "setupAppDocumentsFolderSubtitle": "Disarankan - dapat diakses via aplikasi Files", "@setupAppDocumentsFolderSubtitle": { "description": "Subtitle for documents folder" }, @@ -753,7 +884,7 @@ "@setupStorageRequired": { "description": "Title when storage permission needed" }, - "setupStorageDescription": "SpotiFLAC perlu akses penyimpanan untuk menyimpan file musik terdownload.", + "setupStorageDescription": "SpotiFLAC butuh akses penyimpanan untuk menyimpan hasil download Anda.", "@setupStorageDescription": { "description": "Explanation for storage permission" }, @@ -769,7 +900,7 @@ "@setupFolderChoose": { "description": "Button to choose folder" }, - "setupFolderDescription": "Pilih folder untuk menyimpan musik terdownload.", + "setupFolderDescription": "Pilih folder untuk menyimpan hasil download Anda.", "@setupFolderDescription": { "description": "Explanation for folder selection" }, @@ -785,7 +916,7 @@ "@setupNotificationBackgroundDescription": { "description": "Detailed notification explanation" }, - "setupSkipForNow": "Lewati untuk sekarang", + "setupSkipForNow": "Lewati saja", "@setupSkipForNow": { "description": "Skip button text" }, @@ -849,7 +980,7 @@ "@previewPlay": { "description": "Tooltip for the button that plays a short track preview snippet" }, - "previewStop": "Hentikan Preview", + "previewStop": "Hentikan preview", "@previewStop": { "description": "Tooltip for the button that stops the playing track preview snippet" }, @@ -902,7 +1033,7 @@ } } }, - "dialogClearHistoryTitle": "Hapus Riwayat", + "dialogClearHistoryTitle": "Hapus Histori", "@dialogClearHistoryTitle": { "description": "Dialog title - clear download history" }, @@ -953,7 +1084,7 @@ } } }, - "collectionExportM3uNone": "Tidak ada file terdownload untuk diekspor", + "collectionExportM3uNone": "Tidak ada hasil download untuk diekspor", "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, @@ -973,7 +1104,7 @@ "@libraryReviewDuplicates": { "description": "Library settings row opening the duplicate review sheet" }, - "libraryReviewDuplicatesSubtitle": "Telusuri lagu yang disimpan lebih dari sekali", + "libraryReviewDuplicatesSubtitle": "Tinjau file lagu ganda di perangkat", "@libraryReviewDuplicatesSubtitle": { "description": "Subtitle for the duplicate review settings row" }, @@ -985,15 +1116,15 @@ "@duplicatesEmpty": { "description": "Shown when the duplicate review sheet finds nothing" }, - "duplicatesKeepBest": "Simpan lagu kualitas terbaik", + "duplicatesKeepBest": "Simpan kualitas terbaik", "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, - "duplicatesKeepBestAll": "Simpan yang terbaik untuk semua", + "duplicatesKeepBestAll": "Simpan semua kualitas terbaik", "@duplicatesKeepBestAll": { "description": "Button that keeps the highest-quality copy in every duplicate group and deletes the rest" }, - "duplicatesKeepBestAllMessage": "Simpan salinan terbaik dari {groupCount} lagu dan hapus {count} salinan berkualitas lebih rendah?\n\nFile yang dihapus juga akan dihapus dari penyimpanan.", + "duplicatesKeepBestAllMessage": "Simpan kualitas terbaik dari {groupCount} {groupCount, plural, =1{lagu} other{lagu}} dan hapus {count} kualitas terendah dari {count, plural, =1{lagu} other{lagu}}?\n\nFile terhapus akan dihapus dari penyimpanan.", "@duplicatesKeepBestAllMessage": { "description": "Confirmation message for keeping the best copy across every duplicate group", "placeholders": { @@ -1052,7 +1183,7 @@ } } }, - "snackbarAlreadyDownloaded": "\"{trackName}\" sudah terdownload", + "snackbarAlreadyDownloaded": "\"{trackName}\" sudah didownload", "@snackbarAlreadyDownloaded": { "description": "Snackbar - track already exists", "placeholders": { @@ -1131,7 +1262,7 @@ } } }, - "snackbarExtensionUpdated": "{extensionName} terupdate.", + "snackbarExtensionUpdated": "{extensionName} diupdate.", "@snackbarExtensionUpdated": { "description": "Snackbar - extension updated successfully", "placeholders": { @@ -1334,7 +1465,7 @@ "@folderOrganizationByArtistAlbum": { "description": "Folder option - nested folders" }, - "folderOrganizationDescription": "Atur file terdownload ke dalam folder", + "folderOrganizationDescription": "Atur hasil download ke dalam folder", "@folderOrganizationDescription": { "description": "Folder organization sheet description" }, @@ -1362,7 +1493,7 @@ "@updateLater": { "description": "Update button - dismiss" }, - "updateStartingDownload": "Download dimulai...", + "updateStartingDownload": "Memulai download...", "@updateStartingDownload": { "description": "Update status - initializing" }, @@ -1403,7 +1534,7 @@ "@updateDownloading": { "description": "Update status - downloading" }, - "updateWhatsNew": "Yang baru", + "updateWhatsNew": "Yang Baru", "@updateWhatsNew": { "description": "Changelog section title" }, @@ -1411,7 +1542,7 @@ "@updateDownloadInstall": { "description": "Update button - download and install" }, - "updateDontRemind": "Jangan ingatkan", + "updateDontRemind": "Tidak usah", "@updateDontRemind": { "description": "Update button - skip this version" }, @@ -1427,11 +1558,11 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsDescription": "Pilih ekstensi download terinstal yang digunakan selama fallback otomatis.", + "providerPriorityFallbackExtensionsDescription": "Pilih ekstensi download terinstal yang akan digunakan sebagai cadangan.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, - "providerPriorityFallbackExtensionsHint": "Hanya ekstensi dengan provider download yang sudah aktif yang ada di sini.", + "providerPriorityFallbackExtensionsHint": "Hanya ekstensi dengan provider download aktif yang ada di sini.", "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, @@ -1447,7 +1578,7 @@ "@metadataProviderPriorityDescription": { "description": "Metadata priority page description" }, - "metadataProviderPriorityInfo": "Deezer tidak ada rate limit dan direkomendasikan jadi utama. Spotify mungkin ada bila banyak permintaan.", + "metadataProviderPriorityInfo": "Deezer tidak punya pembatasan dan disarankan jadi utama. Spotify mungkin ada bila banyak permintaan.", "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, @@ -1565,8 +1696,8 @@ "@sectionLyrics": { "description": "Settings section header" }, - "lyricsKeepScreenOn": "Layar tetap menyala saat melihat lirik", - "lyricsKeepScreenOnSubtitle": "Cegah layar mati otomatis selama lirik terbuka, termasuk saat lagu dijeda.", + "lyricsKeepScreenOn": "Cegah layar mati saat melihat lirik", + "lyricsKeepScreenOnSubtitle": "Mencegah layar mati saat sedang membuka layar lirik, berlaku saat pemutaran dijeda.", "lyricsMode": "Mode Lirik", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -1729,19 +1860,19 @@ "@trackAudioQuality": { "description": "Metadata label - audio quality" }, - "trackReplayGainTrackGain": "ReplayGain Track Gain", + "trackReplayGainTrackGain": "ReplayGain Gain Lagu", "@trackReplayGainTrackGain": { "description": "Metadata label - ReplayGain track gain" }, - "trackReplayGainTrackPeak": "ReplayGain Track Peak", + "trackReplayGainTrackPeak": "ReplayGain Peak Lagu", "@trackReplayGainTrackPeak": { "description": "Metadata label - ReplayGain track peak" }, - "trackReplayGainAlbumGain": "ReplayGain Album Gain", + "trackReplayGainAlbumGain": "ReplayGain Gain Album", "@trackReplayGainAlbumGain": { "description": "Metadata label - ReplayGain album gain" }, - "trackReplayGainAlbumPeak": "ReplayGain Album Peak", + "trackReplayGainAlbumPeak": "ReplayGain Peak Album", "@trackReplayGainAlbumPeak": { "description": "Metadata label - ReplayGain album peak" }, @@ -1765,7 +1896,7 @@ "@trackCopyright": { "description": "Metadata label - copyright information" }, - "trackDownloaded": "Terdownload", + "trackDownloaded": "Didownload", "@trackDownloaded": { "description": "Metadata label - download date" }, @@ -1969,7 +2100,7 @@ "@extensionQualityOptions": { "description": "Capability - quality selection" }, - "extensionPostProcessingHooks": "Hook Post-Processing", + "extensionPostProcessingHooks": "Hook Pasca-Pemrosesan", "@extensionPostProcessingHooks": { "description": "Capability - post-processing" }, @@ -1985,7 +2116,7 @@ "@extensionRemoveButton": { "description": "Button to uninstall extension" }, - "extensionUpdated": "Terupdate", + "extensionUpdated": "Diupdate", "@extensionUpdated": { "description": "Extension detail - last update" }, @@ -1997,7 +2128,7 @@ "@extensionCustomTrackMatching": { "description": "Capability - custom track matching algorithm" }, - "extensionPostProcessing": "Post-Processing", + "extensionPostProcessing": "Pasca-Pemrosesan", "@extensionPostProcessing": { "description": "Capability - post-download processing" }, @@ -2164,7 +2295,7 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, - "downloadAutoConvert": "Ubah format setelah terdownload", + "downloadAutoConvert": "Ubah format setelah download", "@downloadAutoConvert": { "description": "Toggle for automatic post-download audio conversion" }, @@ -2184,7 +2315,7 @@ "@downloadAutoConvertBitrate": { "description": "Automatic conversion bitrate setting" }, - "downloadAutoConvertBitrateSubtitle": "Bitrate yang tinggi menjaga banyak detail tapi ukuran file akan besar", + "downloadAutoConvertBitrateSubtitle": "Bitrate yang tinggi menjaga banyak detail tapi ukuran file akan besar.", "@downloadAutoConvertBitrateSubtitle": { "description": "Automatic conversion bitrate picker explanation" }, @@ -2212,7 +2343,7 @@ "@downloadLossyMp3": { "description": "Lossy format option - MP3 320kbps" }, - "downloadLossyMp3Subtitle": "Putar di mana saja, ~10MB per trek", + "downloadLossyMp3Subtitle": "Putar di mana saja, ~10MB per lagu", "@downloadLossyMp3Subtitle": { "description": "Subtitle for MP3 320kbps lossy option" }, @@ -2344,7 +2475,7 @@ "@settingsConcurrentDownloads": { "description": "Setting title - how many tracks download at the same time" }, - "settingsConcurrentDownloadsSubtitle": "Mendownload beberapa lagu sekaligus lebih cepat, tetapi beberapa penyedia mungkin membatasi permintaan paralel.", + "settingsConcurrentDownloadsSubtitle": "Mendownload banyak lagu sekaligus lebih cepat, tapi provider mungkin membatasi permintaan paralel.", "@settingsConcurrentDownloadsSubtitle": { "description": "Subtitle explaining the concurrent downloads picker" }, @@ -2594,7 +2725,7 @@ } } }, - "discographySkippedDownloaded": "{added} ditambahkan, {skipped} terdownload", + "discographySkippedDownloaded": "{added} ditambahkan, {skipped} didownload", "@discographySkippedDownloaded": { "description": "Snackbar - with skipped tracks count", "placeholders": { @@ -2737,11 +2868,11 @@ "@libraryShowDuplicateIndicatorSubtitle": { "description": "Subtitle for duplicate indicator toggle" }, - "libraryAutoScan": "Pindai Oto", + "libraryAutoScan": "Pindai Otomatis", "@libraryAutoScan": { "description": "Setting for automatic library scanning" }, - "libraryAutoScanSubtitle": "Otomatis memindai pustaka Anda", + "libraryAutoScanSubtitle": "Otomatis memindai file baru di koleksi Anda", "@libraryAutoScanSubtitle": { "description": "Subtitle for auto scan setting" }, @@ -2805,7 +2936,7 @@ "@libraryAbout": { "description": "Section header for about info" }, - "libraryAboutDescription": "Memindai koleksi musik yang sudah ada untuk mendeteksi duplikat saat mengunduh. Mendukung format FLAC, ALAC, M4A, MP3, Opus, OGG, WAV, AIFF, dan APE. Metadata dibaca dari tag file jika tersedia.", + "libraryAboutDescription": "Memindai koleksi musik yang sudah ada untuk mendeteksi duplikat saat mendownload. Mendukung format FLAC, ALAC, M4A, MP3, Opus, OGG, WAV, AIFF, dan APE. Metadata dibaca dari tag file jika tersedia.", "@libraryAboutDescription": { "description": "Description of local library feature" }, @@ -2848,7 +2979,7 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, - "libraryScanPaused": "Pindai dijeda", + "libraryScanPaused": "Pindai terjeda", "@libraryScanPaused": { "description": "Status shown while a library scan is paused by the user" }, @@ -2893,7 +3024,7 @@ "@libraryFolderNotExist": { "description": "Error when folder doesn't exist" }, - "librarySourceDownloaded": "Terdownload", + "librarySourceDownloaded": "Didownload", "@librarySourceDownloaded": { "description": "Badge for tracks downloaded via SpotiFLAC" }, @@ -2905,7 +3036,7 @@ "@libraryFilterAll": { "description": "Filter chip - show all library items" }, - "libraryFilterDownloaded": "Terdownload", + "libraryFilterDownloaded": "Didownload", "@libraryFilterDownloaded": { "description": "Filter chip - show only downloaded items" }, @@ -3051,7 +3182,7 @@ "@tutorialSearchDesc": { "description": "Tutorial search page description" }, - "tutorialDownloadTitle": "Mengunduh Musik", + "tutorialDownloadTitle": "Mendownload Musik", "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, @@ -3063,7 +3194,7 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "Musik yang terdownload dan terpindai akan muncul di Koleksi Anda.", + "tutorialLibraryDesc": "Hasil download dan musik terpindai akan muncul di Koleksi Anda.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, @@ -3071,7 +3202,7 @@ "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Ketuk lagu untuk memutarnya dengan pemutar bawaan", + "tutorialLibraryTip2": "Ketuk lagu untuk memutarnya dengan pemutar built-in", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, @@ -3087,7 +3218,7 @@ "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, - "tutorialExtensionsTip1": "Jelajahi menu Repositori untuk menemukan berbagai ekstensi.", + "tutorialExtensionsTip1": "Jelajahi menu Repo untuk menemukan berbagai ekstensi.", "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, @@ -3160,11 +3291,11 @@ "@cacheSummaryTitle": { "description": "Heading for cache summary card" }, - "cacheSummarySubtitle": "Membersihkan cache tidak menghapus file terdownload.", + "cacheSummarySubtitle": "Membersihkan cache tidak menghapus hasil download.", "@cacheSummarySubtitle": { "description": "Helper text for cache summary card" }, - "cacheEstimatedTotal": "Total cache yang digunakan:", + "cacheEstimatedTotal": "Total cache yang digunakan: {size}", "@cacheEstimatedTotal": { "description": "Total cache size shown in summary", "placeholders": { @@ -3201,7 +3332,7 @@ "@cacheCoverImage": { "description": "Cache item title for persistent cover images" }, - "cacheCoverImageDesc": "Foto cover album dan lagu yang terdownload. Akan didownload ulang bila dilihat. ", + "cacheCoverImageDesc": "Foto cover album dan lagu yang didownload. Akan didownload ulang bila dilihat.", "@cacheCoverImageDesc": { "description": "Description of what cover image cache contains" }, @@ -3245,7 +3376,7 @@ "@cacheTrackLookupDesc": { "description": "Description of what track lookup cache contains" }, - "cacheCleanupUnusedDesc": "Menghapus sisa-sisa histori download dan file hilang di koleksi", + "cacheCleanupUnusedDesc": "Menghapus sisa-sisa histori download dan file hilang di koleksi.", "@cacheCleanupUnusedDesc": { "description": "Description of what cleanup unused data does" }, @@ -3296,7 +3427,7 @@ "@cacheClearConfirmTitle": { "description": "Dialog title before clearing one cache category" }, - "cacheClearConfirmMessage": "Akan menghapus cache {target}. File musik terdownload tidak akan dihapus.", + "cacheClearConfirmMessage": "Akan menghapus cache {target}. Hasil download tidak akan dihapus.", "@cacheClearConfirmMessage": { "description": "Dialog message before clearing selected cache", "placeholders": { @@ -3309,7 +3440,7 @@ "@cacheClearAllConfirmTitle": { "description": "Dialog title before clearing all caches" }, - "cacheClearAllConfirmMessage": "Akan menghapus semua jenis cache. File musik terdownload tidak akan dihapus.", + "cacheClearAllConfirmMessage": "Tindakan ini akan menghapus seluruh cache aplikasi yang ada. Hasil download tidak akan dihapus.", "@cacheClearAllConfirmMessage": { "description": "Dialog message before clearing all caches" }, @@ -3361,7 +3492,7 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichBatchSubtitle": "Pilih pembaruan online atau manual, lalu tinjau setiap perubahan sebelum ditulis", + "trackReEnrichBatchSubtitle": "Pilih update online atau offline, lalu tinjau setiap perubahan sebelum diubah", "@trackReEnrichBatchSubtitle": { "description": "Subtitle for batch metadata update choices" }, @@ -3417,19 +3548,19 @@ "@trackReEnrichModeReplaceSubtitle": { "description": "Explanation for the selected-tag batch metadata mode" }, - "trackReEnrichModeManual": "Tetapkan nilai yang sama", + "trackReEnrichModeManual": "Pilih tag yang umum", "@trackReEnrichModeManual": { "description": "Batch metadata mode that applies shared values to every selected track" }, - "trackReEnrichModeManualSubtitle": "Terapkan nilai yang sama ke setiap lagu yang dipilih", + "trackReEnrichModeManualSubtitle": "Gunakan tag yang sama untuk lagu terpilih", "@trackReEnrichModeManualSubtitle": { "description": "Explanation for the manual shared-value batch metadata mode" }, - "trackReEnrichManualFieldsTitle": "Nilai yang akan diterapkan", + "trackReEnrichManualFieldsTitle": "Tag untuk diterapkan", "@trackReEnrichManualFieldsTitle": { "description": "Heading above manual batch metadata inputs" }, - "trackReEnrichManualHint": "Biarkan kolom kosong untuk mempertahankan nilai saat ini. Judul, nomor lagu, dan ISRC tidak akan diubah.", + "trackReEnrichManualHint": "Biarkan kosong jika tidak ingin mengubahnya. Judul lagu, nomor, dan ISRC tidak akan diubah.", "@trackReEnrichManualHint": { "description": "Safety explanation for manual batch metadata inputs" }, @@ -3509,9 +3640,9 @@ }, "trackReEnrichSuccess": "Metadata berhasil diupdate", "trackReEnrichMetadataSaved": "Metadata disimpan", - "trackReEnrichLyricsUpdated": "Lirik diperbarui", - "trackReEnrichLyricsPreserved": "Lirik baru tidak ditemukan; lirik lama dipertahankan", - "trackReEnrichLyricsDisabled": "Lirik tidak diperbarui: unduhan lirik dinonaktifkan di Pengaturan", + "trackReEnrichLyricsUpdated": "Lirik diupdate", + "trackReEnrichLyricsPreserved": "Tidak menemukan lirik baru; lirik tidak diubah", + "trackReEnrichLyricsDisabled": "Lirik tidak diupdate, download lirik dimatikan di Setelan", "@trackReEnrichSuccess": { "description": "Snackbar after successful re-enrichment" }, @@ -3943,7 +4074,7 @@ "@collectionPlaylistRemoveCover": { "description": "Bottom sheet action to remove custom cover image from a playlist" }, - "selectionShareCount": "Bagikan {count}{count, plural,=1{lagu} other{ lagu}}", + "selectionShareCount": "Bagikan {count} {count, plural, =1{lagu} other{lagu}}", "@selectionShareCount": { "description": "Share button text with count in selection mode", "placeholders": { @@ -3956,7 +4087,7 @@ "@selectionShareNoFiles": { "description": "Snackbar when no selected files exist on disk" }, - "selectionConvertCount": "Ubah format {count}{count, plural,=1{lagu}other{ lagu}}", + "selectionConvertCount": "Ubah format {count} {count, plural, =1{lagu} other{lagu}}", "@selectionConvertCount": { "description": "Convert button text with count in selection mode", "placeholders": { @@ -3973,7 +4104,7 @@ "@selectionBatchConvertConfirmTitle": { "description": "Confirmation dialog title for batch conversion" }, - "selectionBatchConvertConfirmMessage": "Ubah format {count}{count, plural,=1{lagu}other{ lagu}} ke format {format} dengan bitrate {bitrate}?\n\nFile asli akan dihapus setelah perubahan.", + "selectionBatchConvertConfirmMessage": "Ubah format {count} {count, plural, =1{lagu} other{lagu}} ke {format} dengan {bitrate}?\n\nFile asli akan dihapus setelah perubahan.", "@selectionBatchConvertConfirmMessage": { "description": "Confirmation dialog message for batch conversion", "placeholders": { @@ -3988,7 +4119,7 @@ } } }, - "selectionBatchConvertConfirmMessageLossless": "Ubah format {count}{count, plural,=1{lagu}other{ lagu}} ke format {format} dengan kualitas loseless?\n\nFile asli akan dihapus setelah perubahan.", + "selectionBatchConvertConfirmMessageLossless": "Ubah format {count} {count, plural, =1{lagu} other{lagu}} ke {format}? (Lossless — kualitas dipertahankan)\n\nFile asli akan dihapus setelah perubahan.", "@selectionBatchConvertConfirmMessageLossless": { "description": "Confirmation dialog message for lossless batch conversion", "placeholders": { @@ -4000,7 +4131,7 @@ } } }, - "selectionBatchConvertConfirmKeepOriginal": "Ubah format {count} {count, plural, =1{lagu} other{lagu}} ke format {format}?\n\nFile asli akan disimpan dan file format baru akan ditambah ke koleksi baru.", + "selectionBatchConvertConfirmKeepOriginal": "Ubah format {count} {count, plural, =1{lagu} other{lagu}} ke {format}?\n\nFile asli akan disimpan dan file format baru akan ditambah ke koleksi baru.", "@selectionBatchConvertConfirmKeepOriginal": { "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { @@ -4012,7 +4143,7 @@ } } }, - "selectionBatchConvertSuccess": "Berhasil mengubah format {success} dari {total} lagu ke format {format}", + "selectionBatchConvertSuccess": "Berhasil mengubah format {success} dari {total} lagu ke {format}", "@selectionBatchConvertSuccess": { "description": "Snackbar after batch conversion completes", "placeholders": { @@ -4027,7 +4158,7 @@ } } }, - "downloadedAlbumDownloadedCount": "{count} terdownload", + "downloadedAlbumDownloadedCount": "{count} didownload", "@downloadedAlbumDownloadedCount": { "description": "Downloaded tracks count badge", "placeholders": { @@ -4126,7 +4257,7 @@ "@safMigrationMessage2": { "description": "Second paragraph of SAF migration dialog" }, - "safMigrationSuccess": "Folder download terupdate ke mode SAF", + "safMigrationSuccess": "Folder download diupdate ke mode SAF", "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, @@ -4214,14 +4345,14 @@ "@backupContentsTitle": { "description": "Header above the list summarizing what the backup contains" }, - "backupSettingsOnly": "Pengaturan saja", - "backupSelectHistory": "Riwayat download", - "backupSelectCollections": "Koleksi library", - "backupSelectCollectionsDescription": "Lagu disukai, wishlist, artis favorit, playlist, dan sampul playlist.", - "backupSelectExtensions": "Ekstensi dan pengaturannya", - "backupSelectedExportDescription": "Simpan kategori yang dipilih ke file backup. File audio tidak disertakan.", - "backupSelectAtLeastOne": "Pilih minimal satu kategori untuk membuat backup.", - "backupSelectedRestoreMessage": "Hanya kategori di bawah yang akan dipulihkan. Kategori yang tidak disertakan dalam backup ini tidak akan berubah. Pemulihan dapat mengganti data yang ada dan tidak dapat dibatalkan.", + "backupSettingsOnly": "Setelan saja", + "backupSelectHistory": "Histori download", + "backupSelectCollections": "Koleksi saya", + "backupSelectCollectionsDescription": "Lagu, wishlist, artis favorit, playlist, dan cover playlist yang disukai.", + "backupSelectExtensions": "Ekstensi dan setelannya", + "backupSelectedExportDescription": "Buat file cadangan dari kategori terpilih. Tidak termasuk file audio.", + "backupSelectAtLeastOne": "Pilih setidaknya satu kategori untuk dicadangkan.", + "backupSelectedRestoreMessage": "Hanya kategori di bawah yang akan dipulihkan. Yang tidak ada di daftar tidak akan diubah. Pemulihan akan mengganti data yang sudah ada dan tidak dapat diurungkan.", "backupContentsSettings": "Setelan aplikasi", "@backupContentsSettings": { "description": "Backup contents row label for settings" @@ -4336,7 +4467,7 @@ } } }, - "homeSkipAlreadyDownloaded": "Lewati lagu terdownload", + "homeSkipAlreadyDownloaded": "Lewati yang sudah didownload", "@homeSkipAlreadyDownloaded": { "description": "Checkbox label in import dialog to skip already-downloaded songs" }, @@ -4381,15 +4512,15 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Pilih lokasi penyimpanan lagu terdownload", + "downloadLocationSubtitle": "Pilih lokasi penyimpanan hasil download", "@downloadLocationSubtitle": { "description": "Subtitle shown in the download location picker sheet" }, - "storageAutomaticFolder": "Folder otomatis", - "storageAutomaticDownloadFolder": "Menggunakan Download/SpotiFLAC jika dapat ditulis, atau penyimpanan aplikasi", + "storageAutomaticFolder": "Folder bawaan", + "storageAutomaticDownloadFolder": "Menyimpan di folder Download/SpotiFLAC, atau di data aplikasi", "storageSafRecommended": "Pilih folder (Disarankan)", - "storageDownloadFolderHint": "Di pemilih folder Android, buka Download dan pilih SpotiFLAC. Jika belum ada, buat melalui Folder baru, lalu ketuk Gunakan folder ini untuk memberikan akses.", - "storageModeAppFolder": "Folder Aplikasi (Direkomendasikan)", + "storageDownloadFolderHint": "Begitu pemilih folder Android terbuka, buka folder Download dan pilih SpotiFLAC. Jika belum ada, buat folder baru, lalu ketuk Gunakan folder ini untuk memberi akses.", + "storageModeAppFolder": "Folder Aplikasi (Disarankan)", "@storageModeAppFolder": { "description": "Storage mode option - app-managed folder" }, @@ -4437,7 +4568,7 @@ "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is on" }, - "downloadSeparateSinglesDisabled": "Single dan EP disimpan di folder yang sama", + "downloadSeparateSinglesDisabled": "Single dan album disimpan di folder yang sama", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is off" }, @@ -4501,7 +4632,7 @@ "@downloadNeteaseIncludeTranslation": { "description": "Setting to include translated lyrics from Netease" }, - "downloadNeteaseIncludeTranslationEnabled": "Lirik terjemahan tionghoa dimasukkan", + "downloadNeteaseIncludeTranslationEnabled": "Lirik terjemahan Tionghoa dimasukkan", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is on" }, @@ -4549,7 +4680,7 @@ "@downloadMusixmatchLanguage": { "description": "Setting for Musixmatch lyrics translation language" }, - "downloadMusixmatchLanguageAuto": "Oto (bahasa aasli)", + "downloadMusixmatchLanguageAuto": "Otomatis (bahasa asli)", "@downloadMusixmatchLanguageAuto": { "description": "Subtitle when no language is set" }, @@ -4581,7 +4712,7 @@ "@downloadMusixmatchLanguageDesc": { "description": "Description in Musixmatch language picker" }, - "downloadMusixmatchAuto": "Oto", + "downloadMusixmatchAuto": "Otomatis", "@downloadMusixmatchAuto": { "description": "Button to clear Musixmatch language (use auto)" }, @@ -4601,7 +4732,7 @@ "@snackbarUnsupportedAudioFormat": { "description": "Snackbar when the audio format is not supported for the requested operation" }, - "cacheRefresh": "Refresh", + "cacheRefresh": "Muat Ulang", "@cacheRefresh": { "description": "Tooltip for refresh button on cache management page" }, @@ -4782,7 +4913,7 @@ } } }, - "queueFilteringIndicator": "Menyaring...", + "queueFilteringIndicator": "Memfilter...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" }, @@ -4804,7 +4935,7 @@ } } }, - "queueEmptyAlbums": "Tidak ada album terdownload", + "queueEmptyAlbums": "Tidak ada hasil download album", "@queueEmptyAlbums": { "description": "Empty state title when no album downloads exist" }, @@ -4812,11 +4943,11 @@ "@queueEmptyAlbumsSubtitle": { "description": "Empty state subtitle for album downloads" }, - "queueEmptySingles": "Tidak ada single terdownload", + "queueEmptySingles": "Tidak ada hasil download single", "@queueEmptySingles": { "description": "Empty state title when no single track downloads exist" }, - "queueEmptySinglesSubtitle": "Lagu single terdownload akan muncul di sini", + "queueEmptySinglesSubtitle": "Hasil download single akan muncul di sini", "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, @@ -4845,7 +4976,7 @@ "@queueEmptyHistory": { "description": "Empty state title when download history is empty" }, - "queueEmptyHistorySubtitle": "Lagu yang terdownload akan muncul di sini", + "queueEmptyHistorySubtitle": "Hasil download lagu akan muncul di sini", "@queueEmptyHistorySubtitle": { "description": "Empty state subtitle for download history" }, @@ -4957,39 +5088,39 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "downloadRedownloadFakeHiRes": "Re-download fake Hi-Res", + "downloadRedownloadFakeHiRes": "Download ulang Hi-Res palsu", "@downloadRedownloadFakeHiRes": { "description": "Setting title: automatically replace downloads that measure as fake Hi-Res" }, - "downloadRedownloadFakeHiResSubtitle": "Off by default. Check Hi-Res downloads and replace only when every audio sample is preserved. Keep the original if verification or processing fails", + "downloadRedownloadFakeHiResSubtitle": "Dimatikan secara default. Memeriksa download Hi-Res dan menggantinya bila terdeteksi bukan kualitas Hi-Res. Tidak menghapus lagu bila verifikasi atau pemrosesan gagal", "@downloadRedownloadFakeHiResSubtitle": { "description": "Setting subtitle for the fake Hi-Res re-download toggle" }, - "hiResCheckVerdictFakeCertain": "Fake Hi-Res", + "hiResCheckVerdictFakeCertain": "Hi-Res Palsu", "@hiResCheckVerdictFakeCertain": { "description": "Verdict: an exact fingerprint (padded bits or upsampling pattern) proves the file is not real Hi-Res" }, - "hiResCheckVerdictFakeSuspect": "Possibly a filtered master", + "hiResCheckVerdictFakeSuspect": "Kemungkinan low-passnya difilter", "@hiResCheckVerdictFakeSuspect": { "description": "Verdict: fails the cutoff test but may be a genuine master low-pass filtered in mastering" }, - "hiResCheckReasonSampleHold": "Every sample is repeated: upsampled by duplication", + "hiResCheckReasonSampleHold": "Data suara terulang: diupsample dengan menggandakan data", "@hiResCheckReasonSampleHold": { "description": "Reason: sample-and-hold upsampling detected" }, - "hiResCheckReasonInterpolation": "In-between samples are linearly interpolated", + "hiResCheckReasonInterpolation": "Data antar suara diinterpolasi secara linear", "@hiResCheckReasonInterpolation": { "description": "Reason: linear-interpolation upsampling detected" }, - "hiResCheckReasonImaging": "Content above 22 kHz mirrors the audible band", + "hiResCheckReasonImaging": "Data suara di atas 22 kHz menjiplak data yang ada", "@hiResCheckReasonImaging": { "description": "Reason: spectral imaging from upsampling detected" }, - "hiResCheckMusicContent": "Musical content", + "hiResCheckMusicContent": "Konten musikal", "@hiResCheckMusicContent": { "description": "Label for the highest frequency that still moves with the music" }, - "hiResCheckUltrasonicNoise": "Above {cutoff} only steady noise (typical of DSD or analog tape transfers): a {rate} file would hold all the music", + "hiResCheckUltrasonicNoise": "Di atas {cutoff} hanya ada desis statis (mirip hasil rekam ulang kaset DSD/analog): file {rate} itu sudah cukup", "@hiResCheckUltrasonicNoise": { "description": "Shown when the ultrasonic content of a Hi-Res file is noise rather than music", "placeholders": { @@ -5005,7 +5136,62 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, - "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", + "hiResCheckSummary": "Periksa spektrum dan bit depth aktif untuk mendeteksi tanda upsampling atau padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Bandwidth terbatas", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "Tidak terdeteksi upsampling atau padding", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Cutoff terestimasi", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Bit aktif/tersimpan", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "Cutoff rendah juga dapat berasal dari mastering. Bukan selalu hasil upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Hasil analisis dari {seconds} detik audio. Jangan gunakan hasil sebagai bukti keaslian.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "Ada spektrum band yang saling berbalik yang mungkin ini hasil upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "Ada frekuensi yang terputus di {cutoff} dan desis yang berarti ini berkualitas rendah.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energi di atas {cutoff} terlalu stabil di bagian teranalisis dan kemungkinan itu desisan.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckDescription": "Periksa file Hi-Res palsu yang diupsample atau dibit-pad", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" }, @@ -5013,43 +5199,43 @@ "@hiResCheckRun": { "description": "Button that starts the Hi-Res authenticity check" }, - "hiResCheckChecking": "Memeriksa audio Hi-Res...", + "hiResCheckChecking": "Memeriksa keaslian Hi-Res...", "@hiResCheckChecking": { "description": "Loading text while the Hi-Res check runs" }, - "hiResCheckVerdictFake": "Likely fake Hi-Res", + "hiResCheckVerdictFake": "Sepertinya Hi-Res palsu", "@hiResCheckVerdictFake": { "description": "Verdict: the file claims Hi-Res but does not measure as it" }, - "hiResCheckVerdictGenuine": "Measures as genuine Hi-Res", + "hiResCheckVerdictGenuine": "Tergolong Hi-Res asli", "@hiResCheckVerdictGenuine": { "description": "Verdict: no upsampling or padded bit depth found" }, - "hiResCheckVerdictStandard": "Standard definition, nothing to flag", + "hiResCheckVerdictStandard": "Kualitas biasa, tidak ada yang aneh", "@hiResCheckVerdictStandard": { "description": "Verdict: neither sample rate nor bit depth claims Hi-Res" }, - "hiResCheckVerdictInconclusive": "Inconclusive: the analyzed segment is too quiet or short", + "hiResCheckVerdictInconclusive": "Tidak yakin: bagian teranalisis terlalu diam atau pendek", "@hiResCheckVerdictInconclusive": { "description": "Verdict: analysis could not reach a reliable conclusion" }, - "hiResCheckUnsupported": "Only FLAC and WAV files can be checked", + "hiResCheckUnsupported": "Hanya file FLAC dan WAV yang dapat diperiksa", "@hiResCheckUnsupported": { "description": "Shown when the file format cannot be decoded by the Hi-Res check" }, - "hiResCheckCutoff": "Content cutoff", + "hiResCheckCutoff": "Cutoff konten", "@hiResCheckCutoff": { "description": "Label for the highest frequency with real content" }, - "hiResCheckBitsInUse": "Bits in use", + "hiResCheckBitsInUse": "Bit digunakan", "@hiResCheckBitsInUse": { "description": "Label for effective vs declared bit depth" }, - "hiResCheckDisclaimer": "The spectrum stops early, but nothing proves it was upsampled: it may be a genuine master low-pass filtered in mastering. It is not replaced automatically.", + "hiResCheckDisclaimer": "Grafik spektrum berhenti di awal, tidak ada bukti itu diupsample: mungkin ini file master asli yang di filter low-pass saat mastering. File tidak diganti otomatis.", "@hiResCheckDisclaimer": { "description": "Caveat shown under a fake Hi-Res verdict" }, - "hiResCheckFailed": "Hi-Res check failed: {error}", + "hiResCheckFailed": "Pemeriksaan Hi-Res gagal: {error}", "@hiResCheckFailed": { "description": "Error shown when the Hi-Res check fails", "placeholders": { @@ -5058,7 +5244,7 @@ } } }, - "hiResCheckReasonRate": "Declares {sampleRate} but content stops at ~{cutoff}", + "hiResCheckReasonRate": "Tertulis {sampleRate} tapi data musik berhenti di ~{cutoff}", "@hiResCheckReasonRate": { "description": "Reason for a fake verdict caused by upsampling", "placeholders": { @@ -5070,7 +5256,7 @@ } } }, - "hiResCheckReasonDepth": "Declares {declared}-bit but only {effective} bits carry data", + "hiResCheckReasonDepth": "Tertulis {declared}-bit tapi hanya {effective} bit yang berdata", "@hiResCheckReasonDepth": { "description": "Reason for a fake verdict caused by padded bit depth", "placeholders": { @@ -5094,7 +5280,7 @@ "@extensionsHomeFeedDescription": { "description": "Extensions page - description for home feed provider picker" }, - "extensionsHomeFeedAuto": "Oto", + "extensionsHomeFeedAuto": "Otomatis", "@extensionsHomeFeedAuto": { "description": "Label for auto-selected search provider" }, @@ -5243,7 +5429,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count, plural, =1{1 lagu berhasil terdownload} other{{count} lagu berhasil terdownload}}", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 lagu berhasil didownload} other{{count} lagu berhasil didownload}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -5252,7 +5438,7 @@ } } }, - "notifDownloadsFinishedBody": "{completed, plural, =1{1 lagu terdownload} other{{completed} lagu terdownload}}, {failed, plural, =1{1 gagal} other{{failed} gagal}}", + "notifDownloadsFinishedBody": "{completed, plural, =1{1 lagu didownload} other{{completed} lagu didownload}}, {failed, plural, =1{1 gagal} other{{failed} gagal}}", "@notifDownloadsFinishedBody": { "description": "Notification body when queue finishes with failures", "placeholders": { @@ -5351,11 +5537,11 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, - "notifLibraryScanPaused": "Pindai koleksi dijeda", + "notifLibraryScanPaused": "Pindai koleksi terjeda", "@notifLibraryScanPaused": { "description": "Notification title when the user pauses a library scan" }, - "notifLibraryScanPausedBody": "{count} file sudah dipindai. Ketuk Lanjutkan di pengaturan Koleksi Lokal untuk meneruskan dari sini.", + "notifLibraryScanPausedBody": "{count} file dipindai. Lanjutkan pemindaian lewat setelan Koleksi Lokal.", "@notifLibraryScanPausedBody": { "description": "Notification body for a paused library scan - files scanned so far", "placeholders": { @@ -5373,7 +5559,7 @@ } } }, - "notifUpdateProgress": "{received}/{total}MB • {percentage}%", + "notifUpdateProgress": "{received}/{total}MB • {percentage}%", "@notifUpdateProgress": { "description": "Notification body showing update download progress", "placeholders": { @@ -5392,7 +5578,7 @@ "@notifUpdateReady": { "description": "Notification title when app update download is complete" }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} terdownload. Ketuk untuk instal.", + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} didownload. Ketuk untuk instal.", "@notifUpdateReadyBody": { "description": "Notification body when app update is ready to install", "placeholders": { @@ -5438,7 +5624,7 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "tutorialSearchHint": "Tempel atau telusuri", + "tutorialSearchHint": "Tempel atau telusuri...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" }, @@ -5530,7 +5716,7 @@ "@editMetadataMusicBrainzButton": { "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" }, - "editMetadataMusicBrainzFilled": "Terupdate dari MusicBrainz", + "editMetadataMusicBrainzFilled": "Diupdate dari MusicBrainz", "@editMetadataMusicBrainzFilled": { "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" }, @@ -5563,11 +5749,11 @@ } } }, - "queueDownloadedFileMissing": "File terdownload hilang", + "queueDownloadedFileMissing": "Hasil download hilang", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" }, - "queueCheckingDownloadedFile": "Memeriksa file terdownload...", + "queueCheckingDownloadedFile": "Memeriksa hasil download...", "@queueCheckingDownloadedFile": { "description": "Accessibility label while the app checks whether a just-completed download has appeared at its final path yet. Not about authentication or a download session." }, @@ -5592,11 +5778,11 @@ } } }, - "logAutoScrollOn": "Gulir oto HIDUP", + "logAutoScrollOn": "Gulir otomatis HIDUP", "@logAutoScrollOn": { "description": "Tooltip when auto-scroll is enabled on the log screen" }, - "logAutoScrollOff": "Gulir oto MATI", + "logAutoScrollOff": "Gulir otomatis MATI", "@logAutoScrollOff": { "description": "Tooltip when auto-scroll is disabled on the log screen" }, @@ -5689,7 +5875,7 @@ "@setupChangeFolderTooltip": { "description": "Tooltip for editing the selected download folder" }, - "a11yOpenTrackByArtist": "Buka lagu {trackName} oleh ", + "a11yOpenTrackByArtist": "Buka lagu {trackName} oleh {artistName}", "@a11yOpenTrackByArtist": { "description": "Accessibility label for opening a track item", "placeholders": { @@ -5798,7 +5984,7 @@ "@settingsApp": { "description": "Settings menu item - app settings" }, - "settingsAppSubtitle": "Update, data, repo ekstensi, debug", + "settingsAppSubtitle": "Update, data, repo, debug", "@settingsAppSubtitle": { "description": "Subtitle for app settings" }, @@ -5822,7 +6008,7 @@ "@metadataProvidersSubtitle": { "description": "Subtitle for metadata provider priority item" }, - "downloadDeduplication": "Lewati Lagu Terdownload", + "downloadDeduplication": "Lewati Lagu yang Sudah Ada", "@downloadDeduplication": { "description": "Setting - skip tracks already in download history" }, @@ -5858,7 +6044,7 @@ "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" }, - "editMetadataFieldDateHint": "HH-BB-TTTT atau TTTT", + "editMetadataFieldDateHint": "TTTT-BB-HH atau TTTT", "@editMetadataFieldDateHint": { "description": "Hint text for the edit metadata date field" }, @@ -5890,7 +6076,7 @@ "@editMetadataFieldExplicit": { "description": "Label for the explicit content metadata field" }, - "editMetadataFieldExplicitHint": "Tandai lagu bila mengandung konten eksplisit", + "editMetadataFieldExplicitHint": "Tandai lagu mengandung konten eksplisit", "@editMetadataFieldExplicitHint": { "description": "Description for the explicit content metadata switch" }, @@ -6025,7 +6211,7 @@ "queueCheckingDownloadSession": "Memeriksa sesi download...", "queueResolvingDownloadMetadata": "Menelusuri metadata lagu...", "queueResolvingDownloadStream": "Menyiapkan stream audio...", - "queueWaitingForVerification": "Menunggu veridikasi...", + "queueWaitingForVerification": "Menunggu verifikasi...", "queueResumingAfterVerification": "Melanjutkan setelah verifikasi...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" @@ -6327,7 +6513,7 @@ "@dialogDisableHistoryTitle": { "description": "Confirmation dialog title shown before disabling download history" }, - "dialogDisableHistoryMessage": "Histori yang sudah ada akan dihapus. File terdownload akan tetap ada.", + "dialogDisableHistoryMessage": "Histori yang sudah ada akan dihapus. Hasil download akan tetap ada.", "@dialogDisableHistoryMessage": { "description": "Confirmation dialog message shown before disabling download history" }, @@ -6370,11 +6556,11 @@ "@libraryExternalPlayerSubtitle": { "description": "Subtitle for external player option" }, - "libraryBuiltInPreviewPlayer": "Pemutar bawaan beta", + "libraryBuiltInPreviewPlayer": "Pemutar bawaan preview", "@libraryBuiltInPreviewPlayer": { "description": "Setting option to use the built-in preview player" }, - "libraryBuiltInPreviewPlayerSubtitle": "Pratinjau lagu lokal di SpotiFLAC Mobile", + "libraryBuiltInPreviewPlayerSubtitle": "Pemutar bawaan preview SpotiFLAC Mobile", "@libraryBuiltInPreviewPlayerSubtitle": { "description": "Subtitle for built-in preview player option" }, @@ -6395,6 +6581,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Selanjutnya", + "nowPlayingAudioOutput": "Output Audio", + "nowPlayingWrittenBy": "Ditulis oleh: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lirik: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Dapatkan Tiket", + "concertSetList": "Daftar Set Konser", + "concertSetListButton": "Atur Daftar", + "concertAddToCalendar": "Tambah ke Kalender", + "concertOpenMaps": "Buka Maps", + "concertDetailsUnavailable": "Detail konser sekarang belum tersedia.", + "concertCalendarUnavailable": "Tidak dapat membuka kalender.", + "nowPlayingAudioOutputUnavailable": "Tidak dapat membuka setelan output audio.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6436,7 +6647,7 @@ "@nowPlayingSleepTimerOff": { "description": "Action to cancel the active playback sleep timer" }, - "nowPlayingSleepTimerSet": "Timer tidur diatur selama", + "nowPlayingSleepTimerSet": "Timer tidur diatur selama {duration}", "@nowPlayingSleepTimerSet": { "description": "Confirmation after setting the playback sleep timer", "placeholders": { @@ -6462,6 +6673,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "Tidak ada lirik", + "nowPlayingInstrumental": "Jeda instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Opsi bahasa lirik", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Sembunyikan Pengucapan", + "nowPlayingShowPronunciation": "Tampilkan Pengucapan", + "nowPlayingHideTranslation": "Sembunyikan Terjemahan", + "nowPlayingShowTranslation": "Tampilkan Terjemahan", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6652,7 +6875,7 @@ "@trackConvertResamplerSoxr": { "description": "Lossless conversion SoX resampler option" }, - "updateSeeReleaseNotes": "Lihat catatan yang baru untuk detail", + "updateSeeReleaseNotes": "Lihat catatan yang baru untuk detail.", "@updateSeeReleaseNotes": { "description": "Fallback changelog text when release notes cannot be parsed" }, @@ -6869,33 +7092,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, - "libraryFilterMetadataMissingReplayGain": "Tanpa ReplayGain", + "libraryFilterMetadataMissingReplayGain": "ReplayGain Hilang", "@libraryFilterMetadataMissingReplayGain": { "description": "Filter option for scanned tracks without ReplayGain gain tags" }, - "libraryFilterIncompleteAlbums": "Album belum lengkap", - "@libraryFilterIncompleteAlbums": { - "description": "Library filter for albums with confirmed missing track positions" - }, - "libraryAlbumCompletenessUnknown": "Kelengkapan album belum diketahui", - "@libraryAlbumCompletenessUnknown": { - "description": "Library filter and status for missing, conflicting or ambiguous album track counts" - }, - "libraryAlbumMissingTracks": "{present}/{expected} lagu · kurang {missing}", - "@libraryAlbumMissingTracks": { - "description": "Album completeness badge tooltip", - "placeholders": { - "present": { - "type": "int" - }, - "expected": { - "type": "int" - }, - "missing": { - "type": "int" - } - } - }, "trackOptionCopyTrackName": "Salin nama lagu", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6917,8 +7117,8 @@ "description": "Metadata menu action that copies the selected key and value" }, "mornyeShowTabs": "Tampilkan tab", - "mornyeSearch": "Cari", - "mornyeContinuePlaying": "Putar Berikutnya", + "mornyeSearch": "Telusuri", + "mornyeContinuePlaying": "Lanjut Memutar", "metadataCopyAll": "Salin semua metadata", "@metadataCopyAll": { "description": "Metadata menu action that copies every visible key and value" @@ -6927,7 +7127,7 @@ "@optionsEmbeddedCoverSize": { "description": "Metadata setting that limits downloaded artwork resolution before it is embedded" }, - "optionsEmbeddedCoverSizeDescription": "Downscale foto cover terdownload sebelum menyematkannya. Foto yang berada di batasnya tidak akan dimodifikasi.", + "optionsEmbeddedCoverSizeDescription": "Turunkan kualitas foto cover sebelum menyematkannya. Foto yang berada di batas ukuran tidak akan dimodifikasi.", "@optionsEmbeddedCoverSizeDescription": { "description": "Description shown in the embedded cover size picker" }, @@ -6936,124 +7136,31 @@ "@mornyeFavorite": { "description": "Compact context menu action that adds a track to Loved" }, - "mornyeFavorited": "Difavoritkan", + "mornyeFavorited": "Terfavorit", "@mornyeFavorited": { "description": "Selected state of the compact favorite action" }, - "autoMixDescription": "Sambungkan lagu dengan pencocokan beat dan penyesuaian tempo tanpa mengubah nada. Gunakan crossfade jika beat tidak cocok.", - "autoMixOn": "AutoMix aktif", - "autoMixOff": "AutoMix nonaktif", - "autoplayOn": "Autoplay aktif", - "autoplayOff": "Autoplay nonaktif", - "autoplayFromLibrary": "Autoplay dari Library kamu", + "autoMixDescription": "Padukan musik dengan pencocokan bit dan penyesuaian tempo. Menggunakan crossfade bila beat tidak dapat dicocokkan.", + "autoMixOn": "AutoMix hidup", + "autoMixOff": "AutoMix mati", + "autoplayOn": "Autoplay hidup", + "autoplayOff": "Autoplay mati", + "autoplayFromLibrary": "Autoplay dari Koleksi Anda", "profileTitle": "Profil", - "profileSetUp": "Atur profil kamu", - "profileEdit": "Ubah nama dan foto", + "profileSetUp": "Atur profil Anda", + "profileEdit": "Edit nama dan foto", "backupIncludesProfile": "Termasuk nama dan foto profil", "profileName": "Nama", - "profileNameHint": "Nama kamu", + "profileNameHint": "Nama Anda", "profileChangePhoto": "Pilih foto", "profileRemovePhoto": "Hapus foto", - "profilePhotoError": "Pilih gambar yang valid dengan ukuran kurang dari 20 MB.", - "profileSaveError": "Profil belum berhasil disimpan. Silakan coba lagi.", - "autoMixSettingsTitle": "Transisi mix", - "autoMixAutomaticDuration": "Durasi otomatis", - "autoMixDuration": "Durasi mix", - "autoMixEffect": "Efek transisi", - "autoMixEffectAuto": "Otomatis", - "autoMixEffectCrossfade": "Crossfade", - "autoMixEffectMuffled": "Redam", - "autoMixEffectEcho": "Gema", - "autoMixEffectPitch": "Nada", - "autoMixEffectCustom": "Kustom", - "autoMixEffectsHelp": "Efek diterapkan pada akhir lagu yang keluar selama mix. Lagu pendek memakai overlap yang lebih singkat.", - "autoMixSpeed": "Kecepatan", - "autoMixPitch": "Nada (semitone)", - "autoMixEcho": "Gema", - "autoMixLowPass": "Filter redam", - "autoMixMixing": "Mixing", - "autoMixCrossfading": "Crossfade", + "profilePhotoError": "Pilih foto yang di bawah 20MB.", + "profileSaveError": "Tidak dapat menyimpan profil Anda. Coba lagi.", + "artistUpcomingConcerts": "Konser Mendatang", + "artistAllUpcomingConcerts": "Semua Konser Mendatang", + "artistNoUpcomingConcerts": "Tiada konser mendatang.", "optionsEmbeddedCoverSizeOriginal": "Resolusi asli", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" - }, - "nowPlayingAudioOutput": "Output Audio", - "nowPlayingWrittenBy": "Ditulis oleh: {writers}", - "nowPlayingLyricsProvider": "Lirik: {provider}", - "concertGetTickets": "Beli Tiket", - "concertSetList": "Set List Konser", - "concertSetListButton": "Set List", - "concertAddToCalendar": "Tambahkan ke Kalender", - "concertOpenMaps": "Buka Peta", - "concertDetailsUnavailable": "Detail konser belum tersedia saat ini.", - "concertCalendarUnavailable": "Tidak dapat membuka kalender.", - "nowPlayingAudioOutputUnavailable": "Tidak dapat membuka pengaturan output audio.", - "nowPlayingInstrumental": "Jeda instrumental", - "nowPlayingLyricsLanguageOptions": "Opsi bahasa lirik", - "nowPlayingHidePronunciation": "Sembunyikan Pelafalan", - "nowPlayingShowPronunciation": "Tampilkan Pelafalan", - "nowPlayingHideTranslation": "Sembunyikan Terjemahan", - "nowPlayingShowTranslation": "Tampilkan Terjemahan", - "trackRemoveReplayGain": "Hapus ReplayGain", - "trackRemoveReplayGainSuccess": "Tag ReplayGain dihapus", - "trackRemoveReplayGainFailed": "Gagal menghapus tag ReplayGain", - "replayGainRemoving": "Menghapus ReplayGain...", - "replayGainRemoveConfirmMessage": "Hapus tag ReplayGain lagu dan album dari {count} lagu? Audio, sampul, dan metadata lainnya tetap tersimpan.", - "selectionRemoveReplayGainCount": "Hapus RG ({count})", - "replayGainRemoveBatchSuccess": "ReplayGain dihapus dari {success} dari {total} lagu", - "artistUpcomingConcerts": "Konser Mendatang", - "artistAllUpcomingConcerts": "Semua Konser Mendatang", - "artistNoUpcomingConcerts": "Belum ada konser mendatang.", - "hiResCheckSummary": "Periksa spektrum dan kedalaman bit aktif untuk menemukan tanda upsampling atau padding.", - "hiResCheckLimitedBandwidth": "Rentang frekuensi terbatas", - "hiResCheckNoEvidence": "Tidak terdeteksi upsampling atau padding", - "hiResCheckEstimatedCutoff": "Perkiraan cutoff", - "hiResCheckActiveBits": "Bit aktif / tersimpan", - "hiResCheckBandwidthExplanation": "Cutoff yang lebih rendah bisa berasal dari proses mastering. Hal ini saja tidak membuktikan adanya upsampling.", - "hiResCheckSampledExplanation": "Berdasarkan {seconds} detik audio. Analisis ini tidak dapat memastikan keaslian master sumber.", - "hiResCheckImagingEvidence": "Spektrum memiliki pola pita tercermin yang konsisten dengan upsampling.", - "hiResCheckRateEvidence": "Penurunan tajam di sekitar {cutoff} dan noise floor yang terukur mengindikasikan sumber dengan sample rate lebih rendah.", - "hiResCheckSteadyEnergy": "Energi di atas {cutoff} relatif konstan pada bagian yang dianalisis dan mungkin berupa noise.", - "motionArtwork": "Artwork bergerak", - "listeningStats": "Statistik mendengarkan", - "listeningStatsRecord": "Catat waktu mendengarkan", - "listeningStatsDescription": "Disimpan hanya di perangkat ini, mulai sekarang. Hanya mencatat player bawaan; pause, buffering, dan seek tidak menambah waktu dengar. Pemutaran dihitung setelah 30 detik.", - "listeningStatsEmpty": "Putar musik dengan player bawaan untuk memulai ringkasan mendengarkan. Riwayat sebelumnya tidak dapat dipulihkan.", - "listeningStatsDays": "{days} hari", - "listeningStatsMinutes": "{minutes} menit", - "listeningStatsTotals": "{plays} pemutaran · {tracks} lagu · {days} hari aktif", - "listeningStatsPreviousYear": "Tahun sebelumnya", - "listeningStatsNextYear": "Tahun berikutnya", - "listeningStatsActivity": "Hari mendengarkan terbaru · menit", - "listeningStatsTopArtists": "Artis teratas", - "listeningStatsTopTracks": "Lagu teratas", - "listeningStatsLoadError": "Statistik mendengarkan tidak dapat dimuat", - "listeningStatsClear": "Hapus statistik mendengarkan", - "listeningStatsClearError": "Statistik mendengarkan tidak dapat dihapus. Silakan coba lagi.", - "listeningStatsClearDescription": "Hapus semua statistik mendengarkan di perangkat ini? Musik dan playlist tetap tersimpan.", - "weeklyReleases": "Rilis baru", - "weeklyReleasesDescription": "Album dan single terbaru dari artis favorit, melalui extension metadata yang terpasang.", - "weeklyReleasesEmpty": "Tidak ditemukan rilis dengan tanggal dalam periode ini. Tambahkan artis favorit atau coba periode lebih panjang.", - "weeklyReleasesUnavailable": "Beberapa artis tidak dapat diperiksa. Hasil tersimpan tetap dipertahankan. Penyedia mungkin tidak memberikan katalog artis atau tanggal rilis lengkap.", - "weeklyReleasesLoadError": "Rilis baru tidak dapat diperiksa. Tarik untuk memuat ulang.", - "motionArtworkDescription": "Putar berulang cover video dari penyedia metadata. Matikan untuk memakai cover diam dan menghemat baterai.", - "libraryLoading": "Memuat Library…", - "libraryLoadFailed": "Library tidak dapat dimuat. Coba lagi untuk memuat folder tersimpan dan indeks lagu.", - "discordPresenceDescription": "Tampilkan judul, artis, album, dan progres musik dari pemutar bawaan di profil Discord Anda. File audio dan cover lokal tidak diunggah. Status dihapus saat musik dijeda atau dihentikan.", - "discordPresenceDisabled": "Nonaktif", - "discordPresenceLink": "Hubungkan akun Discord", - "discordPresenceConnecting": "Menghubungkan ke Discord…", - "discordPresenceReady": "Siap saat musik diputar", - "discordPresenceActive": "Menampilkan lagu saat ini", - "discordPresenceUnavailable": "Discord tidak tersedia. Mencoba lagi saat musik diputar.", - "discordPresenceBuildUnavailable": "SDK Discord tidak tersedia di build ini.", - "discordPresenceAndroidHelp": "Pasang Discord dan masuk di ponsel ini. Izinkan berbagi aktivitas di Discord. Pemutar eksternal tidak didukung.", - "discordPresenceIosHelp": "Hubungkan akun melalui Discord dan izinkan berbagi aktivitas. Ketuk untuk menghubungkan ulang jika otorisasi gagal.", - "discordPresenceDisconnect": "Putuskan dan lupakan akun", - "playbackAutomation": "Pemutaran otomatis", - "playbackPauseOnMute": "Jeda saat volume nol", - "snackbarPlaybackMuted": "Volume media nol. Lagu dijeda. Tekan play lagi untuk tetap memutar.", - "playbackPauseOnMuteDescription": "Jeda saat volume media nol dan lanjutkan saat dinaikkan. Jeda manual tetap dihormati. Hanya untuk keluaran audio standar.", - "playbackOnHeadphonesConnected": "Putar saat earphone terhubung", - "playbackOnHeadphonesConnectedDescription": "Lanjutkan lagu saat earphone kabel atau Bluetooth terhubung. Pemutaran dijeda saat dilepas. Hanya untuk pemutar bawaan." + } } diff --git a/lib/l10n/arb/app_it.arb b/lib/l10n/arb/app_it.arb index 1cea7d5b..8e47facb 100644 --- a/lib/l10n/arb/app_it.arb +++ b/lib/l10n/arb/app_it.arb @@ -1,4 +1,31 @@ { + "settingsPlaybackSubtitle": "Player, volume, AutoMix, and audio output", + "sectionPlayer": "Player", + "sectionVolumeAndTransitions": "Volume and transitions", + "sectionAudioOutput": "Audio output", + "usbBitPerfect": "Hi-res and bit-perfect audio", + "usbBitPerfectDescription": "Preserve source precision on compatible outputs. Choose direct USB or AAudio exclusive below; otherwise Android USB output requires Android 14 or later. Applies from the next track, without AutoMix or normalization. System volume may not control direct USB.", + "usbHardwareVolume": "DAC hardware volume", + "usbVolumeWarningTitle": "Check your listening volume", + "usbVolumeWarning": "Direct USB audio can be much louder than normal playback, and phone volume buttons may not control it. Lower your DAC or amplifier volume before starting. When supported, SpotiFLAC sets the DAC to at most −40 dB on connection; this does not guarantee a safe listening level on every amplifier or headphone.", + "usbVolumeAccept": "I understand", + "usbVolumeUnavailable": "Playback is paused because this DAC has no verified hardware volume control. Lower the DAC or amplifier volume, then enable fixed-volume output if needed and select the track again.", + "usbFixedVolume": "Allow fixed-volume USB output", + "usbFixedVolumeDescription": "For DACs without a volume control accessible to the app. Keep off for USB headsets without their own volume control. Applies from the next track.", + "usbFixedVolumeWarning": "The app cannot lower the volume on this output. Audio may start at full level, and the phone volume slider will not help. Only continue after lowering the volume on your DAC or external amplifier. Do not enable this for a headset without its own volume control.", + "dapExclusive": "DAP hi-res (AAudio exclusive)", + "dapExclusiveDescription": "Use Oboe/AAudio at the track's original rate and precision for FLAC/WAV PCM. Requires Android 8.1 or later and compatible hardware. Exclusive access is checked; unavailable formats use normal playback. DSD requires the direct USB driver. Applies from the next track.", + "dapExclusiveUnavailable": "AAudio exclusive access is unavailable for this track and current output. Using normal playback. For a USB DAC, try the direct USB driver.", + "usbDirect": "Direct USB driver", + "usbDirectDescription": "Use exclusive USB audio for FLAC/WAV, DSF/DFF and WavPack DSD, with Android USB permission. Native DSD requires a recognized compatible DAC. Other PCM formats use normal playback. Applies from the next track.", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "Enable only if your DAC explicitly supports DoP. Sends DSF/DFF and WavPack DSD inside a PCM carrier when native DSD is unavailable. An incompatible device may play noise; leave off for ordinary USB headsets.", + "usbDsdUnsupported": "This DSD format or connected DAC is not supported. Playback stopped.", + "usbPermissionDenied": "USB permission was not granted. Using normal playback.", + "usbBitPerfectPending": "Waiting for the next track and a compatible USB output.", + "usbBitPerfectNoDevice": "No USB DAC connected. Using normal audio output.", + "usbBitPerfectFallback": "This device or audio format does not support bit-perfect output. Using normal playback.", + "usbBitPerfectRouteChanged": "The USB audio route changed. Playback paused; select a track to reconnect.", "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Make it\nyour own.", "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", @@ -36,6 +63,32 @@ "description": "System volume control label in the Mornye player" }, "appearanceStyle": "App Style", + "appearanceAccentRed": "Red (default)", + "appearanceAccentOrange": "Orange", + "appearanceAccentGreen": "Green", + "appearanceAccentTeal": "Teal", + "appearanceAccentBlue": "Blue", + "appearanceAccentPurple": "Purple", + "appearanceAccentPink": "Pink", + "appearanceGlassClarity": "Glass clarity", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Tinted", + "appearanceGlassClear": "Clear", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Use system font", + "appearanceUseSystemFontSubtitle": "Use your device’s default typeface for app text.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Remove ReplayGain", + "trackRemoveReplayGainSuccess": "ReplayGain tags removed", + "trackRemoveReplayGainFailed": "Failed to remove ReplayGain tags", + "replayGainRemoving": "Removing ReplayGain...", + "replayGainRemoveConfirmMessage": "Remove track and album ReplayGain tags from {count} track(s)? Audio, artwork, and other metadata will be preserved.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Remove RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain removed from {success} of {total} tracks", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "Extension Repo", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "Modalità testi", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% of {total} files", "@libraryScanProgress": { "description": "Scan progress display", @@ -4910,6 +5009,61 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "Inspect the spectrum and active bit depth for signs of upsampling or padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Limited bandwidth", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No upsampling or padding detected", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Estimated cutoff", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Active / stored bits", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "A lower cutoff can come from mastering. It does not, by itself, prove upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Based on {seconds} seconds of audio. This analysis cannot certify the original master.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "The spectrum contains mirrored bands consistent with upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "A sharp roll-off near {cutoff} and the measured noise floor suggest a lower-rate source.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energy above {cutoff} is mostly steady in the analyzed segment and may be noise.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "Rileva file Hi-Res falsi, ricampionati o con bit riempiti", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Up next", + "nowPlayingAudioOutput": "Audio Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Get Tickets", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Open Maps", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Lyrics language options", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Hide Pronunciation", + "nowPlayingShowPronunciation": "Show Pronunciation", + "nowPlayingHideTranslation": "Hide Translation", + "nowPlayingShowTranslation": "Show Translation", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copy track name", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6808,6 +7016,9 @@ "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", "autoMixOn": "AutoMix on", "autoMixOff": "AutoMix off", + "autoplayOn": "Autoplay on", + "autoplayOff": "Autoplay off", + "autoplayFromLibrary": "Autoplay from your Library", "profileTitle": "Profile", "profileSetUp": "Set up your profile", "profileEdit": "Edit name and photo", @@ -6818,6 +7029,9 @@ "profileRemovePhoto": "Remove photo", "profilePhotoError": "Choose a valid image smaller than 20 MB.", "profileSaveError": "Could not save your profile. Please try again.", + "artistUpcomingConcerts": "Upcoming Concerts", + "artistAllUpcomingConcerts": "All Upcoming Concerts", + "artistNoUpcomingConcerts": "No upcoming concerts.", "optionsEmbeddedCoverSizeOriginal": "Original resolution", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" diff --git a/lib/l10n/arb/app_ja.arb b/lib/l10n/arb/app_ja.arb index bcc7ddf1..c1f276f7 100644 --- a/lib/l10n/arb/app_ja.arb +++ b/lib/l10n/arb/app_ja.arb @@ -1,4 +1,31 @@ { + "settingsPlaybackSubtitle": "Player, volume, AutoMix, and audio output", + "sectionPlayer": "Player", + "sectionVolumeAndTransitions": "Volume and transitions", + "sectionAudioOutput": "Audio output", + "usbBitPerfect": "Hi-res and bit-perfect audio", + "usbBitPerfectDescription": "Preserve source precision on compatible outputs. Choose direct USB or AAudio exclusive below; otherwise Android USB output requires Android 14 or later. Applies from the next track, without AutoMix or normalization. System volume may not control direct USB.", + "usbHardwareVolume": "DAC hardware volume", + "usbVolumeWarningTitle": "Check your listening volume", + "usbVolumeWarning": "Direct USB audio can be much louder than normal playback, and phone volume buttons may not control it. Lower your DAC or amplifier volume before starting. When supported, SpotiFLAC sets the DAC to at most −40 dB on connection; this does not guarantee a safe listening level on every amplifier or headphone.", + "usbVolumeAccept": "I understand", + "usbVolumeUnavailable": "Playback is paused because this DAC has no verified hardware volume control. Lower the DAC or amplifier volume, then enable fixed-volume output if needed and select the track again.", + "usbFixedVolume": "Allow fixed-volume USB output", + "usbFixedVolumeDescription": "For DACs without a volume control accessible to the app. Keep off for USB headsets without their own volume control. Applies from the next track.", + "usbFixedVolumeWarning": "The app cannot lower the volume on this output. Audio may start at full level, and the phone volume slider will not help. Only continue after lowering the volume on your DAC or external amplifier. Do not enable this for a headset without its own volume control.", + "dapExclusive": "DAP hi-res (AAudio exclusive)", + "dapExclusiveDescription": "Use Oboe/AAudio at the track's original rate and precision for FLAC/WAV PCM. Requires Android 8.1 or later and compatible hardware. Exclusive access is checked; unavailable formats use normal playback. DSD requires the direct USB driver. Applies from the next track.", + "dapExclusiveUnavailable": "AAudio exclusive access is unavailable for this track and current output. Using normal playback. For a USB DAC, try the direct USB driver.", + "usbDirect": "Direct USB driver", + "usbDirectDescription": "Use exclusive USB audio for FLAC/WAV, DSF/DFF and WavPack DSD, with Android USB permission. Native DSD requires a recognized compatible DAC. Other PCM formats use normal playback. Applies from the next track.", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "Enable only if your DAC explicitly supports DoP. Sends DSF/DFF and WavPack DSD inside a PCM carrier when native DSD is unavailable. An incompatible device may play noise; leave off for ordinary USB headsets.", + "usbDsdUnsupported": "This DSD format or connected DAC is not supported. Playback stopped.", + "usbPermissionDenied": "USB permission was not granted. Using normal playback.", + "usbBitPerfectPending": "Waiting for the next track and a compatible USB output.", + "usbBitPerfectNoDevice": "No USB DAC connected. Using normal audio output.", + "usbBitPerfectFallback": "This device or audio format does not support bit-perfect output. Using normal playback.", + "usbBitPerfectRouteChanged": "The USB audio route changed. Playback paused; select a track to reconnect.", "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Make it\nyour own.", "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", @@ -36,6 +63,32 @@ "description": "System volume control label in the Mornye player" }, "appearanceStyle": "App Style", + "appearanceAccentRed": "Red (default)", + "appearanceAccentOrange": "Orange", + "appearanceAccentGreen": "Green", + "appearanceAccentTeal": "Teal", + "appearanceAccentBlue": "Blue", + "appearanceAccentPurple": "Purple", + "appearanceAccentPink": "Pink", + "appearanceGlassClarity": "Glass clarity", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Tinted", + "appearanceGlassClear": "Clear", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Use system font", + "appearanceUseSystemFontSubtitle": "Use your device’s default typeface for app text.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Remove ReplayGain", + "trackRemoveReplayGainSuccess": "ReplayGain tags removed", + "trackRemoveReplayGainFailed": "Failed to remove ReplayGain tags", + "replayGainRemoving": "Removing ReplayGain...", + "replayGainRemoveConfirmMessage": "Remove track and album ReplayGain tags from {count} track(s)? Audio, artwork, and other metadata will be preserved.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Remove RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain removed from {success} of {total} tracks", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "Extension Repo", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "歌詞モード", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% of {total} files", "@libraryScanProgress": { "description": "Scan progress display", @@ -4910,6 +5009,61 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "Inspect the spectrum and active bit depth for signs of upsampling or padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Limited bandwidth", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No upsampling or padding detected", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Estimated cutoff", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Active / stored bits", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "A lower cutoff can come from mastering. It does not, by itself, prove upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Based on {seconds} seconds of audio. This analysis cannot certify the original master.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "The spectrum contains mirrored bands consistent with upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "A sharp roll-off near {cutoff} and the measured noise floor suggest a lower-rate source.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energy above {cutoff} is mostly steady in the analyzed segment and may be noise.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Up next", + "nowPlayingAudioOutput": "Audio Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Get Tickets", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Open Maps", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Lyrics language options", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Hide Pronunciation", + "nowPlayingShowPronunciation": "Show Pronunciation", + "nowPlayingHideTranslation": "Hide Translation", + "nowPlayingShowTranslation": "Show Translation", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copy track name", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6808,6 +7016,9 @@ "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", "autoMixOn": "AutoMix on", "autoMixOff": "AutoMix off", + "autoplayOn": "Autoplay on", + "autoplayOff": "Autoplay off", + "autoplayFromLibrary": "Autoplay from your Library", "profileTitle": "Profile", "profileSetUp": "Set up your profile", "profileEdit": "Edit name and photo", @@ -6818,8 +7029,11 @@ "profileRemovePhoto": "Remove photo", "profilePhotoError": "Choose a valid image smaller than 20 MB.", "profileSaveError": "Could not save your profile. Please try again.", + "artistUpcomingConcerts": "Upcoming Concerts", + "artistAllUpcomingConcerts": "All Upcoming Concerts", + "artistNoUpcomingConcerts": "No upcoming concerts.", "optionsEmbeddedCoverSizeOriginal": "Original resolution", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" } -} +} \ No newline at end of file diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 13019d98..0b562a58 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -1,5 +1,32 @@ { - "upgradeIntroWelcome": "SpotiFLAC Mobile 5.0\n에 오신 것을 환영 합니다", + "settingsPlaybackSubtitle": "플레이어, 볼륨, AutoMix, 및 오디오 출력", + "sectionPlayer": "플레이어", + "sectionVolumeAndTransitions": "볼륨 및 전환", + "sectionAudioOutput": "오디오 출력", + "usbBitPerfect": "Hi-res 및 bit-perfect 오디오", + "usbBitPerfectDescription": "지원되는 출력에서는 소스의 정밀도를 그대로 유지합니다. 아래에서 다이렉트 USB 또는 AAudio 전용 출력을 선택하세요. 그 외의 경우 Android USB 출력은 Android 14 이상에서만 사용할 수 있습니다. 이 설정은 다음 트랙부터 적용되며, AutoMix 또는 볼륨 정규화가 적용되지 않은 상태에서 작동합니다. 다이렉트 USB 출력에서는 휴대전화의 시스템 볼륨 조절이 작동하지 않을 수 있습니다", + "usbHardwareVolume": "DAC 하드웨어 볼륨", + "usbVolumeWarningTitle": "청취 볼륨을 확인하세요", + "usbVolumeWarning": "다이렉트 USB 오디오는 일반 재생보다 훨씬 크게 출력될 수 있으며, 휴대전화의 볼륨 버튼으로 음량이 조절되지 않을 수 있습니다. 시작하기 전에 DAC 또는 앰프의 볼륨을 낮추세요. 지원되는 경우 SpotiFLAC은 연결 시 DAC의 볼륨을 최대 −40 dB로 설정합니다. 하지만 이것이 모든 앰프나 헤드폰에서 안전한 청취 음량을 보장하는 것은 아닙니다", + "usbVolumeAccept": "이해했습니다", + "usbVolumeUnavailable": "이 DAC에는 검증된 하드웨어 볼륨 조절 기능이 없기 때문에 재생이 일시 중지되었습니다. DAC 또는 앰프의 볼륨을 낮춘 다음, 필요하다면 고정 볼륨 출력을 활성화하고 트랙을 다시 선택하세요", + "usbFixedVolume": "고정 볼륨 USB 출력 허용", + "usbFixedVolumeDescription": "앱에서 볼륨을 조절할 수 없는 DAC용입니다. 자체 볼륨 조절 기능이 없는 USB 헤드셋에서는 켜지 않은 상태로 유지하세요. 이 설정은 다음 트랙부터 적용됩니다", + "usbFixedVolumeWarning": "이 출력에서는 앱이 볼륨을 낮출 수 없습니다. 오디오가 최대 음량으로 시작할 수 있으며, 휴대전화의 볼륨 슬라이더로도 조절되지 않습니다. DAC 또는 외부 앰프의 볼륨을 먼저 낮춘 후에만 계속 진행하세요. 자체 볼륨 조절 기능이 없는 헤드셋에서는 이 기능을 활성화하지 마세요", + "dapExclusive": "DAP hi-res (AAudio 전용)", + "dapExclusiveDescription": "FLAC/WAV PCM 파일을 트랙의 원본 샘플레이트와 정밀도 그대로 재생하려면 Oboe/AAudio를 사용합니다. Android 8.1 이상과 호환되는 하드웨어가 필요합니다. 전용 접근 가능 여부를 확인하며, 지원되지 않는 형식은 일반 재생 방식으로 처리됩니다. DSD는 다이렉트 USB 드라이버가 필요합니다. 이 설정은 다음 트랙부터 적용됩니다", + "dapExclusiveUnavailable": "이 트랙과 현재 출력에서는 AAudio 전용 접근을 사용할 수 없습니다. 일반 재생 방식으로 전환합니다. USB DAC을 사용하는 경우 다이렉트 USB 드라이버를 사용해 보세요", + "usbDirect": "다이렉트 USB 드라이버", + "usbDirectDescription": "FLAC/WAV, DSF/DFF 및 WavPack DSD를 재생하려면 독점 USB 오디오를 사용하며, Android의 USB 권한이 필요합니다. 네이티브 DSD는 인식된 호환 DAC이 필요합니다. 그 외의 PCM 형식은 일반 재생 방식을 사용합니다. 이 설정은 다음 트랙부터 적용됩니다", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "DAC이 DoP를 명시적으로 지원하는 경우에만 활성화하세요. 네이티브 DSD를 사용할 수 없을 때 DSF/DFF 및 WavPack DSD를 PCM 데이터 안에 담아 전송합니다. 호환되지 않는 기기에서는 잡음이 재생될 수 있으므로, 일반 USB 헤드셋에서는 이 기능을 꺼두세요", + "usbDsdUnsupported": "이 DSD 형식 또는 연결된 DAC은 지원되지 않습니다. 재생이 중지되었습니다", + "usbPermissionDenied": "USB 권한이 부여되지 않았습니다. 일반 재생을 사용합니다", + "usbBitPerfectPending": "다음 트랙과 호환 가능한 USB 출력이 연결되기를 기다리고 있습니다", + "usbBitPerfectNoDevice": "USB DAC이 연결되어 있지 않습니다. 일반 오디오 출력을 사용합니다", + "usbBitPerfectFallback": "이 기기 또는 오디오 형식은 Bit-Perfect 출력을 지원하지 않습니다. 일반 재생을 사용합니다", + "usbBitPerfectRouteChanged": "USB 오디오 출력 경로가 변경되었습니다. 재생이 일시 중지되었습니다. 다시 연결하려면 트랙을 선택하세요", + "upgradeIntroWelcome": "SpotiFLAC Mobile 5.0\n에 오신 것을 환영합니다", "upgradeIntroThemeTitle": "나만의 스타일로\n꾸며보세요", "upgradeIntroThemeBody": "스타일을 선택하세요. 선택한 스타일은 즉시 적용되며, 나중에 디자인 설정에서 변경할 수 있습니다", "upgradeIntroThemeMaterialBody": "Material 디자인 컨트롤과 선택한 강조 색상이 적용된 익숙한 레이아웃", @@ -36,6 +63,32 @@ "description": "System volume control label in the Mornye player" }, "appearanceStyle": "앱 스타일", + "appearanceAccentRed": "빨간색 (기본값)", + "appearanceAccentOrange": "주황색", + "appearanceAccentGreen": "초록색", + "appearanceAccentTeal": "청록색", + "appearanceAccentBlue": "파란색", + "appearanceAccentPurple": "보라색", + "appearanceAccentPink": "분홍색", + "appearanceGlassClarity": "글래스 투명도", + "appearanceGlassClaritySubtitle": "Mornye 메뉴와 하단바의 투명도를 조절할 수 있습니다. 텍스트 대비는 유지됩니다", + "appearanceGlassTinted": "색조", + "appearanceGlassClear": "투명", + "appearanceGlassClarityBlurOff": "이 기기에서 글래스 효과가 불투명하게 표시됩니다. 투명도를 조절하려면 '{setting}'을 켜세요", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "시스템의 고대비 설정이 켜져 있는 동안에는 글래스 효과가 불투명하게 표시됩니다", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "시스템 글꼴 사용", + "appearanceUseSystemFontSubtitle": "앱 텍스트에 기기 기본 글꼴을 사용합니다", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -99,7 +152,7 @@ }, "libraryRecentlyAdded": "최근 추가됨", "libraryDownloads": "다운로드", - "libraryNoActiveDownloads": "활성화된 다운로드가 없음", + "libraryNoActiveDownloads": "진행 중인 다운로드가 없습니다", "librarySearchHint": "라이브러리 검색", "libraryEmptyCollection": "음악이 여기에 표시됩니다", "historySearchHint": "기록 검색...", @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "리플레이게인 제거", + "trackRemoveReplayGainSuccess": "리플레이게인 태그 제거됨", + "trackRemoveReplayGainFailed": "리플레이게인 태그 제거 실패", + "replayGainRemoving": "리플레이게인 제거 중...", + "replayGainRemoveConfirmMessage": "{count} 개의 트랙에서 트랙 및 앨범 리플레이게인 태그를 제거하시겠습니까? 오디오, 앨범 아트 및 기타 메타데이터는 보존됩니다", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "RG 제거 ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "{total} 개 중 {success} 개의 트랙에서 리플레이게인이 제거됨", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "리플레이게인 ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "주요 아티스트만", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "모든 형식에서 아티스트 및 앨범 아티스트 필드에 '아티스트 A'와 같은 첫 번째 아티스트만 입력하여, 플레이어에 하나의 아티스트만 표시되도록 합니다", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "확장 기능 레포", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -569,7 +662,7 @@ "@setupGrantPermission": { "description": "Button to request permission" }, - "setupSkip": "다음에 할래요", + "setupSkip": "건너뛰기", "@setupSkip": { "description": "Skip current step button" }, @@ -589,7 +682,7 @@ "@setupPermissionDeniedMessage": { "description": "Error when permission denied" }, - "setupPermissionRequired": "''{permissionType}'' 권한 필요", + "setupPermissionRequired": "'{permissionType}' 권한 필요", "@setupPermissionRequired": { "description": "Generic permission required title", "placeholders": { @@ -599,7 +692,7 @@ } } }, - "setupPermissionRequiredMessage": "최상의 사용 경험을 위해 ''{permissionType}'' 권한이 필요합니다. 설정에서 나중에 변경할 수 있습니다", + "setupPermissionRequiredMessage": "최상의 사용 경험을 위해 '{permissionType}' 권한이 필요합니다. 설정에서 나중에 변경할 수 있습니다", "@setupPermissionRequiredMessage": { "description": "Generic permission required message", "placeholders": { @@ -696,7 +789,7 @@ "@setupNotificationBackgroundDescription": { "description": "Detailed notification explanation" }, - "setupSkipForNow": "다음에 할래요", + "setupSkipForNow": "건너뛰기", "@setupSkipForNow": { "description": "Skip button text" }, @@ -884,7 +977,7 @@ "@libraryReviewDuplicates": { "description": "Library settings row opening the duplicate review sheet" }, - "libraryReviewDuplicatesSubtitle": "중복 저장된 트랙 찾기", + "libraryReviewDuplicatesSubtitle": "중복 저장된 트랙을 찾을 수 있습니다", "@libraryReviewDuplicatesSubtitle": { "description": "Subtitle for the duplicate review settings row" }, @@ -916,7 +1009,7 @@ } } }, - "duplicatesKeepBestMessage": "\"{trackName}\"의 {count} 개의 저음질 복사본을 삭제하시겠습니까?", + "duplicatesKeepBestMessage": "'{trackName}'의 {count} 개의 저음질 복사본을 삭제하시겠습니까?", "@duplicatesKeepBestMessage": { "description": "Confirmation message for the keep-best action", "placeholders": { @@ -928,7 +1021,7 @@ } } }, - "duplicatesDeleteCopyMessage": "\"{trackName}\"의 복사본을 삭제하시겠습니까?", + "duplicatesDeleteCopyMessage": "'{trackName}'의 복사본을 삭제하시겠습니까?", "@duplicatesDeleteCopyMessage": { "description": "Confirmation message for deleting one duplicate copy", "placeholders": { @@ -945,7 +1038,7 @@ } } }, - "snackbarAddedToQueue": "''{trackName}''가 다운로드 목록에 추가됨", + "snackbarAddedToQueue": "'{trackName}'가 다운로드 목록에 추가됨", "@snackbarAddedToQueue": { "description": "Snackbar - track added to download queue", "placeholders": { @@ -963,7 +1056,7 @@ } } }, - "snackbarAlreadyDownloaded": "''{trackName}''은 이미 다운로드되어 있음", + "snackbarAlreadyDownloaded": "'{trackName}'은 이미 다운로드되어 있음", "@snackbarAlreadyDownloaded": { "description": "Snackbar - track already exists", "placeholders": { @@ -972,7 +1065,7 @@ } } }, - "snackbarAlreadyInLibrary": "라이브러리에 ''{trackName}''이 이미 존재함", + "snackbarAlreadyInLibrary": "라이브러리에 '{trackName}'이 이미 존재함", "@snackbarAlreadyInLibrary": { "description": "Snackbar - track already exists in local library", "placeholders": { @@ -1033,7 +1126,7 @@ "@snackbarMetadataProviderSaved": { "description": "Snackbar - metadata provider order saved" }, - "snackbarExtensionInstalled": "''{extensionName}''이 설치됨", + "snackbarExtensionInstalled": "'{extensionName}'이 설치됨", "@snackbarExtensionInstalled": { "description": "Snackbar - extension installed successfully", "placeholders": { @@ -1042,7 +1135,7 @@ } } }, - "snackbarExtensionUpdated": "''{extensionName}''이 설치됨", + "snackbarExtensionUpdated": "'{extensionName}'이 업데이트됨", "@snackbarExtensionUpdated": { "description": "Snackbar - extension updated successfully", "placeholders": { @@ -1087,7 +1180,7 @@ "@errorUrlFetchFailed": { "description": "Error message - generic URL fetch failure" }, - "errorMissingExtensionSource": "''{item}''을 불러올 수 없음: 확장 소스가 누락됨", + "errorMissingExtensionSource": "'{item}'을 불러올 수 없음: 확장 소스가 누락됨", "@errorMissingExtensionSource": { "description": "Error - extension source not available", "placeholders": { @@ -1318,7 +1411,7 @@ "@updateWhatsNew": { "description": "Changelog section title" }, - "updateDownloadInstall": "다운로드 & 설치", + "updateDownloadInstall": "다운로드 및 설치", "@updateDownloadInstall": { "description": "Update button - download and install" }, @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "가사 보는 동안 화면 켜짐 유지", + "lyricsKeepScreenOnSubtitle": "가사가 열려 있는 동안 재생이 일시정지된 경우를 포함하여 화면이 꺼지지 않도록 합니다", "lyricsMode": "가사 설정", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2013,7 +2108,7 @@ "@extensionsMetadataPriority": { "description": "Setting - metadata provider order" }, - "extensionsMetadataPrioritySubtitle": "검색 & 메타데이터 출처 순서를 설정하세요", + "extensionsMetadataPrioritySubtitle": "검색 및 메타데이터 출처 순서를 설정하세요", "@extensionsMetadataPrioritySubtitle": { "description": "Subtitle for metadata priority" }, @@ -2441,7 +2536,7 @@ } } }, - "discographySinglesOnly": "싱글 & EP만", + "discographySinglesOnly": "싱글 및 EP만", "@discographySinglesOnly": { "description": "Option - download only singles" }, @@ -2555,11 +2650,11 @@ "@settingsLocalLibrary": { "description": "Settings menu item - local library" }, - "settingsLocalLibrarySubtitle": "음악 스캔 & 중복 감지", + "settingsLocalLibrarySubtitle": "음악 스캔 및 중복 감지", "@settingsLocalLibrarySubtitle": { "description": "Subtitle for local library settings" }, - "settingsCache": "저장소 & 캐시", + "settingsCache": "저장소 및 캐시", "@settingsCache": { "description": "Settings menu item - cache management" }, @@ -2642,7 +2737,7 @@ "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" }, - "libraryShowDuplicateIndicatorSubtitle": "기존 트랙을 검색할 때 표시", + "libraryShowDuplicateIndicatorSubtitle": "기존 트랙을 검색할 때 표시합니다", "@libraryShowDuplicateIndicatorSubtitle": { "description": "Subtitle for duplicate indicator toggle" }, @@ -2698,7 +2793,7 @@ "@libraryClear": { "description": "Button to clear all library entries" }, - "libraryClearSubtitle": "스캔된 모든 트랙 제거", + "libraryClearSubtitle": "스캔된 모든 트랙을 제거합니다", "@libraryClearSubtitle": { "description": "Subtitle for clear button" }, @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "스캔이 일시 중지됨", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{total} 개의 파일 중 {progress}%", "@libraryScanProgress": { "description": "Scan progress display", @@ -3057,7 +3156,7 @@ "@cleanupOrphanedDownloadsNone": { "description": "Snackbar when no orphans found" }, - "cacheTitle": "저장소 & 캐시", + "cacheTitle": "저장소 및 캐시", "@cacheTitle": { "description": "Cache management page title" }, @@ -3201,7 +3300,7 @@ "@cacheClearConfirmTitle": { "description": "Dialog title before clearing one cache category" }, - "cacheClearConfirmMessage": "''{target}''의 캐시된 데이터를 지웁니다. 다운로드된 음악 파일은 삭제되지 않습니다", + "cacheClearConfirmMessage": "'{target}'의 캐시된 데이터를 지웁니다. 다운로드된 음악 파일은 삭제되지 않습니다", "@cacheClearConfirmMessage": { "description": "Dialog message before clearing selected cache", "placeholders": { @@ -3282,11 +3381,11 @@ "@trackReEnrichFieldBasicTags": { "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" }, - "trackReEnrichFieldTrackInfo": "트랙 & 디스크 번호", + "trackReEnrichFieldTrackInfo": "트랙 및 디스크 번호", "@trackReEnrichFieldTrackInfo": { "description": "Checkbox label for track info in re-enrich" }, - "trackReEnrichFieldReleaseInfo": "데이터 & ISRC", + "trackReEnrichFieldReleaseInfo": "데이터 및 ISRC", "@trackReEnrichFieldReleaseInfo": { "description": "Checkbox label for release info in re-enrich" }, @@ -3378,7 +3477,7 @@ "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" }, - "trackCoverSaved": "앨범 커버가 ''{fileName}''에 저장됨", + "trackCoverSaved": "앨범 커버가 '{fileName}'에 저장됨", "@trackCoverSaved": { "description": "Snackbar after cover art saved", "placeholders": { @@ -3391,7 +3490,7 @@ "@trackCoverNoSource": { "description": "Snackbar when no cover art URL or embedded cover" }, - "trackLyricsSaved": "가사가 ''{fileName}''에 저장됨", + "trackLyricsSaved": "가사가 '{fileName}'에 저장됨", "@trackLyricsSaved": { "description": "Snackbar after lyrics saved", "placeholders": { @@ -3585,7 +3684,7 @@ "@cueSplitConfirmTitle": { "description": "CUE split confirmation dialog title" }, - "cueSplitConfirmMessage": "''{album}''을 {count} 개의 개별 FLAC 파일로 분할하시겠습니까?\n\n파일은 동일한 디렉토리에 저장됩니다", + "cueSplitConfirmMessage": "'{album}'을 {count} 개의 개별 FLAC 파일로 분할하시겠습니까?\n\n파일은 동일한 디렉토리에 저장됩니다", "@cueSplitConfirmMessage": { "description": "CUE split confirmation dialog message", "placeholders": { @@ -3684,7 +3783,7 @@ } } }, - "collectionAddedToPlaylist": "''{playlistName}''에 추가됨", + "collectionAddedToPlaylist": "'{playlistName}'에 추가됨", "@collectionAddedToPlaylist": { "description": "Snackbar after adding track to playlist", "placeholders": { @@ -3693,7 +3792,7 @@ } } }, - "collectionAlreadyInPlaylist": "이미 ''{playlistName}''에 있음", + "collectionAlreadyInPlaylist": "이미 '{playlistName}'에 있음", "@collectionAlreadyInPlaylist": { "description": "Snackbar when track already exists in playlist", "placeholders": { @@ -3762,7 +3861,7 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionAddedToLoved": "''{trackName}''이 '좋아요 표시한 음악'에 추가됨", + "collectionAddedToLoved": "'{trackName}'이 '좋아요 표시한 음악'에 추가됨", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", "placeholders": { @@ -3771,7 +3870,7 @@ } } }, - "collectionRemovedFromLoved": "''{trackName}''이 '좋아요 표시한 음악'에서 제거됨", + "collectionRemovedFromLoved": "'{trackName}'이 '좋아요 표시한 음악'에서 제거됨", "@collectionRemovedFromLoved": { "description": "Snackbar after removing track from loved folder", "placeholders": { @@ -3780,7 +3879,7 @@ } } }, - "collectionAddedToWishlist": "''{trackName}''가 위시리스트에 추가됨", + "collectionAddedToWishlist": "'{trackName}'가 위시리스트에 추가됨", "@collectionAddedToWishlist": { "description": "Snackbar after adding track to wishlist", "placeholders": { @@ -3789,7 +3888,7 @@ } } }, - "collectionRemovedFromWishlist": "''{trackName}''가 위시리스트에서 제거됨", + "collectionRemovedFromWishlist": "'{trackName}'가 위시리스트에서 제거됨", "@collectionRemovedFromWishlist": { "description": "Snackbar after removing track from wishlist", "placeholders": { @@ -3798,7 +3897,7 @@ } } }, - "collectionAddedToFavoriteArtists": "''{artistName}''가 좋아하는 아티스트에 추가됨", + "collectionAddedToFavoriteArtists": "'{artistName}'가 좋아하는 아티스트에 추가됨", "@collectionAddedToFavoriteArtists": { "description": "Snackbar after adding artist to favorite artists", "placeholders": { @@ -3807,7 +3906,7 @@ } } }, - "collectionRemovedFromFavoriteArtists": "''{artistName}''가 좋아하는 아티스트에서 제거됨", + "collectionRemovedFromFavoriteArtists": "'{artistName}'가 좋아하는 아티스트에서 제거됨", "@collectionRemovedFromFavoriteArtists": { "description": "Snackbar after removing artist from favorite artists", "placeholders": { @@ -3979,7 +4078,7 @@ } } }, - "lyricsProvidersAtLeastOne": "최소 한 명의 제공자가 활성화된 상태로 유지되어야 합니다", + "lyricsProvidersAtLeastOne": "최소 한 개의 제공자가 활성화된 상태로 유지되어야 합니다", "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" }, @@ -4043,7 +4142,7 @@ "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, - "settingsBackup": "백업 & 복원", + "settingsBackup": "백업 및 복원", "@settingsBackup": { "description": "Settings menu item - backup and restore page" }, @@ -4051,7 +4150,7 @@ "@settingsBackupSubtitle": { "description": "Subtitle for backup and restore settings item" }, - "backupTitle": "백업 & 복원", + "backupTitle": "백업 및 복원", "@backupTitle": { "description": "App bar title for the backup and restore page" }, @@ -4330,7 +4429,7 @@ "@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": "'{artist}', '{title}', '{album}', '{track}', '{year}', '{date}', '{disc}'를 자리표시자로 사용하세요", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" }, @@ -4597,7 +4696,7 @@ } } }, - "editMetadataAutoFillFetch": "가져오기 & 채우기", + "editMetadataAutoFillFetch": "가져오기 및 채우기", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" }, @@ -4910,6 +5009,61 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "스펙트럼과 활성 비트 깊이를 검사하여 업샘플링 또는 패딩의 징후를 확인합니다", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "대역폭이 제한됨", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "업샘플링 또는 패딩이 감지되지 않음", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "추정되는 컷오프 주파수", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "활성화된 / 저장된 비트", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "더 낮은 컷오프는 마스터링 과정에서 발생할 수 있습니다. 이것만으로 업샘플링이라고 단정할 수는 없습니다", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "{seconds} 초 분량의 오디오를 기반으로 분석하였습니다. 이 분석만으로 원본 마스터를 인증할 수는 없습니다", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "스펙트럼에 업샘플링과 일치하는 미러링된 대역이 나타납니다", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "{cutoff} 부근에서 급격한 롤오프가 나타나며, 측정된 노이즈 플로어를 고려하면 더 낮은 샘플레이트의 소스에서 비롯되었을 가능성이 있습니다", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "{cutoff} 이상의 에너지는 분석 구간에서 대부분 일정하며, 노이즈일 가능성이 있습니다", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "업샘플링되었거나 비트 패딩된 가짜 Hi-Res 파일을 감지합니다", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" @@ -5032,7 +5186,7 @@ "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" }, - "cancelDownloadContent": "''{trackName}''에 대한 활성 다운로드를 취소합니다", + "cancelDownloadContent": "'{trackName}'에 대한 활성 다운로드를 취소합니다", "@cancelDownloadContent": { "description": "Dialog body when confirming cancellation of an active download", "placeholders": { @@ -5070,7 +5224,7 @@ } } }, - "notifDownloadingTrack": "''{trackName}''를 다운로드하는 중", + "notifDownloadingTrack": "'{trackName}'를 다운로드하는 중", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", "placeholders": { @@ -5079,7 +5233,7 @@ } } }, - "notifFinalizingTrack": "''{trackName}''를 마무리하는 중", + "notifFinalizingTrack": "'{trackName}'를 마무리하는 중", "@notifFinalizingTrack": { "description": "Notification title while finalizing (embedding metadata) a track", "placeholders": { @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "라이브러리 스캔이 일시 중지됨", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} 개의 파일을 스캔하였습니다. 여기에서 계속하려면 로컬 라이브러리 설정에서 다시 시작하세요", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "SpotiFLAC Mobile v{version}을 다운로드하는 중", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -5581,7 +5748,7 @@ "@setupChangeFolderTooltip": { "description": "Tooltip for editing the selected download folder" }, - "a11yOpenTrackByArtist": "''{artistName}''의 트랙 ''{trackName}'' 열기", + "a11yOpenTrackByArtist": "'{artistName}'의 트랙 '{trackName}' 열기", "@a11yOpenTrackByArtist": { "description": "Accessibility label for opening a track item", "placeholders": { @@ -5617,7 +5784,7 @@ } } }, - "a11yOpenAlbumByArtistTrackCount": "''{artistName}''의 앨범 ''{albumName}'' 열기 ({trackCount} 번째 곡)", + "a11yOpenAlbumByArtistTrackCount": "'{artistName}'의 앨범 '{albumName}' 열기 ({trackCount} 번째 곡)", "@a11yOpenAlbumByArtistTrackCount": { "description": "Accessibility label for opening an album item with track count", "placeholders": { @@ -5632,7 +5799,7 @@ } } }, - "a11yTrackByArtist": "''{artistName}''의 ''{trackName}''", + "a11yTrackByArtist": "'{artistName}'의 '{trackName}'", "@a11yTrackByArtist": { "description": "Accessibility label for a queue or list track item", "placeholders": { @@ -5644,7 +5811,7 @@ } } }, - "a11ySelectAlbum": "앨범 ''{albumName}'' 선택", + "a11ySelectAlbum": "앨범 '{albumName}' 선택", "@a11ySelectAlbum": { "description": "Accessibility label for selecting an album", "placeholders": { @@ -5653,7 +5820,7 @@ } } }, - "a11yOpenAlbum": "앨범 ''{albumName}'' 열기", + "a11yOpenAlbum": "앨범 '{albumName}' 열기", "@a11yOpenAlbum": { "description": "Accessibility label for opening an album", "placeholders": { @@ -5662,7 +5829,7 @@ } } }, - "settingsFiles": "파일 & 폴더", + "settingsFiles": "파일 및 폴더", "@settingsFiles": { "description": "Settings menu item - file and folder settings" }, @@ -5933,7 +6100,7 @@ "@a11yDeselectTrack": { "description": "Accessibility label for deselecting a track" }, - "a11yPlayTrackByArtist": "''{artistName}''의 ''{trackName}'' 재생", + "a11yPlayTrackByArtist": "'{artistName}'의 '{trackName}' 재생", "@a11yPlayTrackByArtist": { "description": "Accessibility label for playing a local library track", "placeholders": { @@ -6266,7 +6433,7 @@ "@libraryBuiltInPreviewPlayer": { "description": "Setting option to use the built-in preview player" }, - "libraryBuiltInPreviewPlayerSubtitle": "SpotiFLAC Mobile 내에서 빠른 로컬 미리 보기", + "libraryBuiltInPreviewPlayerSubtitle": "SpotiFLAC Mobile에서 빠르게 미리 들을 수 있습니다 ", "@libraryBuiltInPreviewPlayerSubtitle": { "description": "Subtitle for built-in preview player option" }, @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "다음 곡", + "nowPlayingAudioOutput": "오디오 출력", + "nowPlayingWrittenBy": "작성자: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "가사: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "티켓 구매", + "concertSetList": "콘서트 세트리스트", + "concertSetListButton": "세트리스트", + "concertAddToCalendar": "캘린더에 추가", + "concertOpenMaps": "지도 열기", + "concertDetailsUnavailable": "콘서트 세부 정보를 현재 사용할 수 없습니다", + "concertCalendarUnavailable": "캘린더를 열 수 없습니다", + "nowPlayingAudioOutputUnavailable": "오디오 출력 설정을 열 수 없습니다", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "이 파일에는 가사가 없음", + "nowPlayingInstrumental": "연주곡", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "가시 언어 옵션", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "발음 숨기기", + "nowPlayingShowPronunciation": "발음 보기", + "nowPlayingHideTranslation": "번역 숨기기", + "nowPlayingShowTranslation": "번역 보기", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6475,7 +6679,7 @@ "@snackbarAddedToQueueGeneric": { "description": "Snackbar when a track is added to the playback queue without naming it" }, - "selectionDeletePlaylistsCount": "{count} {count, plural, =1{재생목록} other{재생목록}} 삭제", + "selectionDeletePlaylistsCount": "{count} 개의 {count, plural, =1{재생목록} other{재생목록}} 삭제", "@selectionDeletePlaylistsCount": { "description": "Button label for deleting multiple selected playlists", "placeholders": { @@ -6560,7 +6764,7 @@ "@trackAddToQueue": { "description": "Menu action to add a track to the playback queue" }, - "snackbarExtensionInstalledEnable": "''{extensionName}''이 설치됨. '설정 > 확장 기능'에서 활성화하세요", + "snackbarExtensionInstalledEnable": "'{extensionName}'이 설치됨. '설정 > 확장 기능'에서 활성화하세요", "@snackbarExtensionInstalledEnable": { "description": "Snackbar after installing an extension from the repo tab", "placeholders": { @@ -6569,7 +6773,7 @@ } } }, - "snackbarExtensionUpdatedVersion": "''{extensionName}''이 v{version}으로 업데이트됨", + "snackbarExtensionUpdatedVersion": "'{extensionName}'이 v{version}으로 업데이트됨", "@snackbarExtensionUpdatedVersion": { "description": "Snackbar after updating an extension from the repo tab", "placeholders": { @@ -6728,7 +6932,7 @@ "@settingsSearchHint": { "description": "Placeholder of the search field on the Settings tab" }, - "settingsSearchNoResults": "\"{query}\"과 일치하는 설정이 없음", + "settingsSearchNoResults": "'{query}'과 일치하는 설정이 없음", "@settingsSearchNoResults": { "description": "Shown when a Settings search returns nothing", "placeholders": { @@ -6737,15 +6941,15 @@ } } }, - "settingsGroupInterface": "확장 기능 & 디자인", + "settingsGroupInterface": "확장 기능 및 디자인", "@settingsGroupInterface": { "description": "Settings group covering look and feel" }, - "settingsGroupContent": "콘텐츠 & 메타데이터", + "settingsGroupContent": "콘텐츠 및 메타데이터", "@settingsGroupContent": { "description": "Settings group covering the library, metadata and lyrics" }, - "settingsGroupDownloads": "다운로드 & 파일", + "settingsGroupDownloads": "다운로드 및 파일", "@settingsGroupDownloads": { "description": "Settings group covering download behaviour and storage" }, @@ -6753,7 +6957,7 @@ "@settingsGroupSystem": { "description": "Settings group covering app-level data, cache and logs" }, - "settingsGroupHelp": "정보 & 후원", + "settingsGroupHelp": "정보 및 후원", "@settingsGroupHelp": { "description": "Settings group covering the about page and donations" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "리플레이게인 누락", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "트랙 제목 복사", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6806,8 +7014,11 @@ "description": "Selected state of the compact favorite action" }, "autoMixDescription": "곡을 비트에 맞춰 믹싱하고, 음정은 유지한 채 템포를 조절합니다. 비트를 맞출 수 없는 경우에는 크로스페이드를 사용합니다", - "autoMixOn": "자동믹스 켜짐", - "autoMixOff": "자동믹스 꺼짐", + "autoMixOn": "AutoMix 켜기", + "autoMixOff": "AutoMix 끄기", + "autoplayOn": "자동재생 켜기", + "autoplayOff": "자동재생 끄기", + "autoplayFromLibrary": "라이브러리에서 자동재생", "profileTitle": "프로필", "profileSetUp": "프로필 설정", "profileEdit": "이름 및 사진 편집", @@ -6818,8 +7029,11 @@ "profileRemovePhoto": "사진 삭제", "profilePhotoError": "20MB보다 작은 유효한 이미지를 선택하세요", "profileSaveError": "프로필을 저장할 수 없습니다. 다시 시도하세요", + "artistUpcomingConcerts": "예정된 콘서트", + "artistAllUpcomingConcerts": "모든 예정된 콘서트", + "artistNoUpcomingConcerts": "예정된 콘서트가 없습니다", "optionsEmbeddedCoverSizeOriginal": "원본 해상도", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" } -} +} \ No newline at end of file diff --git a/lib/l10n/arb/app_nl.arb b/lib/l10n/arb/app_nl.arb index efc2f2e3..6123021a 100644 --- a/lib/l10n/arb/app_nl.arb +++ b/lib/l10n/arb/app_nl.arb @@ -1,4 +1,31 @@ { + "settingsPlaybackSubtitle": "Player, volume, AutoMix, and audio output", + "sectionPlayer": "Player", + "sectionVolumeAndTransitions": "Volume and transitions", + "sectionAudioOutput": "Audio output", + "usbBitPerfect": "Hi-res and bit-perfect audio", + "usbBitPerfectDescription": "Preserve source precision on compatible outputs. Choose direct USB or AAudio exclusive below; otherwise Android USB output requires Android 14 or later. Applies from the next track, without AutoMix or normalization. System volume may not control direct USB.", + "usbHardwareVolume": "DAC hardware volume", + "usbVolumeWarningTitle": "Check your listening volume", + "usbVolumeWarning": "Direct USB audio can be much louder than normal playback, and phone volume buttons may not control it. Lower your DAC or amplifier volume before starting. When supported, SpotiFLAC sets the DAC to at most −40 dB on connection; this does not guarantee a safe listening level on every amplifier or headphone.", + "usbVolumeAccept": "I understand", + "usbVolumeUnavailable": "Playback is paused because this DAC has no verified hardware volume control. Lower the DAC or amplifier volume, then enable fixed-volume output if needed and select the track again.", + "usbFixedVolume": "Allow fixed-volume USB output", + "usbFixedVolumeDescription": "For DACs without a volume control accessible to the app. Keep off for USB headsets without their own volume control. Applies from the next track.", + "usbFixedVolumeWarning": "The app cannot lower the volume on this output. Audio may start at full level, and the phone volume slider will not help. Only continue after lowering the volume on your DAC or external amplifier. Do not enable this for a headset without its own volume control.", + "dapExclusive": "DAP hi-res (AAudio exclusive)", + "dapExclusiveDescription": "Use Oboe/AAudio at the track's original rate and precision for FLAC/WAV PCM. Requires Android 8.1 or later and compatible hardware. Exclusive access is checked; unavailable formats use normal playback. DSD requires the direct USB driver. Applies from the next track.", + "dapExclusiveUnavailable": "AAudio exclusive access is unavailable for this track and current output. Using normal playback. For a USB DAC, try the direct USB driver.", + "usbDirect": "Direct USB driver", + "usbDirectDescription": "Use exclusive USB audio for FLAC/WAV, DSF/DFF and WavPack DSD, with Android USB permission. Native DSD requires a recognized compatible DAC. Other PCM formats use normal playback. Applies from the next track.", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "Enable only if your DAC explicitly supports DoP. Sends DSF/DFF and WavPack DSD inside a PCM carrier when native DSD is unavailable. An incompatible device may play noise; leave off for ordinary USB headsets.", + "usbDsdUnsupported": "This DSD format or connected DAC is not supported. Playback stopped.", + "usbPermissionDenied": "USB permission was not granted. Using normal playback.", + "usbBitPerfectPending": "Waiting for the next track and a compatible USB output.", + "usbBitPerfectNoDevice": "No USB DAC connected. Using normal audio output.", + "usbBitPerfectFallback": "This device or audio format does not support bit-perfect output. Using normal playback.", + "usbBitPerfectRouteChanged": "The USB audio route changed. Playback paused; select a track to reconnect.", "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Make it\nyour own.", "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", @@ -36,6 +63,32 @@ "description": "System volume control label in the Mornye player" }, "appearanceStyle": "App Style", + "appearanceAccentRed": "Red (default)", + "appearanceAccentOrange": "Orange", + "appearanceAccentGreen": "Green", + "appearanceAccentTeal": "Teal", + "appearanceAccentBlue": "Blue", + "appearanceAccentPurple": "Purple", + "appearanceAccentPink": "Pink", + "appearanceGlassClarity": "Glass clarity", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Tinted", + "appearanceGlassClear": "Clear", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Use system font", + "appearanceUseSystemFontSubtitle": "Use your device’s default typeface for app text.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Remove ReplayGain", + "trackRemoveReplayGainSuccess": "ReplayGain tags removed", + "trackRemoveReplayGainFailed": "Failed to remove ReplayGain tags", + "replayGainRemoving": "Removing ReplayGain...", + "replayGainRemoveConfirmMessage": "Remove track and album ReplayGain tags from {count} track(s)? Audio, artwork, and other metadata will be preserved.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Remove RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain removed from {success} of {total} tracks", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "Extension Repo", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "Lyrics Mode", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% of {total} files", "@libraryScanProgress": { "description": "Scan progress display", @@ -4910,6 +5009,61 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "Inspect the spectrum and active bit depth for signs of upsampling or padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Limited bandwidth", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No upsampling or padding detected", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Estimated cutoff", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Active / stored bits", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "A lower cutoff can come from mastering. It does not, by itself, prove upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Based on {seconds} seconds of audio. This analysis cannot certify the original master.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "The spectrum contains mirrored bands consistent with upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "A sharp roll-off near {cutoff} and the measured noise floor suggest a lower-rate source.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energy above {cutoff} is mostly steady in the analyzed segment and may be noise.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Up next", + "nowPlayingAudioOutput": "Audio Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Get Tickets", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Open Maps", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Lyrics language options", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Hide Pronunciation", + "nowPlayingShowPronunciation": "Show Pronunciation", + "nowPlayingHideTranslation": "Hide Translation", + "nowPlayingShowTranslation": "Show Translation", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copy track name", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6808,6 +7016,9 @@ "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", "autoMixOn": "AutoMix on", "autoMixOff": "AutoMix off", + "autoplayOn": "Autoplay on", + "autoplayOff": "Autoplay off", + "autoplayFromLibrary": "Autoplay from your Library", "profileTitle": "Profile", "profileSetUp": "Set up your profile", "profileEdit": "Edit name and photo", @@ -6818,8 +7029,11 @@ "profileRemovePhoto": "Remove photo", "profilePhotoError": "Choose a valid image smaller than 20 MB.", "profileSaveError": "Could not save your profile. Please try again.", + "artistUpcomingConcerts": "Upcoming Concerts", + "artistAllUpcomingConcerts": "All Upcoming Concerts", + "artistNoUpcomingConcerts": "No upcoming concerts.", "optionsEmbeddedCoverSizeOriginal": "Original resolution", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" } -} +} \ No newline at end of file diff --git a/lib/l10n/arb/app_pt_PT.arb b/lib/l10n/arb/app_pt_PT.arb index f8abd485..0159ab9b 100644 --- a/lib/l10n/arb/app_pt_PT.arb +++ b/lib/l10n/arb/app_pt_PT.arb @@ -1,4 +1,31 @@ { + "settingsPlaybackSubtitle": "Player, volume, AutoMix, and audio output", + "sectionPlayer": "Player", + "sectionVolumeAndTransitions": "Volume and transitions", + "sectionAudioOutput": "Audio output", + "usbBitPerfect": "Hi-res and bit-perfect audio", + "usbBitPerfectDescription": "Preserve source precision on compatible outputs. Choose direct USB or AAudio exclusive below; otherwise Android USB output requires Android 14 or later. Applies from the next track, without AutoMix or normalization. System volume may not control direct USB.", + "usbHardwareVolume": "DAC hardware volume", + "usbVolumeWarningTitle": "Check your listening volume", + "usbVolumeWarning": "Direct USB audio can be much louder than normal playback, and phone volume buttons may not control it. Lower your DAC or amplifier volume before starting. When supported, SpotiFLAC sets the DAC to at most −40 dB on connection; this does not guarantee a safe listening level on every amplifier or headphone.", + "usbVolumeAccept": "I understand", + "usbVolumeUnavailable": "Playback is paused because this DAC has no verified hardware volume control. Lower the DAC or amplifier volume, then enable fixed-volume output if needed and select the track again.", + "usbFixedVolume": "Allow fixed-volume USB output", + "usbFixedVolumeDescription": "For DACs without a volume control accessible to the app. Keep off for USB headsets without their own volume control. Applies from the next track.", + "usbFixedVolumeWarning": "The app cannot lower the volume on this output. Audio may start at full level, and the phone volume slider will not help. Only continue after lowering the volume on your DAC or external amplifier. Do not enable this for a headset without its own volume control.", + "dapExclusive": "DAP hi-res (AAudio exclusive)", + "dapExclusiveDescription": "Use Oboe/AAudio at the track's original rate and precision for FLAC/WAV PCM. Requires Android 8.1 or later and compatible hardware. Exclusive access is checked; unavailable formats use normal playback. DSD requires the direct USB driver. Applies from the next track.", + "dapExclusiveUnavailable": "AAudio exclusive access is unavailable for this track and current output. Using normal playback. For a USB DAC, try the direct USB driver.", + "usbDirect": "Direct USB driver", + "usbDirectDescription": "Use exclusive USB audio for FLAC/WAV, DSF/DFF and WavPack DSD, with Android USB permission. Native DSD requires a recognized compatible DAC. Other PCM formats use normal playback. Applies from the next track.", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "Enable only if your DAC explicitly supports DoP. Sends DSF/DFF and WavPack DSD inside a PCM carrier when native DSD is unavailable. An incompatible device may play noise; leave off for ordinary USB headsets.", + "usbDsdUnsupported": "This DSD format or connected DAC is not supported. Playback stopped.", + "usbPermissionDenied": "USB permission was not granted. Using normal playback.", + "usbBitPerfectPending": "Waiting for the next track and a compatible USB output.", + "usbBitPerfectNoDevice": "No USB DAC connected. Using normal audio output.", + "usbBitPerfectFallback": "This device or audio format does not support bit-perfect output. Using normal playback.", + "usbBitPerfectRouteChanged": "The USB audio route changed. Playback paused; select a track to reconnect.", "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Make it\nyour own.", "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", @@ -36,6 +63,32 @@ "description": "System volume control label in the Mornye player" }, "appearanceStyle": "App Style", + "appearanceAccentRed": "Red (default)", + "appearanceAccentOrange": "Orange", + "appearanceAccentGreen": "Green", + "appearanceAccentTeal": "Teal", + "appearanceAccentBlue": "Blue", + "appearanceAccentPurple": "Purple", + "appearanceAccentPink": "Pink", + "appearanceGlassClarity": "Glass clarity", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Tinted", + "appearanceGlassClear": "Clear", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Use system font", + "appearanceUseSystemFontSubtitle": "Use your device’s default typeface for app text.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Remove ReplayGain", + "trackRemoveReplayGainSuccess": "ReplayGain tags removed", + "trackRemoveReplayGainFailed": "Failed to remove ReplayGain tags", + "replayGainRemoving": "Removing ReplayGain...", + "replayGainRemoveConfirmMessage": "Remove track and album ReplayGain tags from {count} track(s)? Audio, artwork, and other metadata will be preserved.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Remove RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain removed from {success} of {total} tracks", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "Repositório de extensões", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "Modo de Letras", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% of {total} files", "@libraryScanProgress": { "description": "Scan progress display", @@ -4910,6 +5009,61 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "Inspect the spectrum and active bit depth for signs of upsampling or padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Limited bandwidth", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No upsampling or padding detected", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Estimated cutoff", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Active / stored bits", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "A lower cutoff can come from mastering. It does not, by itself, prove upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Based on {seconds} seconds of audio. This analysis cannot certify the original master.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "The spectrum contains mirrored bands consistent with upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "A sharp roll-off near {cutoff} and the measured noise floor suggest a lower-rate source.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energy above {cutoff} is mostly steady in the analyzed segment and may be noise.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Up next", + "nowPlayingAudioOutput": "Audio Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Get Tickets", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Open Maps", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Lyrics language options", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Hide Pronunciation", + "nowPlayingShowPronunciation": "Show Pronunciation", + "nowPlayingHideTranslation": "Hide Translation", + "nowPlayingShowTranslation": "Show Translation", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copy track name", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6808,6 +7016,9 @@ "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", "autoMixOn": "AutoMix on", "autoMixOff": "AutoMix off", + "autoplayOn": "Autoplay on", + "autoplayOff": "Autoplay off", + "autoplayFromLibrary": "Autoplay from your Library", "profileTitle": "Profile", "profileSetUp": "Set up your profile", "profileEdit": "Edit name and photo", @@ -6818,6 +7029,9 @@ "profileRemovePhoto": "Remove photo", "profilePhotoError": "Choose a valid image smaller than 20 MB.", "profileSaveError": "Could not save your profile. Please try again.", + "artistUpcomingConcerts": "Upcoming Concerts", + "artistAllUpcomingConcerts": "All Upcoming Concerts", + "artistNoUpcomingConcerts": "No upcoming concerts.", "optionsEmbeddedCoverSizeOriginal": "Original resolution", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" diff --git a/lib/l10n/arb/app_ru.arb b/lib/l10n/arb/app_ru.arb index 5487de86..3713993b 100644 --- a/lib/l10n/arb/app_ru.arb +++ b/lib/l10n/arb/app_ru.arb @@ -1,30 +1,57 @@ { + "settingsPlaybackSubtitle": "Воспроизведение, громкость, автомикс и аудиовыход", + "sectionPlayer": "Плеер", + "sectionVolumeAndTransitions": "Громкость и переходы", + "sectionAudioOutput": "Аудиовыход", + "usbBitPerfect": "Hi-Res и Bit-perfect", + "usbBitPerfectDescription": "Сохранение исходной точности для поддерживаемых выходов. Ниже выберите прямой USB-выход или эксклюзивный режим AAudio; в противном случае для вывода USB требуется Android 14 или новее. Параметр применяется со следующего трека без учета AutoMix и нормализации. Системная громкость может не регулировать прямой вывод USB.", + "usbHardwareVolume": "Аппаратная громкость ЦАПа", + "usbVolumeWarningTitle": "Проверьте уровень громкости", + "usbVolumeWarning": "Прямое воспроизведение через USB-аудио может быть намного громче стандартного, а аппаратные кнопки громкости могут его не регулировать. Снизьте громкость на вашем ЦАП или усилителе до начала воспроизведения. Когда устройство поддерживается, SpotiFLAC при подключении выставляет на ЦАП уровень не выше −40 дБ, но это не гарантирует безопасную громкость на каждом усилителе или наушниках.", + "usbVolumeAccept": "Я понимаю", + "usbVolumeUnavailable": "Воспроизведение приостановлено, так как у данного ЦАП не обнаружено проверенного аппаратного управления громкостью. Уменьшите громкость на ЦАП или усилителе, при необходимости включите вывод с фиксированной громкостью и выберите трек заново.", + "usbFixedVolume": "Разрешить вывод по USB с фиксированной громкостью", + "usbFixedVolumeDescription": "Предназначено для ЦАП, у которых приложение не имеет доступа к управлению громкостью. Не используйте для USB-гарнитур без собственной регулировки громкости. Вступает в силу со следующего трека.", + "usbFixedVolumeWarning": "Приложению недоступно снижение громкости на этом аудиовыходе. Звук может быть на максимальной мощности, а регулятор громкости смартфона не поможет. Продолжайте лишь после того, как убавите громкость на ЦАП или внешнем усилителе. Не активируйте для наушников/гарнитур без встроенного регулятора громкости.", + "dapExclusive": "DAP Hi-Res (эксклюзив AAudio)", + "dapExclusiveDescription": "Используйте Oboe/AAudio с исходной частотой дискретизации и точностью трека для форматов FLAC/WAV PCM. Требуется Android 8.1 или более поздней версии и совместимое оборудование. Эксклюзивный доступ проверен; для недоступных форматов используется обычное воспроизведение. Для DSD требуется драйвер прямого USB-подключения. Применяется со следующего трека.", + "dapExclusiveUnavailable": "Эксклюзивный режим AAudio недоступен для данного трека и выбранного аудиовыхода. Применяется стандартное воспроизведение. При использовании USB-ЦАП попробуйте задействовать прямой USB-драйвер.", + "usbDirect": "Прямой USB драйвер", + "usbDirectDescription": "Использовать эксклюзивный вывод звука по USB для FLAC/WAV, DSF/DFF и WavPack DSD с разрешением Android USB. Для нативного DSD требуется распознанный совместимый ЦАП. Остальные форматы PCM воспроизводятся стандартным способом. Применяется со следующего трека.", + "usbDsdOverPcm": "DSD через PCM (DoP)", + "usbDsdOverPcmDescription": "Включайте только в том случае, если ваш ЦАП явно поддерживает DoP. Передает DSF/DFF и WavPack DSD внутри контейнера PCM, когда нативный DSD недоступен. Несовместимое устройство может воспроизводить шум; оставляйте выключенным для обычных USB-гарнитур.", + "usbDsdUnsupported": "Этот формат DSD или подключенный ЦАП не поддерживается. Воспроизведение остановлено.", + "usbPermissionDenied": "Разрешение на USB не получено. Используется обычное воспроизведение.", + "usbBitPerfectPending": "Ожидание следующего трека и совместимого USB-выхода.", + "usbBitPerfectNoDevice": "USB ЦАП не подключен. Используется обычный аудиовыход.", + "usbBitPerfectFallback": "Это устройство или аудиоформат не поддерживает вывод bit-perfect. Используется обычное воспроизведение.", + "usbBitPerfectRouteChanged": "Маршрут USB-аудио изменился. Воспроизведение приостановлено; выберите трек для повторного подключения.", "upgradeIntroWelcome": "Добро пожаловать в SpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Создайте свой\nсобственный стиль.", "upgradeIntroThemeBody": "Выберите внешний вид. Изменения применятся сразу, и вы можете потом изменить его позже в настройках.", "upgradeIntroThemeMaterialBody": "Привычный интерфейс с элементами Material и вашим акцентным цветом.", "upgradeIntroThemeMornyeBody": "Эффект стекла в навигации, обновленная медиатека и плеер с эффектом погружения.", "upgradeIntroRustTitle": "Новый движок построенный на Rust.", - "upgradeIntroRustBody": "В 5.0 бэкенд приложения переехал из Go to Rust. Это движок, работающий за экранами, которые вы используете каждый день.", - "upgradeIntroRustEngineTitle": "Работа за сценой", - "upgradeIntroRustEngineBody": "Rust обеспечивает обработку загрузок, аудиометаданных, сканирование библиотек и выполнение расширений на Android и iOS.", + "upgradeIntroRustBody": "В 5.0 бэкенд приложения переехал из Go to Rust. Это движок, работающий за экраном, который вы используете каждый день.", + "upgradeIntroRustEngineTitle": "Работа за кулисами", + "upgradeIntroRustEngineBody": "Rust обеспечивает обработку загрузок, аудиометаданных, сканирование медиатеки и выполнение расширений на Android и iOS.", "upgradeIntroRustMemoryTitle": "Больше осторожности с памятью", "upgradeIntroRustMemoryBody": "Повторное использование буферов и сокращение количества копий позволяют уменьшить количество временных выделений памяти при обработке графических объектов и данных расширений.", - "upgradeIntroRustKeepTitle": "Keep your music", + "upgradeIntroRustKeepTitle": "Вся ваша музыка останется с вами", "upgradeIntroRustKeepBody": "Скачивать медиатеку заново не придётся. Ваша музыка и настройки на месте, повторная настройка не нужна.", "upgradeIntroWelcomeBody": "Быстро расскажем, что изменилось и где это искать.", "upgradeIntroMornyeBody": "Новый облик плеера, экрана текстов песен и навигации.", "upgradeIntroLibrarySummary": "Просматривайте свою музыку по плейлистам, исполнителям или альбомам.", "upgradeIntroRepoSummary": "Выбирайте источники музыки и провайдеров с помощью расширений.", "upgradeIntroLibraryTitle": "Познакомьтесь со\nсвоей медиатекой.", - "upgradeIntroLibraryBody": "In Mornye, browse by category or find your albums in Recently Added.", + "upgradeIntroLibraryBody": "В Mornye вы можете просматривать треки по категориям или находить свои альбомы в разделе \"Недавно добавленные\".", "upgradeIntroDownloadsBody": "Управляйте загрузками в правом верхнем углу. Готовая музыка переносится в «Недавно добавленные».", "upgradeIntroSearchBody": "Здесь можно искать сохраненную музыку. На отдельной вкладке «Поиск» осуществляется поиск по вашим расширениям.", "upgradeIntroPlayerTitle": "Настройте\nсвой плеер.", "upgradeIntroPlayerBody": "Вы можете в любой момент изменить тему и настройки воспроизведения. Вот где их найти.", - "upgradeIntroAppearanceBody": "Change themes in Settings → Appearance. In Mornye, scroll down for compact navigation; scroll up to expand it.", + "upgradeIntroAppearanceBody": "Изменить тему можно в меню «Настройки» → «Внешний вид». В Mornye прокрутите вниз для компактного вида навигации или вверх, чтобы развернуть её.", "upgradeIntroAutoMixBody": "Синхронизировать темп и ритм между треками. Включить эту функцию можно в разделе «Настройки» → «Локальная медиатека» → «Воспроизведение». По умолчанию эта функция отключена.", - "upgradeIntroSettingsBody": "In Mornye, tap your profile on Home to open Settings and edit your name and photo.", + "upgradeIntroSettingsBody": "В Mornye нажмите на свой профиль на главной странице для открытия настроек и изменения вашего имени и фото.", "upgradeIntroSkip": "Пропустить", "upgradeIntroContinue": "Далее", "upgradeIntroDone": "Начать слушать", @@ -36,6 +63,32 @@ "description": "System volume control label in the Mornye player" }, "appearanceStyle": "Стиль приложения", + "appearanceAccentRed": "Красный (по умолчанию)", + "appearanceAccentOrange": "Оранжевый", + "appearanceAccentGreen": "Зелёный", + "appearanceAccentTeal": "Морской", + "appearanceAccentBlue": "Синий", + "appearanceAccentPurple": "Фиолетовый", + "appearanceAccentPink": "Розовый", + "appearanceGlassClarity": "Glass clarity", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Tinted", + "appearanceGlassClear": "Clear", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Использовать системный шрифт", + "appearanceUseSystemFontSubtitle": "Использовать системный шрифт вашего устройства для текста приложения.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Удалить ReplayGain", + "trackRemoveReplayGainSuccess": "Теги ReplayGain удалены", + "trackRemoveReplayGainFailed": "Не удалось удалить теги ReplayGain", + "replayGainRemoving": "Удаление ReplayGain...", + "replayGainRemoveConfirmMessage": "Удалить теги ReplayGain трека и альбома для {count, plural, one {{count} трека} other {{count} треков}}? Аудио, обложки и другие метаданные будут сохранены.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Удалить RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain удален из {success} из {total, plural, one {{total} трека} few {{total} треков} many {{total} треков} other {{total} треков}}", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -302,11 +387,11 @@ "@optionsArtistTagModeDescription": { "description": "Bottom-sheet description for artist tag mode setting" }, - "optionsArtistTagModeJoined": "Single joined value", + "optionsArtistTagModeJoined": "Объединять в одну строку", "@optionsArtistTagModeJoined": { "description": "Artist tag mode option that joins multiple artists into one value" }, - "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", + "optionsArtistTagModeJoinedSubtitle": "Записывать исполнителей через запятую для максимальной совместимости с плеерами.", "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, @@ -314,11 +399,19 @@ "@optionsArtistTagModeSplitVorbis": { "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" }, - "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", + "optionsArtistTagModeSplitVorbisSubtitle": "Один тег на исполнителя для FLAC/Opus; Для MP3/M4A — один общий.", "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, - "optionsExtensionStore": "Репозиторий расширения", + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, + "optionsExtensionStore": "Репозиторий расширений", "@optionsExtensionStore": { "description": "Show/hide repo tab" }, @@ -391,7 +484,7 @@ "@extensionsUninstall": { "description": "Uninstall extension button" }, - "storeTitle": "Репозиторий расширения", + "storeTitle": "Репозиторий расширений", "@storeTitle": { "description": "Repo screen title" }, @@ -507,11 +600,11 @@ "@aboutSachinsenalDesc": { "description": "Credit description for sachinsenal0x64" }, - "aboutUnituneDesc": "Открытый распознаватель музыкальных ссылок от Flaze, используемый для резервного кроссплатформенного сопоставления.", + "aboutUnituneDesc": "Открытый распознаватель музыкальных ссылок от Flaze, используемый для резервного кроссплатформенного определения.", "@aboutUnituneDesc": { "description": "Credit for the UniTune resolver" }, - "aboutMusicBrainzDesc": "Открытая музыкальная база данных, поддерживаемая MetaBrainz и сообществом. Используется для сопоставления перекрестных ссылок.", + "aboutMusicBrainzDesc": "Открытая музыкальная база данных, поддерживаемая MetaBrainz и сообществом. Используется для определения перекрестных ссылок.", "@aboutMusicBrainzDesc": { "description": "Credit for the MusicBrainz database" }, @@ -519,7 +612,7 @@ "@aboutSquiglyDesc": { "description": "Credit for the Squigly resolver" }, - "aboutAppDescription": "Ищите метаданных музыки, управляйте расширениями и организуйте свою библиотеку.", + "aboutAppDescription": "Поиск метаданных, управление расширениями и организация медиатеки.", "@aboutAppDescription": { "description": "App description in header card" }, @@ -838,7 +931,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", + "dialogImportPlaylistMessage": "В файле плейлиста найдено {count, plural, one {{count} трек} few {{count} трека} many {{count} треков} other {{count} треков}}. Добавить их в очередь загрузки?", "csvImportTracks": "{count} трек(-ов) из CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -852,7 +945,7 @@ "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, - "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "collectionExportM3uDone": "Экспортировано {exported} из {total, plural, one {{total} трека} few {{total} треков} many {{total} треков} other {{total} треков}}", "@collectionExportM3uDone": { "description": "Snackbar after M3U8 export; tracks without a local file are not exported", "placeholders": { @@ -900,7 +993,7 @@ "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, - "duplicatesKeepBestAll": "Keep best for all", + "duplicatesKeepBestAll": "Оставить лучшее качество", "@duplicatesKeepBestAll": { "description": "Button that keeps the highest-quality copy in every duplicate group and deletes the rest" }, @@ -972,7 +1065,7 @@ } } }, - "snackbarAlreadyInLibrary": "\"{trackName}\" уже есть в вашей библиотеке", + "snackbarAlreadyInLibrary": "\"{trackName}\" уже есть в вашей медиатеке", "@snackbarAlreadyInLibrary": { "description": "Snackbar - track already exists in local library", "placeholders": { @@ -1042,7 +1135,7 @@ } } }, - "snackbarExtensionUpdated": "{extensionName} Обновлено.", + "snackbarExtensionUpdated": "{extensionName} обновлён.", "@snackbarExtensionUpdated": { "description": "Snackbar - extension updated successfully", "placeholders": { @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "Режим текстов песен", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2201,7 +2296,7 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, - "appearanceHeroAnimations": "Hero animations", + "appearanceHeroAnimations": "Hero-анимации", "@appearanceHeroAnimations": { "description": "Toggle for shared-element (Hero) transitions" }, @@ -2261,7 +2356,7 @@ "@concurrentDownloadsOne": { "description": "Concurrent downloads option - sequential" }, - "concurrentDownloadsCount": "До {count} {count, plural, one {трек} few {трека} many {треков} other{треков}} одновременно", + "concurrentDownloadsCount": "До {count} {count, plural, one {трек} other{треков}} одновременно", "@concurrentDownloadsCount": { "description": "Concurrent downloads option - parallel", "placeholders": { @@ -2575,7 +2670,7 @@ "@libraryScanSettings": { "description": "Section header for scan settings" }, - "libraryEnableLocalLibrary": "Включить локальную библиотеку", + "libraryEnableLocalLibrary": "Включить локальную медиатеку", "@libraryEnableLocalLibrary": { "description": "Toggle to enable library scanning" }, @@ -2583,7 +2678,7 @@ "@libraryEnableLocalLibrarySubtitle": { "description": "Subtitle for enable toggle" }, - "libraryFolder": "Папка библиотеки", + "libraryFolder": "Папка медиатеки", "@libraryFolder": { "description": "Folder selection setting" }, @@ -2591,7 +2686,7 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, - "libraryAddFolder": "Добавить папку библиотеки", + "libraryAddFolder": "Добавить папку медиатеки", "@libraryAddFolder": { "description": "Action to add another local library source" }, @@ -2630,7 +2725,7 @@ "@libraryExternalStorage": { "description": "Label for a removable or external library source" }, - "libraryRemoveFolder": "Удалить папку библиотеки", + "libraryRemoveFolder": "Удалить папку медиатеки", "@libraryRemoveFolder": { "description": "Action to remove one indexed library source" }, @@ -2650,7 +2745,7 @@ "@libraryAutoScan": { "description": "Setting for automatic library scanning" }, - "libraryAutoScanSubtitle": "Автоматически сканировать библиотеку на новые файлы", + "libraryAutoScanSubtitle": "Автоматически сканировать медиатеку на новые файлы", "@libraryAutoScanSubtitle": { "description": "Subtitle for auto scan setting" }, @@ -2674,7 +2769,7 @@ "@libraryActions": { "description": "Section header for library actions" }, - "libraryScan": "Сканировать библиотеку", + "libraryScan": "Сканировать медиатеку", "@libraryScan": { "description": "Button to start library scan" }, @@ -2694,7 +2789,7 @@ "@libraryCleanupMissingFilesSubtitle": { "description": "Subtitle for cleanup button" }, - "libraryClear": "Очистить библиотеку", + "libraryClear": "Очистить медиатеку", "@libraryClear": { "description": "Button to clear all library entries" }, @@ -2702,15 +2797,15 @@ "@libraryClearSubtitle": { "description": "Subtitle for clear button" }, - "libraryClearConfirmTitle": "Очистить библиотеку", + "libraryClearConfirmTitle": "Очистить медиатеку", "@libraryClearConfirmTitle": { "description": "Dialog title for clear confirmation" }, - "libraryClearConfirmMessage": "Это удалит все сканированные треки из вашей библиотеки. Ваши фактические файлы не будут удалены.", + "libraryClearConfirmMessage": "Это удалит все сканированные треки из вашей медиатеки. Ваши фактические файлы не будут удалены.", "@libraryClearConfirmMessage": { "description": "Dialog message for clear confirmation" }, - "libraryAbout": "О локальной библиотеке", + "libraryAbout": "О локальной медиатеке", "@libraryAbout": { "description": "Section header for about info" }, @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% из {total} файлов", "@libraryScanProgress": { "description": "Scan progress display", @@ -2769,11 +2868,11 @@ } } }, - "libraryInLibrary": "В библиотеке", + "libraryInLibrary": "В медиатеке", "@libraryInLibrary": { "description": "Badge shown on tracks that exist in local library" }, - "libraryRemovedMissingFiles": "Удалено {count} {count, plural, one{отсутствующий файл} few{трека} many{отсутствующих файлов} other{отсутствующих файлов}} в библиотеке", + "libraryRemovedMissingFiles": "Удалено {count} {count, plural, one{отсутствующий файл} few{трека} many{отсутствующих файлов} other{отсутствующих файлов}} в медиатеке", "@libraryRemovedMissingFiles": { "description": "Snackbar after cleanup", "placeholders": { @@ -2790,7 +2889,7 @@ "@libraryStorageAccessRequired": { "description": "Dialog title for storage permission" }, - "libraryStorageAccessMessage": "SpotiFLAC требуется доступ к хранилищу для сканирования вашей библиотеки музыки. Пожалуйста, предоставьте разрешение в настройках.", + "libraryStorageAccessMessage": "SpotiFLAC требуется доступ к хранилищу для сканирования вашей медиатеки. Пожалуйста, предоставьте разрешение в настройках.", "@libraryStorageAccessMessage": { "description": "Dialog message for storage permission" }, @@ -2932,11 +3031,11 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", + "tutorialWelcomeDesc": "Узнайте, как находить музыку с помощью расширений, выбирать желаемое качество и управлять загрузками в SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", + "tutorialWelcomeTip1": "Воспользуйтесь установленным расширением для поиска или вставьте прямую ссылку на музыкальный контент", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -3110,7 +3209,7 @@ "@cacheCoverImageDesc": { "description": "Description of what cover image cache contains" }, - "cacheLibraryCover": "Кэш обложек библиотеки", + "cacheLibraryCover": "Кэш обложек медиатеки", "@cacheLibraryCover": { "description": "Cache item title for local library cover art images" }, @@ -3130,7 +3229,7 @@ "@cacheAudioAnalysis": { "description": "Cache item title for saved audio analysis results" }, - "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "cacheAudioAnalysisDesc": "Сохраненные спектрограммы и результаты анализа. Будут проанализированы повторно при следующем открытии.", "@cacheAudioAnalysisDesc": { "description": "Description of what audio analysis cache contains" }, @@ -3150,7 +3249,7 @@ "@cacheTrackLookupDesc": { "description": "Description of what track lookup cache contains" }, - "cacheCleanupUnusedDesc": "Удалить записи из истории загрузок и библиотеки, которые остались без файлов.", + "cacheCleanupUnusedDesc": "Удалить записи из истории загрузок и медиатеки, которые остались без файлов.", "@cacheCleanupUnusedDesc": { "description": "Description of what cleanup unused data does" }, @@ -3226,11 +3325,11 @@ "@cacheCleanupUnused": { "description": "Action title for cleaning unused entries" }, - "cacheCleanupUnusedSubtitle": "Удалить историю загрузок, оставшихся без просмотра, и отсутствующие записи в библиотеке", + "cacheCleanupUnusedSubtitle": "Удалить историю загрузок, оставшихся без просмотра, и отсутствующие записи в медиатеке", "@cacheCleanupUnusedSubtitle": { "description": "Subtitle for cleanup unused data action" }, - "cacheCleanupResult": "Очистка завершена: {downloadCount} потерянных загрузок, {libraryCount} отсутствующих записей в библиотеке", + "cacheCleanupResult": "Очистка завершена: {downloadCount} потерянных загрузок, {libraryCount} отсутствующих записей в медиатеке", "@cacheCleanupResult": { "description": "Snackbar after unused data cleanup", "placeholders": { @@ -3302,7 +3401,7 @@ "@trackReEnrichModeIsrc": { "description": "Batch metadata mode that only writes ISRC" }, - "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "trackReEnrichModeIsrcSubtitle": "Найти и добавить идентификатор записи, не меняя другие теги", "@trackReEnrichModeIsrcSubtitle": { "description": "Explanation for the ISRC-only batch metadata mode" }, @@ -3310,7 +3409,7 @@ "@trackReEnrichModeMissing": { "description": "Batch metadata mode that fills only empty tags" }, - "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "trackReEnrichModeMissingSubtitle": "Оставить существующие значения и заполнять только пустые поля", "@trackReEnrichModeMissingSubtitle": { "description": "Explanation for the fill-missing batch metadata mode" }, @@ -3318,15 +3417,15 @@ "@trackReEnrichModeReplace": { "description": "Batch metadata mode that replaces selected tag groups" }, - "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "trackReEnrichModeReplaceSubtitle": "Выберите, какие из существующих значений могут быть заменены онлайн-метаданными", "@trackReEnrichModeReplaceSubtitle": { "description": "Explanation for the selected-tag batch metadata mode" }, - "trackReEnrichModeManual": "Set common values", + "trackReEnrichModeManual": "Установка общих значений", "@trackReEnrichModeManual": { "description": "Batch metadata mode that applies shared values to every selected track" }, - "trackReEnrichModeManualSubtitle": "Apply the same values to every selected track", + "trackReEnrichModeManualSubtitle": "Применить эти же значения ко всем выбранным трекам", "@trackReEnrichModeManualSubtitle": { "description": "Explanation for the manual shared-value batch metadata mode" }, @@ -3334,7 +3433,7 @@ "@trackReEnrichManualFieldsTitle": { "description": "Heading above manual batch metadata inputs" }, - "trackReEnrichManualHint": "Leave a field empty to keep its current value. Track titles, numbers, and ISRCs stay unchanged.", + "trackReEnrichManualHint": "Оставьте поле пустым, чтобы сохранить его текущее значение. Названия треков, номера и ISRC-коды останутся без изменений.", "@trackReEnrichManualHint": { "description": "Safety explanation for manual batch metadata inputs" }, @@ -3350,7 +3449,7 @@ "@trackReEnrichReviewTitle": { "description": "Title of the batch metadata review sheet" }, - "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "trackReEnrichReviewSubtitle": "Предложено {changeCount, plural, one {{changeCount} изменение} few {{changeCount} изменения} other {{changeCount} изменений}} для {trackCount, plural, one {{trackCount} трека} few {{trackCount} треков} other {{trackCount} треков}}", "@trackReEnrichReviewSubtitle": { "description": "Summary shown above proposed batch metadata changes", "placeholders": { @@ -3362,7 +3461,7 @@ } } }, - "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "trackReEnrichNoChanges": "Для выбранных треков изменений в метаданных не найдено.", "@trackReEnrichNoChanges": { "description": "Message when batch metadata preview has no proposed changes" }, @@ -3408,15 +3507,15 @@ "@trackReEnrichSearching": { "description": "Snackbar while searching metadata from internet for local items" }, - "trackReEnrichPreparing": "Preparing metadata changes...", + "trackReEnrichPreparing": "Подготовка изменений метаданных...", "@trackReEnrichPreparing": { "description": "Progress message while preparing manual batch metadata changes" }, "trackReEnrichSuccess": "Метаданные успешно обновлены", "trackReEnrichMetadataSaved": "Метаданные сохранены", "trackReEnrichLyricsUpdated": "Текст обновлён", - "trackReEnrichLyricsPreserved": "No new lyrics found; existing lyrics kept", - "trackReEnrichLyricsDisabled": "Lyrics not updated: lyric downloading is disabled in Settings", + "trackReEnrichLyricsPreserved": "Новые тексты не найдены; старые сохранены", + "trackReEnrichLyricsDisabled": "Текст песни не обновлён: загрузка текстов отключена в настройках", "@trackReEnrichSuccess": { "description": "Snackbar after successful re-enrichment" }, @@ -3428,7 +3527,7 @@ "@queueFlacAction": { "description": "Action/button label for queueing FLAC redownloads for local tracks" }, - "queueFlacConfirmMessage": "Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n{count} selected", + "queueFlacConfirmMessage": "Поиск сетевых совпадений для выбранных треков и добавление FLAC в очередь скачивания.\n\nСуществующие файлы не изменяются и не удаляются.\n\nВ очередь автоматически попадают только точные совпадения.\n\nВыбрано: {count}", "@queueFlacConfirmMessage": { "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", "placeholders": { @@ -3437,11 +3536,11 @@ } } }, - "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "queueFlacNoReliableMatches": "Не найдено надежных онлайн совпадений из выбранных", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" }, - "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "queueFlacQueuedWithSkipped": "Добавлено {addedCount, plural, one {{addedCount} трек} few {{addedCount} трека} other {{addedCount} треков}} в очередь, пропущено {skippedCount, plural, one {{skippedCount} трек} few {{skippedCount} трека} other {{skippedCount} треков}}", "@queueFlacQueuedWithSkipped": { "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", "placeholders": { @@ -3482,7 +3581,7 @@ "@trackConvertKeepOriginal": { "description": "Toggle to preserve the source file during conversion" }, - "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "trackConvertKeepOriginalDescription": "Добавить сконвертированный файл как отдельный трек в медиатеку", "@trackConvertKeepOriginalDescription": { "description": "Description for preserving the source file during conversion" }, @@ -3893,7 +3992,6 @@ } } }, - "selectionBatchConvertConfirmMessageLossless": "Конвертировать {count} {count, plural, =1{track} other{tracks}} в {format}? (Без потери качества)\n\nОригинальные файлы будут удалены после конвертации.", "@selectionBatchConvertConfirmMessageLossless": { "description": "Confirmation dialog message for lossless batch conversion", "placeholders": { @@ -3905,7 +4003,7 @@ } } }, - "selectionBatchConvertConfirmKeepOriginal": "Конвертировать {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}} в {format}?\n\nОригинальные файлы будут храниться и преобразовываться как отдельные элементы библиотеки.", + "selectionBatchConvertConfirmKeepOriginal": "Конвертировать {count} {count, plural, one {трек} few {трека} many {треков} other{треков}} в {format}?\n\nОригинальные файлы будут храниться и преобразовываться как отдельные элементы медиатеки.", "@selectionBatchConvertConfirmKeepOriginal": { "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { @@ -3957,7 +4055,7 @@ "@lyricsProvidersDescription": { "description": "Description on the lyrics provider priority page" }, - "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", + "lyricsProvidersInfoText": "Сторонние источники текстов проверяются раньше встроенных. Необходимо оставить включённым хотя бы один источник.", "@lyricsProvidersInfoText": { "description": "Info tip on lyrics provider priority page" }, @@ -3991,7 +4089,7 @@ "@lyricsProvidersDiscardContent": { "description": "Body text of the discard-changes dialog on lyrics provider page" }, - "lyricsProviderLrclibDesc": "Open-source synced lyrics database", + "lyricsProviderLrclibDesc": "База данных синхронизированных текстов песен с открытым исходным кодом", "@lyricsProviderLrclibDesc": { "description": "Description for LRCLIB provider" }, @@ -4003,7 +4101,7 @@ "@lyricsProviderMusixmatchDesc": { "description": "Description for Musixmatch provider" }, - "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", + "lyricsProviderAppleMusicDesc": "Синхронизация текстов по словам (через прокси)", "@lyricsProviderAppleMusicDesc": { "description": "Description for Apple Music provider" }, @@ -4011,7 +4109,7 @@ "@lyricsProviderQqMusicDesc": { "description": "Description for QQ Music provider" }, - "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", + "lyricsProviderLyricsPlusDesc": "Послойные караоке-тексты (Apple/Musixmatch/Spotify/QQ, через прокси)", "@lyricsProviderLyricsPlusDesc": { "description": "Description for LyricsPlus provider" }, @@ -4047,7 +4145,7 @@ "@settingsBackup": { "description": "Settings menu item - backup and restore page" }, - "settingsBackupSubtitle": "Переместить свою библиотеку, историю и настройки на новое устройство", + "settingsBackupSubtitle": "Переместить свою медиатеку, историю и настройки на новое устройство", "@settingsBackupSubtitle": { "description": "Subtitle for backup and restore settings item" }, @@ -4059,7 +4157,7 @@ "@backupExportSectionTitle": { "description": "Section title for the export/backup card" }, - "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", + "backupExportSectionDescription": "Сохраните свои настройки, историю загрузок, понравившиеся треки, список желаний, любимых исполнителей и плейлисты в одном файле, который можно сохранить или перенести на другой телефон.", "@backupExportSectionDescription": { "description": "Description of what a backup contains" }, @@ -4071,7 +4169,7 @@ "@backupImportSectionTitle": { "description": "Section title for the import/restore card" }, - "backupImportSectionDescription": "Выберите файл резервной копии для восстановления данных. Это заменит текущие настройки, историю и библиотеку на этом устройстве.", + "backupImportSectionDescription": "Выберите файл резервной копии для восстановления данных. Это заменит текущие настройки, историю и медиатеку на этом устройстве.", "@backupImportSectionDescription": { "description": "Description for the restore action" }, @@ -4091,7 +4189,7 @@ "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" }, - "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", + "backupRestoreConfirmMessage": "Ваши текущие настройки, история загрузок, понравившиеся треки, список желаний и плейлисты будут заменены содержимым резервной копии. Это действие нельзя отменить.", "@backupRestoreConfirmMessage": { "description": "Confirmation dialog message before restoring a backup" }, @@ -4121,12 +4219,12 @@ }, "backupSettingsOnly": "Только настройки", "backupSelectHistory": "История загрузок", - "backupSelectCollections": "Коллекции библиотеки", + "backupSelectCollections": "Коллекции медиатеки", "backupSelectCollectionsDescription": "Любимые треки, список желаний, любимые исполнители, плейлисты и обложки плейлистов.", "backupSelectExtensions": "Расширения и их настройки", "backupSelectedExportDescription": "Сохранить выбранные категории в файл резервной копии. Аудио файлы не включены.", "backupSelectAtLeastOne": "Выберите хотя бы одну категорию для создания резервной копии.", - "backupSelectedRestoreMessage": "Only the categories listed below will be restored. Categories not included in this backup will stay unchanged. Restoring can replace existing data and cannot be undone.", + "backupSelectedRestoreMessage": "Будут восстановлены только перечисленные ниже категории. Категории, не вошедшие в эту резервную копию, останутся без изменений. Восстановление может перезаписать существующие данные, это действие нельзя отменить.", "backupContentsSettings": "Настройки приложения", "@backupContentsSettings": { "description": "Backup contents row label for settings" @@ -4185,11 +4283,11 @@ } } }, - "backupIncludeSecrets": "Include extension credentials", + "backupIncludeSecrets": "Включать учётные данные расширений", "@backupIncludeSecrets": { "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" }, - "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", + "backupIncludeSecretsDescription": "Токены и API-ключи из расширений будут сохранены в файл резервной копии. Храните этот файл в конфиденциальном месте. Если функция отключена, вам придётся ввести их заново после восстановления.", "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, @@ -4202,7 +4300,7 @@ } } }, - "tooltipLoveAll": "Love All", + "tooltipLoveAll": "Лайкнуть всё", "@tooltipLoveAll": { "description": "Tooltip for the Love All button on album/playlist screens" }, @@ -4210,7 +4308,7 @@ "@tooltipAddToPlaylist": { "description": "Tooltip for the Add to Playlist button" }, - "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", + "snackbarRemovedTracksFromLoved": "Удалено {count, plural, one {{count} трек} few {{count} трека} other {{count} треков}} из Любимых", "@snackbarRemovedTracksFromLoved": { "description": "Snackbar after removing multiple tracks from Loved folder", "placeholders": { @@ -4219,7 +4317,7 @@ } } }, - "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "snackbarAddedTracksToLoved": "Добавлено {count, plural, one {{count} трек} few {{count} трека} other {{count} треков}} в Любимые", "@snackbarAddedTracksToLoved": { "description": "Snackbar after adding multiple tracks to Loved folder", "placeholders": { @@ -4232,7 +4330,7 @@ "@dialogDownloadAllTitle": { "description": "Dialog title for bulk download confirmation" }, - "dialogDownloadAllMessage": "Download {count} tracks?", + "dialogDownloadAllMessage": "Загрузить {count, plural, one {{count} трек} few {{count} трека} other {{count} треков}}?", "@dialogDownloadAllMessage": { "description": "Body of the Download All confirmation dialog", "placeholders": { @@ -4278,27 +4376,27 @@ } } }, - "snackbarNoActionDefined": "No action defined for this button", + "snackbarNoActionDefined": "Для этой кнопки не задано действие", "@snackbarNoActionDefined": { "description": "Snackbar when an extension button has no action configured" }, - "noTracksFoundForAlbum": "No tracks found for this album", + "noTracksFoundForAlbum": "Трек-лист для этого альбома не найден", "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose where to save your downloaded tracks", + "downloadLocationSubtitle": "Выберите, где сохранять загруженные треки", "@downloadLocationSubtitle": { "description": "Subtitle shown in the download location picker sheet" }, "storageAutomaticFolder": "Автоматическая папка", - "storageAutomaticDownloadFolder": "Uses Download/SpotiFLAC when writable, otherwise app storage", + "storageAutomaticDownloadFolder": "Использует папку «Download/SpotiFLAC», если она доступна для записи, в противном случае — хранилище приложения", "storageSafRecommended": "Выбрать папку (Рекомендуется)", - "storageDownloadFolderHint": "In the Android folder picker, open Download and select SpotiFLAC. If it does not exist, create it using New folder, then tap Use this folder to grant access.", + "storageDownloadFolderHint": "В окне выбора папок Android откройте папку «Загрузки» и выберите SpotiFLAC. Если этой папки нет, создайте её, нажав «Новая папка», а затем нажмите «Использовать эту папку», чтобы предоставить доступ.", "storageModeAppFolder": "Папка приложения (рекомендуется)", "@storageModeAppFolder": { "description": "Storage mode option - app-managed folder" }, - "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", + "storageModeAppFolderSubtitle": "Сохраняет Music/SpotiFLAC по умолчанию", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, @@ -4310,11 +4408,11 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFolderAccessLostTitle": "Download folder access lost", + "downloadFolderAccessLostTitle": "Доступ к папке загрузок потерян", "@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": "Загрузка не будет выполнена, пока вы не выберете папку повторно", "@downloadFolderAccessLostSubtitle": { "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" }, @@ -4322,11 +4420,11 @@ "@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": "Разрешения SAF недействительны или аннулированы. Пожалуйста, измените расположение загрузки в настройках.", "@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": "Доступ к папке потерян. Пожалуйста, выберите папку для скачивания заново в Настройках.", "@downloadErrorFolderAccessLost": { "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" }, @@ -4338,11 +4436,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", + "downloadSeparateSinglesEnabled": "Синглы и EP будут в отдельной папке", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is on" }, - "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", + "downloadSeparateSinglesDisabled": "Синглы и альбомы будут в одной папке", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is off" }, @@ -4350,19 +4448,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", + "downloadCreatePlaylistSourceFolder": "Папка-источник плейлиста", "@downloadCreatePlaylistSourceFolder": { "description": "Setting to create a subfolder per playlist source" }, - "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", + "downloadCreatePlaylistSourceFolderEnabled": "Для каждого плейлиста создается подпапка", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist folder is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", + "downloadCreatePlaylistSourceFolderDisabled": "Все треки будут сохранены непосредственно в папку для загрузки", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist folder is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", + "downloadCreatePlaylistSourceFolderRedundant": "Обрабатывается настройками организации папок", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when folder organization is already set to playlist" }, @@ -4374,7 +4472,7 @@ "@downloadNetworkCompatibilityMode": { "description": "Setting for legacy TLS/network handling" }, - "downloadNetworkCompatibilityModeEnabled": "Allowing legacy HTTP endpoints; TLS verification remains enabled", + "downloadNetworkCompatibilityModeEnabled": "Разрешить устаревшие HTTP-адреса; проверка TLS по-прежнему включена", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is on" }, @@ -4386,19 +4484,19 @@ "@downloadAllowLocalNetwork": { "description": "Setting title for allowing requests to private/local network targets" }, - "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", + "downloadAllowLocalNetworkEnabled": "Разрешить запросы на локальные или частные адреса (для локального прокси или пользовательского DNS)", "@downloadAllowLocalNetworkEnabled": { "description": "Subtitle when allow local network access is on" }, - "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", + "downloadAllowLocalNetworkDisabled": "Локальные/приватные адреса заблокированы для безопасности", "@downloadAllowLocalNetworkDisabled": { "description": "Subtitle when allow local network access is off" }, - "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", + "downloadSelectServiceToEnable": "Выберите провайдера с параметрами качества, чтобы включить эту функцию", "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadEmbedLyricsDisabled": "Enable metadata embedding first", + "downloadEmbedLyricsDisabled": "Сначала включите встраивание метаданных", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" }, @@ -4406,11 +4504,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Setting to include translated lyrics from Netease" }, - "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", + "downloadNeteaseIncludeTranslationEnabled": "Китайские строки перевода включены", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is on" }, - "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Только оригинал текста", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is off" }, @@ -4430,23 +4528,23 @@ "@downloadAppleQqMultiPerson": { "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" }, - "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", + "downloadAppleQqMultiPersonEnabled": "Имена исполнителей включены для дуэтов и групповых треков", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person lyrics is on" }, - "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", + "downloadAppleQqMultiPersonDisabled": "Стандартные тексты песен без имён исполнителей", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person lyrics is off" }, - "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "downloadAppleElrcWordSync": "Apple Music eLRC синхронизация слов", "@downloadAppleElrcWordSync": { "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" }, - "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "downloadAppleElrcWordSyncEnabled": "Сохраняются исходные метки времени для каждого слова", "@downloadAppleElrcWordSyncEnabled": { "description": "Subtitle when Apple Music eLRC word sync is enabled" }, - "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "downloadAppleElrcWordSyncDisabled": "Более стабильные построчные тексты Apple Music", "@downloadAppleElrcWordSyncDisabled": { "description": "Subtitle when Apple Music eLRC word sync is disabled" }, @@ -4458,19 +4556,19 @@ "@downloadMusixmatchLanguageAuto": { "description": "Subtitle when no language is set" }, - "downloadFilterContributing": "Filter Contributing Artists", + "downloadFilterContributing": "Фильтр приглашённых исполнителей", "@downloadFilterContributing": { "description": "Setting to strip contributing artists from Album Artist folder name" }, - "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", + "downloadFilterContributingEnabled": "Приглашённые исполнители исключаются из названия папки исполнителя альбома", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is on" }, - "downloadFilterContributingDisabled": "Full Album Artist string used", + "downloadFilterContributingDisabled": "Используется полное имя исполнителя альбома", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is off" }, - "downloadProvidersNoneEnabled": "No providers enabled", + "downloadProvidersNoneEnabled": "Нет включенных провайдеров", "@downloadProvidersNoneEnabled": { "description": "Shown when no lyrics providers are active" }, @@ -4478,11 +4576,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for Musixmatch language input field" }, - "downloadMusixmatchLanguageHint": "e.g. en, de, ja", + "downloadMusixmatchLanguageHint": "например: en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Placeholder for Musixmatch language input" }, - "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", + "downloadMusixmatchLanguageDesc": "Введите код языка BCP-47 (например, ru, de, ja) для запроса текстов песен с Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in Musixmatch language picker" }, @@ -4498,7 +4596,7 @@ "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for WiFi-only option in picker" }, - "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", + "downloadSongLinkRegionDesc": "Регион, используемый при разрешении ссылок на треки через SongLink. Выберите страну, в которой доступны ваши стриминговые сервисы.", "@downloadSongLinkRegionDesc": { "description": "Description in SongLink region picker" }, @@ -4531,11 +4629,11 @@ } } }, - "bulkDownloadSelectPlaylists": "Select playlists to download", + "bulkDownloadSelectPlaylists": "Выберите плейлисты для загрузки", "@bulkDownloadSelectPlaylists": { "description": "Button label when no playlists are selected for download" }, - "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "snackbarSelectedPlaylistsEmpty": "У выбранных плейлистов нет треков", "@snackbarSelectedPlaylistsEmpty": { "description": "Snackbar when selected playlists contain no tracks" }, @@ -4568,7 +4666,7 @@ "@editMetadataAutoFillFind": { "description": "Button label for finding an online metadata candidate" }, - "editMetadataAutoFillPreview": "Data from {source}", + "editMetadataAutoFillPreview": "Данные из {source}", "@editMetadataAutoFillPreview": { "description": "Title for the online metadata preview", "placeholders": { @@ -4577,11 +4675,11 @@ } } }, - "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "editMetadataAutoFillCoverAvailable": "Обложка доступна", "@editMetadataAutoFillCoverAvailable": { "description": "Preview value when the selected metadata source provides cover artwork" }, - "editMetadataAutoFillApply": "Apply selected data", + "editMetadataAutoFillApply": "Применить выбранные данные", "@editMetadataAutoFillApply": { "description": "Button label for applying the previewed metadata" }, @@ -4605,7 +4703,7 @@ "@editMetadataAutoFillSearching": { "description": "Snackbar shown while searching for online metadata" }, - "editMetadataAutoFillNoResults": "No matching metadata found online", + "editMetadataAutoFillNoResults": "Подходящие метаданные не найдены", "@editMetadataAutoFillNoResults": { "description": "Snackbar when online metadata search returns no results" }, @@ -4618,7 +4716,7 @@ } } }, - "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", + "editMetadataAutoFillNoneSelected": "Выберите хотя бы одно поле для автозаполнения", "@editMetadataAutoFillNoneSelected": { "description": "Snackbar when user taps Fetch without selecting any fields" }, @@ -4709,19 +4807,19 @@ } } }, - "queueEmptyAlbums": "No album downloads", + "queueEmptyAlbums": "Нет скачанных альбомов", "@queueEmptyAlbums": { "description": "Empty state title when no album downloads exist" }, - "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "queueEmptyAlbumsSubtitle": "Скачайте треки из альбома, чтобы увидеть их здесь", "@queueEmptyAlbumsSubtitle": { "description": "Empty state subtitle for album downloads" }, - "queueEmptySingles": "No single downloads", + "queueEmptySingles": "Нет скачанных синглов", "@queueEmptySingles": { "description": "Empty state title when no single track downloads exist" }, - "queueEmptySinglesSubtitle": "Single track downloads will appear here", + "queueEmptySinglesSubtitle": "Здесь будут отображаться загрузки отдельных треков", "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, @@ -4734,7 +4832,7 @@ } } }, - "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "queueEmptyPlaylistsSubtitle": "Создайте плейлист для организации ваших треков", "@queueEmptyPlaylistsSubtitle": { "description": "Empty state subtitle for the playlists library view" }, @@ -4762,7 +4860,7 @@ "@selectionTapPlaylistsToSelect": { "description": "Hint shown in playlist selection mode" }, - "selectionSelectPlaylistsToDelete": "Select playlists to delete", + "selectionSelectPlaylistsToDelete": "Выберите плейлисты для удаления", "@selectionSelectPlaylistsToDelete": { "description": "Hint shown when no playlists are selected for deletion" }, @@ -4862,39 +4960,39 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "downloadRedownloadFakeHiRes": "Re-download fake Hi-Res", + "downloadRedownloadFakeHiRes": "Перекачать поддельный Hi-Res", "@downloadRedownloadFakeHiRes": { "description": "Setting title: automatically replace downloads that measure as fake Hi-Res" }, - "downloadRedownloadFakeHiResSubtitle": "Off by default. Check Hi-Res downloads and replace only when every audio sample is preserved. Keep the original if verification or processing fails", + "downloadRedownloadFakeHiResSubtitle": "По умолчанию отключено. Установите флажок «Загрузки в высоком разрешении» и заменяйте файлы только в том случае, если сохранены все аудиосэмплы. Сохраняйте исходный файл, если проверка или обработка завершились неудачно", "@downloadRedownloadFakeHiResSubtitle": { "description": "Setting subtitle for the fake Hi-Res re-download toggle" }, - "hiResCheckVerdictFakeCertain": "Fake Hi-Res", + "hiResCheckVerdictFakeCertain": "Фейковый Hi-Res", "@hiResCheckVerdictFakeCertain": { "description": "Verdict: an exact fingerprint (padded bits or upsampling pattern) proves the file is not real Hi-Res" }, - "hiResCheckVerdictFakeSuspect": "Possibly a filtered master", + "hiResCheckVerdictFakeSuspect": "Возможно отфильтрованный мастеринг", "@hiResCheckVerdictFakeSuspect": { "description": "Verdict: fails the cutoff test but may be a genuine master low-pass filtered in mastering" }, - "hiResCheckReasonSampleHold": "Every sample is repeated: upsampled by duplication", + "hiResCheckReasonSampleHold": "Каждый сэмпл повторяется: повышение частоты дискретизации путем дублирования", "@hiResCheckReasonSampleHold": { "description": "Reason: sample-and-hold upsampling detected" }, - "hiResCheckReasonInterpolation": "In-between samples are linearly interpolated", + "hiResCheckReasonInterpolation": "Промежуточные семплы интерполированы линейно", "@hiResCheckReasonInterpolation": { "description": "Reason: linear-interpolation upsampling detected" }, - "hiResCheckReasonImaging": "Content above 22 kHz mirrors the audible band", + "hiResCheckReasonImaging": "Частоты выше 22 кГц дублируют слышимый диапазон", "@hiResCheckReasonImaging": { "description": "Reason: spectral imaging from upsampling detected" }, - "hiResCheckMusicContent": "Musical content", + "hiResCheckMusicContent": "Музыкальный контент", "@hiResCheckMusicContent": { "description": "Label for the highest frequency that still moves with the music" }, - "hiResCheckUltrasonicNoise": "Above {cutoff} only steady noise (typical of DSD or analog tape transfers): a {rate} file would hold all the music", + "hiResCheckUltrasonicNoise": "Выше {cutoff} слышен только постоянный шум (характерный для DSD или аналоговых записей с ленты): файл с {rate} будет содержать всю музыку", "@hiResCheckUltrasonicNoise": { "description": "Shown when the ultrasonic content of a Hi-Res file is noise rather than music", "placeholders": { @@ -4906,55 +5004,110 @@ } } }, - "hiResCheckTitle": "Hi-Res Authenticity", + "hiResCheckTitle": "Hi-Res проверка", "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, - "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", + "hiResCheckSummary": "Проверяет спектр и глубину активных битов на наличие признаков повышения частоты дискретизации или добавления заполняющих битов.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Ограниченный диапазон частот", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "Не обнаружено ни апсэмплинга, ни добавления \"заполняющих нулей\"", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Примерная частота среза", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Активные / сохранённые биты", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "Низкая частота среза может быть результатом мастеринга. Сама по себе она не доказывает апсемплинг.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Основано на {seconds} секундах звука. Этот анализ не может определить изначальный мастеринг.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "Спектр содержит зеркальные полосы, характерные для апсемплинга.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "Крутой срез в районе {cutoff} и измеренный уровень шума свидетельствуют об исходнике с меньшей частотой.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Энергия выше {cutoff} в проанализированном сегменте преимущественно стабильна и может являться шумом.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckDescription": "Обнаружение поддельных файлов высокого разрешения с увеличенной частотой дискретизации или с повышением битности", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" }, - "hiResCheckRun": "Check", + "hiResCheckRun": "Проверка", "@hiResCheckRun": { "description": "Button that starts the Hi-Res authenticity check" }, - "hiResCheckChecking": "Checking Hi-Res authenticity...", + "hiResCheckChecking": "Проверка подлинности Hi-Res...", "@hiResCheckChecking": { "description": "Loading text while the Hi-Res check runs" }, - "hiResCheckVerdictFake": "Likely fake Hi-Res", + "hiResCheckVerdictFake": "Вероятно поддельный Hi-Res", "@hiResCheckVerdictFake": { "description": "Verdict: the file claims Hi-Res but does not measure as it" }, - "hiResCheckVerdictGenuine": "Measures as genuine Hi-Res", + "hiResCheckVerdictGenuine": "Оценено как подлинный Hi-Res", "@hiResCheckVerdictGenuine": { "description": "Verdict: no upsampling or padded bit depth found" }, - "hiResCheckVerdictStandard": "Standard definition, nothing to flag", + "hiResCheckVerdictStandard": "Стандартное разрешение, ничего примечательного", "@hiResCheckVerdictStandard": { "description": "Verdict: neither sample rate nor bit depth claims Hi-Res" }, - "hiResCheckVerdictInconclusive": "Inconclusive: the analyzed segment is too quiet or short", + "hiResCheckVerdictInconclusive": "Недостаточно данных: проанализированный сегмент слишком тихий или короткий", "@hiResCheckVerdictInconclusive": { "description": "Verdict: analysis could not reach a reliable conclusion" }, - "hiResCheckUnsupported": "Only FLAC and WAV files can be checked", + "hiResCheckUnsupported": "Только файлы FLAC и WAV могут быть проверены", "@hiResCheckUnsupported": { "description": "Shown when the file format cannot be decoded by the Hi-Res check" }, - "hiResCheckCutoff": "Content cutoff", + "hiResCheckCutoff": "Срез содержимого", "@hiResCheckCutoff": { "description": "Label for the highest frequency with real content" }, - "hiResCheckBitsInUse": "Bits in use", + "hiResCheckBitsInUse": "Используемые биты", "@hiResCheckBitsInUse": { "description": "Label for effective vs declared bit depth" }, - "hiResCheckDisclaimer": "The spectrum stops early, but nothing proves it was upsampled: it may be a genuine master low-pass filtered in mastering. It is not replaced automatically.", + "hiResCheckDisclaimer": "Спектр обрывается рано, но нет никаких доказательств того, что он был подвергнут повышающению дискретизации: возможно, это подлинный мастер, пропущенный через фильтр при мастеринге. Он не заменяется автоматически.", "@hiResCheckDisclaimer": { "description": "Caveat shown under a fake Hi-Res verdict" }, - "hiResCheckFailed": "Hi-Res check failed: {error}", + "hiResCheckFailed": "Hi-Res проверка не удалась: {error}", "@hiResCheckFailed": { "description": "Error shown when the Hi-Res check fails", "placeholders": { @@ -4963,7 +5116,7 @@ } } }, - "hiResCheckReasonRate": "Declares {sampleRate} but content stops at ~{cutoff}", + "hiResCheckReasonRate": "Заявлена частота {sampleRate}, но содержимое обрывается на ~{cutoff}", "@hiResCheckReasonRate": { "description": "Reason for a fake verdict caused by upsampling", "placeholders": { @@ -4975,7 +5128,7 @@ } } }, - "hiResCheckReasonDepth": "Declares {declared}-bit but only {effective} bits carry data", + "hiResCheckReasonDepth": "Формат {declared}-бит, но фактически используется {effective} бит", "@hiResCheckReasonDepth": { "description": "Reason for a fake verdict caused by padded bit depth", "placeholders": { @@ -4995,7 +5148,7 @@ "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" }, - "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "extensionsHomeFeedDescription": "Выберите расширение, предоставляющее ленту на главном экране", "@extensionsHomeFeedDescription": { "description": "Extensions page - description for home feed provider picker" }, @@ -5003,7 +5156,7 @@ "@extensionsHomeFeedAuto": { "description": "Label for auto-selected search provider" }, - "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "extensionsHomeFeedAutoSubtitle": "Автоматический выбор лучшего из доступных", "@extensionsHomeFeedAutoSubtitle": { "description": "Extensions page - subtitle for auto home feed option" }, @@ -5011,7 +5164,7 @@ "@extensionsHomeFeedOff": { "description": "Extensions page - home feed provider option: off" }, - "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "extensionsHomeFeedOffSubtitle": "Не показывать домашнюю ленту на главном экране", "@extensionsHomeFeedOffSubtitle": { "description": "Extensions page - subtitle for off home feed option" }, @@ -5024,7 +5177,7 @@ } } }, - "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "extensionsNoHomeFeedExtensions": "Нет расширений с домашней лентой", "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, @@ -5032,7 +5185,7 @@ "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" }, - "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "cancelDownloadContent": "Это отменит активную загрузку для \"{trackName}\".", "@cancelDownloadContent": { "description": "Dialog body when confirming cancellation of an active download", "placeholders": { @@ -5049,7 +5202,7 @@ "@queueCancelledTitle": { "description": "Dialog title when opening a cancelled queue item" }, - "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "queueCancelledMessage": "Загрузка была отменена. Повторите попытку или удалите её из очереди.", "@queueCancelledMessage": { "description": "Dialog body when opening a cancelled queue item" }, @@ -5092,7 +5245,7 @@ "@notifEmbeddingMetadata": { "description": "Notification body while embedding metadata into a downloaded track" }, - "notifAlreadyInLibraryCount": "Уже в библиотеке ({completed}/{total})", + "notifAlreadyInLibraryCount": "{completed} Уже в библиотеке ({completed}/{total})", "@notifAlreadyInLibraryCount": { "description": "Notification title when track is already in library, with count", "placeholders": { @@ -5104,7 +5257,7 @@ } } }, - "notifAlreadyInLibrary": "Уже в библиотеке", + "notifAlreadyInLibrary": "Уже в медиатеке", "@notifAlreadyInLibrary": { "description": "Notification title when track is already in library" }, @@ -5140,7 +5293,7 @@ "@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": "Откройте приложение, чтобы завершить проверку и возобновить загрузку", "@notifVerificationRequiredBody": { "description": "Notification body prompting the user to return to the app to solve a verification challenge" }, @@ -5182,7 +5335,7 @@ } } }, - "notifScanningLibrary": "Сканирование локальной библиотеки", + "notifScanningLibrary": "Сканирование локальной медиатеки", "@notifScanningLibrary": { "description": "Notification title while scanning local library" }, @@ -5213,7 +5366,7 @@ } } }, - "notifLibraryScanComplete": "Сканирование библиотеки завершено", + "notifLibraryScanComplete": "Сканирование медиатеки завершено", "@notifLibraryScanComplete": { "description": "Notification title when library scan finishes" }, @@ -5244,11 +5397,11 @@ } } }, - "notifLibraryScanFailed": "Ошибка сканирования библиотеки", + "notifLibraryScanFailed": "Ошибка сканирования медиатеки", "@notifLibraryScanFailed": { "description": "Notification title when library scan fails" }, - "notifLibraryScanCancelled": "Сканирование библиотеки отменено", + "notifLibraryScanCancelled": "Сканирование медиатеки отменено", "@notifLibraryScanCancelled": { "description": "Notification title when library scan is cancelled by the user" }, @@ -5256,6 +5409,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Скачивание SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -5350,11 +5516,11 @@ "@optionsEmbedMetadata": { "description": "Settings toggle title for writing metadata into downloaded files" }, - "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "optionsEmbedMetadataSubtitleOn": "Записывать метаданные, обложки и тексты песен в файлы", "@optionsEmbedMetadataSubtitleOn": { "description": "Subtitle when metadata embedding is enabled" }, - "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "optionsEmbedMetadataSubtitleOff": "Отключено (расширенный режим): пропустить запись всех метаданных", "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, @@ -5382,7 +5548,7 @@ "@trackCoverSelected": { "description": "Label for the newly selected cover preview" }, - "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "trackCoverReplaceNotice": "Выбранная обложка заменит текущую встроенную при нажатии \"Сохранить\".", "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, @@ -5390,11 +5556,11 @@ "@trackCoverResolution": { "description": "Label for selecting the embedded cover art resolution" }, - "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "trackCoverResolutionHint": "Задает длину самой большой стороны при сохранении. Увеличение размера не улучшает детализацию изображения.", "@trackCoverResolutionHint": { "description": "Explanation below the embedded cover art resolution selector" }, - "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "trackCoverResizeFailed": "Не удалось изменить размер обложки. Пожалуйста, попробуйте другой размер или изображение.", "@trackCoverResizeFailed": { "description": "Error shown when resizing cover art before saving metadata fails" }, @@ -5406,15 +5572,15 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, - "queueDownloadNext": "Download next", + "queueDownloadNext": "Загрузить следующим", "@queueDownloadNext": { "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" }, - "queueMoveUp": "Move up", + "queueMoveUp": "Переместить вверх", "@queueMoveUp": { "description": "Queue item menu action - move the queued item one position earlier" }, - "queueMoveDown": "Move down", + "queueMoveDown": "Переместить вниз", "@queueMoveDown": { "description": "Queue item menu action - move the queued item one position later" }, @@ -5426,7 +5592,7 @@ "@editMetadataMusicBrainzFilled": { "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" }, - "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "editMetadataMusicBrainzNothing": "На MusicBrainz ничего не найдено", "@editMetadataMusicBrainzNothing": { "description": "Snackbar when the MusicBrainz lookup returns no data" }, @@ -5446,7 +5612,7 @@ "@nowPlayingRepeatOne": { "description": "Repeat toggle tooltip when the current track repeats" }, - "queueNetworkFailedOffline": "{count} downloads failed while offline", + "queueNetworkFailedOffline": "{count, plural, one {{count} трек} few {{count} трека} other {{count} треков}} из истории загрузок (исключено из списка)", "@queueNetworkFailedOffline": { "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", "placeholders": { @@ -5471,11 +5637,11 @@ "@queueRateLimitTitle": { "description": "Title shown on a failed queue item when the download service rate limits requests" }, - "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "queueRateLimitMessage": "Этот трек все еще может быть доступен. Подождите несколько минут, уменьшите параллельные загрузки, а затем повторите попытку.", "@queueRateLimitMessage": { "description": "Explanation shown on a failed queue item when the download service rate limits requests" }, - "appearanceSelectAccentColor": "Select accent color {hex}", + "appearanceSelectAccentColor": "Выберите цвет акцента {hex}", "@appearanceSelectAccentColor": { "description": "Accessibility label for picking an accent color", "placeholders": { @@ -5492,7 +5658,7 @@ "@logAutoScrollOff": { "description": "Tooltip when auto-scroll is disabled on the log screen" }, - "logCopyLogs": "Copy logs", + "logCopyLogs": "Скопировать логи", "@logCopyLogs": { "description": "Tooltip for copying logs" }, @@ -5548,11 +5714,11 @@ "@logIssueTrackNotFoundSuggestion": { "description": "Diagnostic badge suggestion when a track is unavailable" }, - "clickableLookingUpArtist": "Looking up artist...", + "clickableLookingUpArtist": "Поиск исполнителя...", "@clickableLookingUpArtist": { "description": "Snackbar shown while clickable artist metadata is being resolved" }, - "clickableInformationUnavailable": "{type} information not available", + "clickableInformationUnavailable": "Информация о {type} недоступна", "@clickableInformationUnavailable": { "description": "Snackbar shown when clickable metadata cannot open a destination", "placeholders": { @@ -5569,7 +5735,7 @@ "@extensionDetailsInformation": { "description": "Section title for extension metadata information" }, - "extensionUtilityFunctions": "Utility Functions", + "extensionUtilityFunctions": "Утилиты", "@extensionUtilityFunctions": { "description": "Capability label for utility-only extensions" }, @@ -5581,7 +5747,7 @@ "@setupChangeFolderTooltip": { "description": "Tooltip for editing the selected download folder" }, - "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "a11yOpenTrackByArtist": "Открыть трек {trackName} от {artistName}", "@a11yOpenTrackByArtist": { "description": "Accessibility label for opening a track item", "placeholders": { @@ -5593,7 +5759,7 @@ } } }, - "a11yOpenItem": "Open {itemType} {name}", + "a11yOpenItem": "Открыть {itemType} {name}", "@a11yOpenItem": { "description": "Accessibility label for opening a generic item", "placeholders": { @@ -5666,15 +5832,15 @@ "@settingsFiles": { "description": "Settings menu item - file and folder settings" }, - "settingsFilesSubtitle": "Download location, filename, folder structure", + "settingsFilesSubtitle": "Расположение загрузок, имя файла и структура папок", "@settingsFilesSubtitle": { "description": "Subtitle for files & folders settings" }, - "settingsMetadata": "Metadata", + "settingsMetadata": "Метаданные", "@settingsMetadata": { "description": "Settings menu item - metadata settings" }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "settingsMetadataSubtitle": "Обложки, теги, ReplayGain, провайдеры", "@settingsMetadataSubtitle": { "description": "Subtitle for metadata settings" }, @@ -5682,15 +5848,15 @@ "@settingsLyrics": { "description": "Settings menu item - lyrics settings" }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "settingsLyricsSubtitle": "Внедрение, режим, провайдеры, языковые параметры", "@settingsLyricsSubtitle": { "description": "Subtitle for lyrics settings" }, - "settingsApp": "App", + "settingsApp": "Приложение", "@settingsApp": { "description": "Settings menu item - app settings" }, - "settingsAppSubtitle": "Updates, data, extension repo, debug", + "settingsAppSubtitle": "Обновления, данные, репозиторий расширений и отладка", "@settingsAppSubtitle": { "description": "Subtitle for app settings" }, @@ -5710,31 +5876,31 @@ "@metadataProvidersTitle": { "description": "Settings item title for metadata provider order" }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "metadataProvidersSubtitle": "Перетащите для задания порядка поиска и источника метаданных", "@metadataProvidersSubtitle": { "description": "Subtitle for metadata provider priority item" }, - "downloadDeduplication": "Skip Duplicate Downloads", + "downloadDeduplication": "Пропустить дублирование загрузок", "@downloadDeduplication": { "description": "Setting - skip tracks already in download history" }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "downloadDeduplicationEnabled": "Уже загруженные треки будут пропущены", "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, - "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "downloadDeduplicationWithQualityVariants": "Существующие файлы в выбранном качестве будут пропущены", "@downloadDeduplicationWithQualityVariants": { "description": "Deduplication subtitle when separate quality versions are allowed" }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", + "downloadDeduplicationDisabled": "Все треки будут загружены независимо от истории", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, - "downloadQualityVariants": "Allow different quality versions", + "downloadQualityVariants": "Разрешить скачивание версий в другом качестве", "@downloadQualityVariants": { "description": "Setting to retain multiple quality versions of the same track" }, - "downloadQualityVariantsDescription": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "downloadQualityVariantsDescription": "Сохранять все версии качества; добавлять показатель качества к имени файла только тогда, когда имя уже занято", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5742,11 +5908,11 @@ "@trackOptionDownloadQualityVariant": { "description": "Track menu action to download another quality version" }, - "downloadFallbackExtensions": "Fallback Extensions", + "downloadFallbackExtensions": "Резервные расширения", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" }, - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "downloadFallbackExtensionsSubtitle": "Выберите, какие расширения будут использоваться как резервные", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" }, @@ -5758,7 +5924,7 @@ "@editMetadataFieldTrackTotal": { "description": "Label for total tracks field in the edit metadata sheet" }, - "editMetadataFieldDiscTotal": "Disc Total", + "editMetadataFieldDiscTotal": "Всего дисков", "@editMetadataFieldDiscTotal": { "description": "Label for total discs field in the edit metadata sheet" }, @@ -5774,7 +5940,7 @@ "@trackAlbumType": { "description": "Label for an album or release type metadata value" }, - "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "editMetadataFieldAlbumTypeHint": "Альбом, сингл, EP, сборник...", "@editMetadataFieldAlbumTypeHint": { "description": "Hint for the release type metadata field" }, @@ -5782,7 +5948,7 @@ "@editMetadataFieldExplicit": { "description": "Label for the explicit content metadata field" }, - "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "editMetadataFieldExplicitHint": "Пометить этот трек как содержащий откровенное содержимое(Explicit)", "@editMetadataFieldExplicitHint": { "description": "Description for the explicit content metadata switch" }, @@ -5794,7 +5960,7 @@ "@editMetadataFieldUpc": { "description": "Label for the release barcode metadata field" }, - "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "editMetadataFieldUpcHint": "Числовой UPC, EAN, или GTIN", "@editMetadataFieldUpcHint": { "description": "Hint for the release barcode metadata field" }, @@ -5802,15 +5968,15 @@ "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" }, - "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "libraryFilterMetadataMissingTrackNumber": "Отсутствует номер трека", "@libraryFilterMetadataMissingTrackNumber": { "description": "Filter option - items missing track number" }, - "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "libraryFilterMetadataMissingDiscNumber": "Отсутствует номер диска", "@libraryFilterMetadataMissingDiscNumber": { "description": "Filter option - items missing disc number" }, - "libraryFilterMetadataMissingArtist": "Missing artist", + "libraryFilterMetadataMissingArtist": "Отсутствует исполнитель", "@libraryFilterMetadataMissingArtist": { "description": "Filter option - items missing artist" }, @@ -5822,7 +5988,7 @@ "@libraryFilterMetadataMissingIsrc": { "description": "Filter option - items without any ISRC tag" }, - "libraryFilterMetadataMissingLabel": "Missing label", + "libraryFilterMetadataMissingLabel": "Без лейбла", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" }, @@ -5904,7 +6070,7 @@ } } }, - "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "queueDownloadSpeedStatus": "Загрузка - {speed} МБ/с", "@queueDownloadSpeedStatus": { "description": "Queue status while downloading with speed", "placeholders": { @@ -5914,9 +6080,9 @@ } }, "queueDownloadStarting": "Запуск...", - "queueCheckingDownloadSession": "Checking download session...", - "queueResolvingDownloadMetadata": "Resolving track metadata...", - "queueResolvingDownloadStream": "Preparing audio stream...", + "queueCheckingDownloadSession": "Проверка сеанса загрузки...", + "queueResolvingDownloadMetadata": "Определение метаданных трека...", + "queueResolvingDownloadStream": "Подготовка аудиопотока...", "queueWaitingForVerification": "Ожидание верификации...", "queueResumingAfterVerification": "Продолжение после верификации...", "@queueDownloadStarting": { @@ -5925,15 +6091,15 @@ "@queueCheckingDownloadSession": { "description": "Queue status while the download provider's session is being checked during preparation (preparationStage 'checking_session'). This is about the provider session, not about locating a finished file." }, - "a11ySelectTrack": "Select track", + "a11ySelectTrack": "Выбрать трек", "@a11ySelectTrack": { "description": "Accessibility label for selecting a track" }, - "a11yDeselectTrack": "Deselect track", + "a11yDeselectTrack": "Отменить выбор трека", "@a11yDeselectTrack": { "description": "Accessibility label for deselecting a track" }, - "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "a11yPlayTrackByArtist": "Играть {trackName} от {artistName}", "@a11yPlayTrackByArtist": { "description": "Accessibility label for playing a local library track", "placeholders": { @@ -5954,7 +6120,7 @@ } } }, - "storeRequiresVersion": "Requires v{version}+", + "storeRequiresVersion": "Требуется v{version}+", "@storeRequiresVersion": { "description": "Store compatibility badge for minimum app version", "placeholders": { @@ -5963,15 +6129,15 @@ } } }, - "actionGo": "Go", + "actionGo": "ОК", "@actionGo": { "description": "Generic action button label" }, - "logIssueSummary": "Issue Summary", + "logIssueSummary": "Краткое описание проблемы", "@logIssueSummary": { "description": "Header for log issue analysis summary" }, - "logTotalErrors": "Total errors: {count}", + "logTotalErrors": "Всего ошибок: {count}", "@logTotalErrors": { "description": "Total error count in log issue analysis", "placeholders": { @@ -5980,7 +6146,7 @@ } } }, - "logAffectedDomains": "Affected: {domains}", + "logAffectedDomains": "Затронуто: {domains}", "@logAffectedDomains": { "description": "Affected domains in log issue analysis", "placeholders": { @@ -5989,15 +6155,15 @@ } } }, - "libraryScanCancelled": "Scan cancelled", + "libraryScanCancelled": "Сканирование отменено", "@libraryScanCancelled": { "description": "Library scan status when a scan was cancelled" }, - "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "libraryScanCancelledSubtitle": "Вы можете повторить сканирование, когда будете готовы.", "@libraryScanCancelledSubtitle": { "description": "Library scan status subtitle after cancellation" }, - "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "libraryDownloadsHistoryExcluded": "{count, plural, one {{count} трек} few {{count} трека} other {{count} треков}} из истории загрузок (исключено из списка)", "@libraryDownloadsHistoryExcluded": { "description": "Library count note for downloaded history items excluded from the local list", "placeholders": { @@ -6006,11 +6172,11 @@ } } }, - "downloadNativeWorker": "Native download worker", + "downloadNativeWorker": "Нативный загрузчик", "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "downloadNativeWorkerSubtitle": "Фоновая служба Android для загрузки расширений", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -6031,7 +6197,7 @@ } } }, - "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "extensionOauthConnectHint": "Нажмите Подключиться к Spotify для заполнения этого поля.", "@extensionOauthConnectHint": { "description": "Hint for an OAuth login link field before connecting Spotify" }, @@ -6044,7 +6210,7 @@ } } }, - "extensionRefreshStatus": "Refresh status", + "extensionRefreshStatus": "Обновить статус", "@extensionRefreshStatus": { "description": "Tooltip for refreshing extension service health status" }, @@ -6073,7 +6239,7 @@ "@extensionHealthOnline": { "description": "Extension service health status - online" }, - "extensionHealthDegraded": "Degraded", + "extensionHealthDegraded": "Деградация", "@extensionHealthDegraded": { "description": "Extension service health status - degraded" }, @@ -6109,7 +6275,7 @@ "@extensionHealthServiceOnline": { "description": "Tooltip for online extension service" }, - "extensionHealthServiceDegraded": "Service degraded", + "extensionHealthServiceDegraded": "Сервис деградировал", "@extensionHealthServiceDegraded": { "description": "Tooltip for degraded extension service" }, @@ -6117,7 +6283,7 @@ "@extensionHealthServiceOffline": { "description": "Tooltip for offline extension service" }, - "extensionHealthServiceUnknown": "Service status unknown", + "extensionHealthServiceUnknown": "Состояние сервиса неизвестно", "@extensionHealthServiceUnknown": { "description": "Tooltip for unknown extension service health" }, @@ -6162,11 +6328,11 @@ "@permissionNotification": { "description": "Notification permission type label" }, - "errorInvalidFolderSelected": "Invalid folder selected", + "errorInvalidFolderSelected": "Выбрана неверная папка", "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "storeAnyVersion": "Any", + "storeAnyVersion": "Любая", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" }, @@ -6174,7 +6340,7 @@ "@storeCategoryMetadata": { "description": "Store extension category - metadata" }, - "storeCategoryDownload": "Download", + "storeCategoryDownload": "Скачивание", "@storeCategoryDownload": { "description": "Store extension category - download" }, @@ -6211,15 +6377,15 @@ "@settingsSaveDownloadHistory": { "description": "Settings switch title for storing completed downloads in history" }, - "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "settingsSaveDownloadHistorySubtitle": "Сохранять завершённые загрузки в истории и медиатеке", "@settingsSaveDownloadHistorySubtitle": { "description": "Settings switch subtitle for storing completed downloads in history" }, - "dialogDisableHistoryTitle": "Turn off download history?", + "dialogDisableHistoryTitle": "Отключить историю загрузок?", "@dialogDisableHistoryTitle": { "description": "Confirmation dialog title shown before disabling download history" }, - "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "dialogDisableHistoryMessage": "Существующая история будет очищена. Загруженные файлы не будут удалены.", "@dialogDisableHistoryMessage": { "description": "Confirmation dialog message shown before disabling download history" }, @@ -6227,11 +6393,11 @@ "@dialogDisableAndClear": { "description": "Confirmation action to disable download history and clear existing entries" }, - "openInOtherServices": "Open in Other Services", + "openInOtherServices": "Открыть в других сервисах", "@openInOtherServices": { "description": "Title and tooltip for finding the current collection in other services" }, - "shareSheetNoExtensions": "No other compatible services", + "shareSheetNoExtensions": "Нет других совместимых сервисов", "@shareSheetNoExtensions": { "description": "Empty state when no extensions can be searched for cross-service links" }, @@ -6250,7 +6416,7 @@ "service": {} } }, - "libraryPlayback": "Playback", + "libraryPlayback": "Воспроизведение", "@libraryPlayback": { "description": "Section header for playback settings in library settings" }, @@ -6258,19 +6424,19 @@ "@libraryExternalPlayer": { "description": "Setting option to use an external music player" }, - "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", + "libraryExternalPlayerSubtitle": "Рекомендуется для прослушивания, лучшее качество, воспроизведение без пауз, эквалайзер и поддержка более широкого спектра форматов", "@libraryExternalPlayerSubtitle": { "description": "Subtitle for external player option" }, - "libraryBuiltInPreviewPlayer": "Built-in preview player", + "libraryBuiltInPreviewPlayer": "Встроенный плеер для предпросмотра", "@libraryBuiltInPreviewPlayer": { "description": "Setting option to use the built-in preview player" }, - "libraryBuiltInPreviewPlayerSubtitle": "Quick local previews inside SpotiFLAC Mobile", + "libraryBuiltInPreviewPlayerSubtitle": "Быстрое предварительное прослушивание внутри SpotiFLAC Mobile", "@libraryBuiltInPreviewPlayerSubtitle": { "description": "Subtitle for built-in preview player option" }, - "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", + "libraryBuiltInPlayerInfo": "Встроенный плеер предназначен для быстрого предпрослушивания локальных треков. Для полноценного прослушивания используйте внешний музыкальный плеер.", "@libraryBuiltInPlayerInfo": { "description": "Info note explaining the built-in player is for previews only" }, @@ -6286,7 +6452,32 @@ "@nowPlayingMinimize": { "description": "Tooltip for minimizing the now playing screen" }, - "nowPlayingUpNext": "Up next", + "nowPlayingUpNext": "Далее", + "nowPlayingAudioOutput": "Аудиовыход", + "nowPlayingWrittenBy": "Автор(ы): {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Провайдер текста:{provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Получить билеты", + "concertSetList": "Список Концертов", + "concertSetListButton": "Сет-лист", + "concertAddToCalendar": "Добавить в календарь", + "concertOpenMaps": "Открыть карты", + "concertDetailsUnavailable": "Детали концерта в настоящее время недоступны.", + "concertCalendarUnavailable": "Невозможно открыть календарь.", + "nowPlayingAudioOutputUnavailable": "Невозможно открыть настройки аудиовыхода.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6298,15 +6489,15 @@ "@nowPlayingNextTrack": { "description": "Tooltip for the next-track playback control" }, - "nowPlayingDetails": "Details", + "nowPlayingDetails": "Подробности", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" }, - "nowPlayingSleepTimer": "Sleep timer", + "nowPlayingSleepTimer": "Таймер сна", "@nowPlayingSleepTimer": { "description": "Menu item and sheet title for the playback sleep timer" }, - "nowPlayingSleepTimerActive": "Ends at {time}", + "nowPlayingSleepTimerActive": "Заканчивается в {time}", "@nowPlayingSleepTimerActive": { "description": "Active sleep timer deadline shown in the player menu", "placeholders": { @@ -6324,11 +6515,11 @@ } } }, - "nowPlayingSleepTimerOff": "Turn off sleep timer", + "nowPlayingSleepTimerOff": "Отключить таймер сна", "@nowPlayingSleepTimerOff": { "description": "Action to cancel the active playback sleep timer" }, - "nowPlayingSleepTimerSet": "Sleep timer set for {duration}", + "nowPlayingSleepTimerSet": "Таймер сна установлен на {duration}", "@nowPlayingSleepTimerSet": { "description": "Confirmation after setting the playback sleep timer", "placeholders": { @@ -6337,31 +6528,43 @@ } } }, - "nowPlayingSleepTimerCancelled": "Sleep timer turned off", + "nowPlayingSleepTimerCancelled": "Таймер сна отключен", "@nowPlayingSleepTimerCancelled": { "description": "Confirmation after cancelling the playback sleep timer" }, - "nowPlayingOpenInExternalPlayer": "Open in external player", + "nowPlayingOpenInExternalPlayer": "Открыть во внешнем плеере", "@nowPlayingOpenInExternalPlayer": { "description": "Menu item to open the current track in an external player" }, - "nowPlayingTabPlayer": "Player", + "nowPlayingTabPlayer": "Плеер", "@nowPlayingTabPlayer": { "description": "Tab label for the player view" }, - "nowPlayingTabLyrics": "Lyrics", + "nowPlayingTabLyrics": "Текст песни", "@nowPlayingTabLyrics": { "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "В файле нет текста", + "nowPlayingInstrumental": "Инструментальный", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Параметры языка текстов песен", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Скрыть произношение", + "nowPlayingShowPronunciation": "Показать произношение", + "nowPlayingHideTranslation": "Скрыть перевод", + "nowPlayingShowTranslation": "Показать перевод", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, - "nowPlayingLibraryEmpty": "Your library is empty", + "nowPlayingLibraryEmpty": "Ваша медиатека пуста", "@nowPlayingLibraryEmpty": { "description": "Snackbar when shuffle library is requested but library has no tracks" }, - "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", + "nowPlayingShuffleLibraryFailed": "Не удалось перемешать медиатеку: {error}", "@nowPlayingShuffleLibraryFailed": { "description": "Snackbar when shuffling the library fails", "placeholders": { @@ -6370,15 +6573,15 @@ } } }, - "nowPlayingShuffleOn": "Shuffle on", + "nowPlayingShuffleOn": "Перемешивание вкл", "@nowPlayingShuffleOn": { "description": "Tooltip when shuffle mode is enabled" }, - "nowPlayingPlayInOrder": "Play in order", + "nowPlayingPlayInOrder": "Играть в очереди", "@nowPlayingPlayInOrder": { "description": "Tooltip when shuffle mode is disabled" }, - "nowPlayingShuffleLibrary": "Shuffle library", + "nowPlayingShuffleLibrary": "Перемешать медиатеку", "@nowPlayingShuffleLibrary": { "description": "Button label to shuffle and play the entire local library" }, @@ -6390,7 +6593,7 @@ "@nowPlayingNoMetadata": { "description": "Empty state when track metadata cannot be loaded" }, - "announcementUnableToOpenLink": "Unable to open link. Please try again.", + "announcementUnableToOpenLink": "Не удалось открыть ссылку. Пожалуйста, попробуйте еще раз.", "@announcementUnableToOpenLink": { "description": "Snackbar shown when an announcement CTA link cannot be opened" }, @@ -6403,7 +6606,7 @@ } } }, - "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", + "trackConvertConfirmMessageLosslessCapped": "Конвертировать из {sourceFormat} в {targetFormat} ({quality})?\n\nАудио останется в lossless-формате, но битрейт/разрядность и частота дискретизации будут ограничены. Оригинал будет удален после завершения конвертации.", "@trackConvertConfirmMessageLosslessCapped": { "description": "Confirmation dialog message for capped lossless conversion of a single file", "placeholders": { @@ -6418,6 +6621,7 @@ } } }, + "selectionBatchConvertConfirmMessageLossless": "Конвертировать {count} {count, plural, =1{track} other{tracks}} в {format}? (Без потери качества)\n\nОригинальные файлы будут удалены после конвертации.", "selectionBatchConvertConfirmMessageLosslessCapped": "Конвертировать {count} {count, plural, =1{трек} few{трека} other{треков}} в {format} ({quality})?\n\nРезультат останется в кодеке lossless, но разрядность и частота дискретизации будут ограничены. Исходные файлы будут удалены после конвертации.", "@selectionBatchConvertConfirmMessageLosslessCapped": { "description": "Confirmation dialog message for capped lossless batch conversion", @@ -6463,11 +6667,11 @@ } } }, - "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", + "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": "Playing next", + "snackbarPlayingNext": "Следующий", "@snackbarPlayingNext": { "description": "Snackbar when a track is inserted as the next queue item" }, @@ -6484,23 +6688,23 @@ } } }, - "actionShuffle": "Shuffle", + "actionShuffle": "Перемешать", "@actionShuffle": { "description": "Tooltip for shuffle playback action" }, - "downloadPrimaryArtistOnlyOn": "Primary only: On", + "downloadPrimaryArtistOnlyOn": "Только основной: вкл", "@downloadPrimaryArtistOnlyOn": { "description": "Status label when primary-artist-only folder naming is enabled" }, - "downloadPrimaryArtistOnlyOff": "Primary only: Off", + "downloadPrimaryArtistOnlyOff": "Только основной: выкл", "@downloadPrimaryArtistOnlyOff": { "description": "Status label when primary-artist-only folder naming is disabled" }, - "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", + "downloadAlbumArtistMetadataPrimaryOnly": "Метаданные исполнителя альбома: только основные", "@downloadAlbumArtistMetadataPrimaryOnly": { "description": "Status label when album-artist folder filtering uses primary artist only" }, - "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", + "downloadAlbumArtistMetadataFull": "Метаданные исполнителя альбома: Полные", "@downloadAlbumArtistMetadataFull": { "description": "Status label when album-artist folder filtering uses full metadata" }, @@ -6524,7 +6728,7 @@ "@trackConvertResampler": { "description": "Section label for lossless conversion resampler options" }, - "trackConvertDitherNone": "None", + "trackConvertDitherNone": "Нет", "@trackConvertDitherNone": { "description": "Lossless conversion dither option with no dithering applied" }, @@ -6532,7 +6736,7 @@ "@trackConvertDitherTriangular": { "description": "Lossless conversion triangular probability density function dither option" }, - "trackConvertDitherTriangularHp": "Triangular HP", + "trackConvertDitherTriangularHp": "Треугольный с фильтром ВЧ", "@trackConvertDitherTriangularHp": { "description": "Lossless conversion high-pass triangular dither option" }, @@ -6544,7 +6748,7 @@ "@trackConvertResamplerSoxr": { "description": "Lossless conversion SoX resampler option" }, - "updateSeeReleaseNotes": "See release notes for details.", + "updateSeeReleaseNotes": "Смотрите примечания к релизу для подробностей.", "@updateSeeReleaseNotes": { "description": "Fallback changelog text when release notes cannot be parsed" }, @@ -6560,7 +6764,7 @@ "@trackAddToQueue": { "description": "Menu action to add a track to the playback queue" }, - "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", + "snackbarExtensionInstalledEnable": "{extensionName} установлен. Включите его в Настройки > Расширения", "@snackbarExtensionInstalledEnable": { "description": "Snackbar after installing an extension from the repo tab", "placeholders": { @@ -6569,7 +6773,7 @@ } } }, - "snackbarExtensionUpdatedVersion": "{extensionName} обновлено до v{version}", + "snackbarExtensionUpdatedVersion": "{extensionName} обновлён до v{version}", "@snackbarExtensionUpdatedVersion": { "description": "Snackbar after updating an extension from the repo tab", "placeholders": { @@ -6590,7 +6794,7 @@ } } }, - "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", + "snackbarFailedToUpdateNamed": "Не удалось обновить {extensionName}", "@snackbarFailedToUpdateNamed": { "description": "Snackbar when extension update fails in the repo tab", "placeholders": { @@ -6667,15 +6871,15 @@ "@extensionVerificationBrowserTitle": { "description": "Settings option title for extension verification browser preference" }, - "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", + "extensionVerificationBrowserSubtitleExternal": "Открывать верификацию в браузере по умолчанию", "@extensionVerificationBrowserSubtitleExternal": { "description": "Subtitle when external browser is preferred for extension verification" }, - "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", + "extensionVerificationBrowserSubtitleInApp": "Открывать верификацию во внутреннем браузере", "@extensionVerificationBrowserSubtitleInApp": { "description": "Subtitle when in-app browser is preferred for extension verification" }, - "extensionVerificationBrowserExternal": "External", + "extensionVerificationBrowserExternal": "Внешний", "@extensionVerificationBrowserExternal": { "description": "Chip label for external browser verification mode" }, @@ -6683,7 +6887,7 @@ "@extensionVerificationBrowserInApp": { "description": "Chip label for in-app browser verification mode" }, - "extensionVerificationUnavailable": "No verification page is available for {extension}. Retry the download to request a new challenge.", + "extensionVerificationUnavailable": "Для {extension} нет доступной страницы подтверждения. Повторите загрузку, чтобы запросить новую задачу.", "@extensionVerificationUnavailable": { "description": "Shown when the app cannot retrieve a pending verification challenge", "placeholders": { @@ -6704,7 +6908,7 @@ "@extensionVerificationHelpMessageManual": { "description": "Dialog message when automatic browser launch for verification fails" }, - "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", + "extensionVerificationHelpMessageWaiting": "Если окно браузера не открылось либо проверка завершилась, но приложение SpotiFLAC Mobile не открылось автоматически, перейдите по ссылке повторно или скопируйте её вручную.", "@extensionVerificationHelpMessageWaiting": { "description": "Dialog message when verification may need manual browser help" }, @@ -6737,11 +6941,11 @@ } } }, - "settingsGroupInterface": "Extensions & appearance", + "settingsGroupInterface": "Расширения и внешний вид", "@settingsGroupInterface": { "description": "Settings group covering look and feel" }, - "settingsGroupContent": "Content & metadata", + "settingsGroupContent": "Содержимое и метаданные", "@settingsGroupContent": { "description": "Settings group covering the library, metadata and lyrics" }, @@ -6761,53 +6965,60 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, - "trackOptionCopyTrackName": "Copy track name", + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, + "trackOptionCopyTrackName": "Копировать название трека", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" }, - "trackOptionCopyArtist": "Copy artist", + "trackOptionCopyArtist": "Копировать исполнителя", "@trackOptionCopyArtist": { "description": "Track menu action that copies the artist name" }, - "trackOptionCopyTrackAndArtist": "Copy track and artist", + "trackOptionCopyTrackAndArtist": "Копировать трек и исполнителя", "@trackOptionCopyTrackAndArtist": { "description": "Track menu action that copies the track title and artist" }, - "metadataCopyValue": "Copy value", + "metadataCopyValue": "Копировать значение", "@metadataCopyValue": { "description": "Metadata menu action that copies only the selected value" }, - "metadataCopyField": "Copy field and value", + "metadataCopyField": "Копировать поле и значение", "@metadataCopyField": { "description": "Metadata menu action that copies the selected key and value" }, - "mornyeShowTabs": "Show tabs", + "mornyeShowTabs": "Показывать вкладки", "mornyeSearch": "Поиск", - "mornyeContinuePlaying": "Continue Playing", + "mornyeContinuePlaying": "Продолжить воспроизведение", "metadataCopyAll": "Скопировать все метаданные", "@metadataCopyAll": { "description": "Metadata menu action that copies every visible key and value" }, - "optionsEmbeddedCoverSize": "Embedded Cover Size", + "optionsEmbeddedCoverSize": "Размер встраиваемой обложки", "@optionsEmbeddedCoverSize": { "description": "Metadata setting that limits downloaded artwork resolution before it is embedded" }, - "optionsEmbeddedCoverSizeDescription": "Downscale remotely downloaded cover art before embedding it. Images already within the limit are kept unchanged.", + "optionsEmbeddedCoverSizeDescription": "Масштабировать загруженные обложки перед записью. Обложки, уже соответствующие лимиту, не изменяются.", "@optionsEmbeddedCoverSizeDescription": { "description": "Description shown in the embedded cover size picker" }, - "mornyeFavorite": "Favorite", + "mornyeFavorite": "В избранное", "mornyeGoToArtist": "Перейти к исполнителю", "@mornyeFavorite": { "description": "Compact context menu action that adds a track to Loved" }, - "mornyeFavorited": "Favorited", + "mornyeFavorited": "Избранное", "@mornyeFavorited": { "description": "Selected state of the compact favorite action" }, - "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", - "autoMixOn": "AutoMix on", - "autoMixOff": "AutoMix off", + "autoMixDescription": "Плавный переход с подгонкой темпа и сохранением тональности. При невозможности синхронизации битов применяется кроссфейд.", + "autoMixOn": "Автомикс вкл", + "autoMixOff": "Автомикс выкл", + "autoplayOn": "Автовоспроизведение вкл", + "autoplayOff": "Автовоспроизведение выкл", + "autoplayFromLibrary": "Автовоспроизведение из вашей медиатеки", "profileTitle": "Профиль", "profileSetUp": "Настройте свой профиль", "profileEdit": "Изменить имя и фото", @@ -6818,6 +7029,9 @@ "profileRemovePhoto": "Удалить фото", "profilePhotoError": "Выберите изображение размером менее 20 МБ.", "profileSaveError": "Не удалось сохранить ваш профиль. Пожалуйста, попробуйте еще раз.", + "artistUpcomingConcerts": "Предстоящие концерты", + "artistAllUpcomingConcerts": "Все предстоящие концерты", + "artistNoUpcomingConcerts": "Нет предстоящих концертов.", "optionsEmbeddedCoverSizeOriginal": "Оригинальное разрешение", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" diff --git a/lib/l10n/arb/app_tr.arb b/lib/l10n/arb/app_tr.arb index e54e3a33..73cf0c27 100644 --- a/lib/l10n/arb/app_tr.arb +++ b/lib/l10n/arb/app_tr.arb @@ -1,4 +1,31 @@ { + "settingsPlaybackSubtitle": "Player, volume, AutoMix, and audio output", + "sectionPlayer": "Player", + "sectionVolumeAndTransitions": "Volume and transitions", + "sectionAudioOutput": "Audio output", + "usbBitPerfect": "Hi-res and bit-perfect audio", + "usbBitPerfectDescription": "Preserve source precision on compatible outputs. Choose direct USB or AAudio exclusive below; otherwise Android USB output requires Android 14 or later. Applies from the next track, without AutoMix or normalization. System volume may not control direct USB.", + "usbHardwareVolume": "DAC hardware volume", + "usbVolumeWarningTitle": "Check your listening volume", + "usbVolumeWarning": "Direct USB audio can be much louder than normal playback, and phone volume buttons may not control it. Lower your DAC or amplifier volume before starting. When supported, SpotiFLAC sets the DAC to at most −40 dB on connection; this does not guarantee a safe listening level on every amplifier or headphone.", + "usbVolumeAccept": "I understand", + "usbVolumeUnavailable": "Playback is paused because this DAC has no verified hardware volume control. Lower the DAC or amplifier volume, then enable fixed-volume output if needed and select the track again.", + "usbFixedVolume": "Allow fixed-volume USB output", + "usbFixedVolumeDescription": "For DACs without a volume control accessible to the app. Keep off for USB headsets without their own volume control. Applies from the next track.", + "usbFixedVolumeWarning": "The app cannot lower the volume on this output. Audio may start at full level, and the phone volume slider will not help. Only continue after lowering the volume on your DAC or external amplifier. Do not enable this for a headset without its own volume control.", + "dapExclusive": "DAP hi-res (AAudio exclusive)", + "dapExclusiveDescription": "Use Oboe/AAudio at the track's original rate and precision for FLAC/WAV PCM. Requires Android 8.1 or later and compatible hardware. Exclusive access is checked; unavailable formats use normal playback. DSD requires the direct USB driver. Applies from the next track.", + "dapExclusiveUnavailable": "AAudio exclusive access is unavailable for this track and current output. Using normal playback. For a USB DAC, try the direct USB driver.", + "usbDirect": "Direct USB driver", + "usbDirectDescription": "Use exclusive USB audio for FLAC/WAV, DSF/DFF and WavPack DSD, with Android USB permission. Native DSD requires a recognized compatible DAC. Other PCM formats use normal playback. Applies from the next track.", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "Enable only if your DAC explicitly supports DoP. Sends DSF/DFF and WavPack DSD inside a PCM carrier when native DSD is unavailable. An incompatible device may play noise; leave off for ordinary USB headsets.", + "usbDsdUnsupported": "This DSD format or connected DAC is not supported. Playback stopped.", + "usbPermissionDenied": "USB permission was not granted. Using normal playback.", + "usbBitPerfectPending": "Waiting for the next track and a compatible USB output.", + "usbBitPerfectNoDevice": "No USB DAC connected. Using normal audio output.", + "usbBitPerfectFallback": "This device or audio format does not support bit-perfect output. Using normal playback.", + "usbBitPerfectRouteChanged": "The USB audio route changed. Playback paused; select a track to reconnect.", "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Make it\nyour own.", "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", @@ -31,11 +58,37 @@ "upgradeIntroReplay": "What’s new in 5.0", "cacheMotionArtwork": "Offline motion covers", "cacheMotionArtworkDesc": "Album videos saved with downloads. Removing them keeps your music files and static covers.", - "nowPlayingVolume": "Volume", + "nowPlayingVolume": "Ses", "@nowPlayingVolume": { "description": "System volume control label in the Mornye player" }, "appearanceStyle": "App Style", + "appearanceAccentRed": "Red (default)", + "appearanceAccentOrange": "Turuncu", + "appearanceAccentGreen": "Yeşil", + "appearanceAccentTeal": "Teal", + "appearanceAccentBlue": "Mavi", + "appearanceAccentPurple": "Mor", + "appearanceAccentPink": "Pembe", + "appearanceGlassClarity": "Glass clarity", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Tinted", + "appearanceGlassClear": "Clear", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Sistem yazı tipini kullan", + "appearanceUseSystemFontSubtitle": "Use your device’s default typeface for app text.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -98,7 +151,7 @@ "description": "Filter chip - show singles only" }, "libraryRecentlyAdded": "Recently Added", - "libraryDownloads": "Downloads", + "libraryDownloads": "İndirilenler", "libraryNoActiveDownloads": "No active downloads", "librarySearchHint": "Search your library", "libraryEmptyCollection": "Your music will appear here", @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Remove ReplayGain", + "trackRemoveReplayGainSuccess": "ReplayGain tags removed", + "trackRemoveReplayGainFailed": "Failed to remove ReplayGain tags", + "replayGainRemoving": "Removing ReplayGain...", + "replayGainRemoveConfirmMessage": "Remove track and album ReplayGain tags from {count} track(s)? Audio, artwork, and other metadata will be preserved.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Remove RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain removed from {success} of {total} tracks", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "Eklenti Deposu", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -756,15 +849,15 @@ "@dialogDownload": { "description": "Confirm button in Download All dialog" }, - "previewPlay": "Play preview", + "previewPlay": "Ön izlemeyi oynat", "@previewPlay": { "description": "Tooltip for the button that plays a short track preview snippet" }, - "previewStop": "Stop preview", + "previewStop": "Ön izlemeyi durdur", "@previewStop": { "description": "Tooltip for the button that stops the playing track preview snippet" }, - "previewUnavailable": "Preview unavailable", + "previewUnavailable": "Ön izleme mevcut değil", "@previewUnavailable": { "description": "Snackbar shown when a track preview snippet cannot be played" }, @@ -848,7 +941,7 @@ } } }, - "collectionExportM3u": "Export as M3U8", + "collectionExportM3u": "M3U8 olarak dışarı aktar", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "Şarkı Sözü Modu", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2089,7 +2184,7 @@ "@downloadAutoConvertFormatSubtitle": { "description": "Automatic conversion format picker explanation" }, - "downloadAutoConvertBitrate": "Output quality", + "downloadAutoConvertBitrate": "Çıktı kalitesi", "@downloadAutoConvertBitrate": { "description": "Automatic conversion bitrate setting" }, @@ -2626,7 +2721,7 @@ } } }, - "libraryExternalStorage": "External storage", + "libraryExternalStorage": "Harici depolama", "@libraryExternalStorage": { "description": "Label for a removable or external library source" }, @@ -2749,7 +2844,7 @@ "@libraryLastScannedNever": { "description": "Shown when library has never been scanned" }, - "libraryScanning": "Scanning...", + "libraryScanning": "Taranıyor...", "@libraryScanning": { "description": "Status during scan" }, @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{total} dosyanın {progress}%'si", "@libraryScanProgress": { "description": "Scan progress display", @@ -2798,7 +2897,7 @@ "@libraryFolderNotExist": { "description": "Error when folder doesn't exist" }, - "librarySourceDownloaded": "Downloaded", + "librarySourceDownloaded": "İndirildi", "@librarySourceDownloaded": { "description": "Badge for tracks downloaded via SpotiFLAC" }, @@ -2806,7 +2905,7 @@ "@librarySourceLocal": { "description": "Badge for tracks from local library scan" }, - "libraryFilterAll": "All", + "libraryFilterAll": "Tümü", "@libraryFilterAll": { "description": "Filter chip - show all library items" }, @@ -3274,19 +3373,19 @@ "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" }, - "trackReEnrichFieldLyrics": "Lyrics", + "trackReEnrichFieldLyrics": "Şarkı Sözleri", "@trackReEnrichFieldLyrics": { "description": "Checkbox label for lyrics field in re-enrich" }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", + "trackReEnrichFieldBasicTags": "Albüm, Albüm Sanatçısı", "@trackReEnrichFieldBasicTags": { "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "trackReEnrichFieldTrackInfo": "Parça ve Disk Numarası", "@trackReEnrichFieldTrackInfo": { "description": "Checkbox label for track info in re-enrich" }, - "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "trackReEnrichFieldReleaseInfo": "Tarih ve ISRC", "@trackReEnrichFieldReleaseInfo": { "description": "Checkbox label for release info in re-enrich" }, @@ -3298,7 +3397,7 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, - "trackReEnrichModeIsrc": "ISRC only", + "trackReEnrichModeIsrc": "Sadece ISRC", "@trackReEnrichModeIsrc": { "description": "Batch metadata mode that only writes ISRC" }, @@ -3654,7 +3753,7 @@ "@collectionPlaylist": { "description": "Single playlist label" }, - "collectionAddToPlaylist": "Add to playlist", + "collectionAddToPlaylist": "Çalma listesine ekle", "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" }, @@ -4626,19 +4725,19 @@ "@editMetadataFieldTitle": { "description": "Chip label for title field in auto-fill selector" }, - "editMetadataFieldArtist": "Artist", + "editMetadataFieldArtist": "Sanatçı", "@editMetadataFieldArtist": { "description": "Chip label for artist field in auto-fill selector" }, - "editMetadataFieldAlbum": "Album", + "editMetadataFieldAlbum": "Albüm", "@editMetadataFieldAlbum": { "description": "Chip label for album field in auto-fill selector" }, - "editMetadataFieldAlbumArtist": "Album Artist", + "editMetadataFieldAlbumArtist": "Albüm Sanatçısı", "@editMetadataFieldAlbumArtist": { "description": "Chip label for album artist field in auto-fill selector" }, - "editMetadataFieldDate": "Date", + "editMetadataFieldDate": "Tarih", "@editMetadataFieldDate": { "description": "Chip label for date field in auto-fill selector" }, @@ -4650,7 +4749,7 @@ "@editMetadataFieldDiscNum": { "description": "Chip label for disc number field in auto-fill selector" }, - "editMetadataFieldGenre": "Genre", + "editMetadataFieldGenre": "Tür", "@editMetadataFieldGenre": { "description": "Chip label for genre field in auto-fill selector" }, @@ -4910,6 +5009,61 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "Inspect the spectrum and active bit depth for signs of upsampling or padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Limited bandwidth", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No upsampling or padding detected", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Estimated cutoff", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Active / stored bits", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "A lower cutoff can come from mastering. It does not, by itself, prove upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Based on {seconds} seconds of audio. This analysis cannot certify the original master.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "The spectrum contains mirrored bands consistent with upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "A sharp roll-off near {cutoff} and the measured noise floor suggest a lower-rate source.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energy above {cutoff} is mostly steady in the analyzed segment and may be noise.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -5548,7 +5715,7 @@ "@logIssueTrackNotFoundSuggestion": { "description": "Diagnostic badge suggestion when a track is unavailable" }, - "clickableLookingUpArtist": "Looking up artist...", + "clickableLookingUpArtist": "Sanatçı aranıyor...", "@clickableLookingUpArtist": { "description": "Snackbar shown while clickable artist metadata is being resolved" }, @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Up next", + "nowPlayingAudioOutput": "Audio Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Get Tickets", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Open Maps", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Lyrics language options", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Hide Pronunciation", + "nowPlayingShowPronunciation": "Show Pronunciation", + "nowPlayingHideTranslation": "Hide Translation", + "nowPlayingShowTranslation": "Show Translation", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copy track name", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6808,6 +7016,9 @@ "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", "autoMixOn": "AutoMix on", "autoMixOff": "AutoMix off", + "autoplayOn": "Autoplay on", + "autoplayOff": "Autoplay off", + "autoplayFromLibrary": "Autoplay from your Library", "profileTitle": "Profile", "profileSetUp": "Set up your profile", "profileEdit": "Edit name and photo", @@ -6818,8 +7029,11 @@ "profileRemovePhoto": "Remove photo", "profilePhotoError": "Choose a valid image smaller than 20 MB.", "profileSaveError": "Could not save your profile. Please try again.", + "artistUpcomingConcerts": "Upcoming Concerts", + "artistAllUpcomingConcerts": "All Upcoming Concerts", + "artistNoUpcomingConcerts": "No upcoming concerts.", "optionsEmbeddedCoverSizeOriginal": "Original resolution", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" } -} +} \ No newline at end of file diff --git a/lib/l10n/arb/app_uk.arb b/lib/l10n/arb/app_uk.arb index 3ffa3697..9fcfb7a2 100644 --- a/lib/l10n/arb/app_uk.arb +++ b/lib/l10n/arb/app_uk.arb @@ -1,47 +1,123 @@ { - "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", - "upgradeIntroThemeTitle": "Make it\nyour own.", - "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", - "upgradeIntroThemeMaterialBody": "The familiar layout, with Material controls and your accent color.", - "upgradeIntroThemeMornyeBody": "Glass navigation, a redesigned Library and an immersive player.", - "upgradeIntroRustTitle": "A new engine.\nBuilt with Rust.", - "upgradeIntroRustBody": "In 5.0, the app’s backend has moved from Go to Rust. It is the engine working behind the screens you use every day.", - "upgradeIntroRustEngineTitle": "Working behind the scenes", - "upgradeIntroRustEngineBody": "Rust handles downloads, audio metadata, library scanning and the extension runtime on Android and iOS.", - "upgradeIntroRustMemoryTitle": "More careful with memory", - "upgradeIntroRustMemoryBody": "Reused buffers and fewer copies reduce temporary allocations when processing artwork and extension data.", - "upgradeIntroRustKeepTitle": "Keep your music", - "upgradeIntroRustKeepBody": "No need to download your collection again. Your saved music and settings stay in place, with no new setup required.", - "upgradeIntroWelcomeBody": "A quick look at what has changed, and where to find it.", - "upgradeIntroMornyeBody": "A new look for your player, lyrics and navigation.", - "upgradeIntroLibrarySummary": "Browse your music by playlist, artist or album.", - "upgradeIntroRepoSummary": "Choose your music sources and providers through extensions.", - "upgradeIntroLibraryTitle": "Get to know\nyour Library.", - "upgradeIntroLibraryBody": "In Mornye, browse by category or find your albums in Recently Added.", - "upgradeIntroDownloadsBody": "Pause and retry from Downloads at the top right. Finished music moves to Recently Added.", - "upgradeIntroSearchBody": "Search saved music here. The separate Search tab looks through your extensions.", - "upgradeIntroPlayerTitle": "Set up\nyour player.", - "upgradeIntroPlayerBody": "You can change your theme and playback options at any time. Here is where to find them.", - "upgradeIntroAppearanceBody": "Change themes in Settings → Appearance. In Mornye, scroll down for compact navigation; scroll up to expand it.", - "upgradeIntroAutoMixBody": "Match tempo and beats between tracks. Enable it in Settings → Local Library → Playback. Off by default.", - "upgradeIntroSettingsBody": "In Mornye, tap your profile on Home to open Settings and edit your name and photo.", - "upgradeIntroSkip": "Skip", - "upgradeIntroContinue": "Continue", - "upgradeIntroDone": "Start listening", - "upgradeIntroReplay": "What’s new in 5.0", - "cacheMotionArtwork": "Offline motion covers", - "cacheMotionArtworkDesc": "Album videos saved with downloads. Removing them keeps your music files and static covers.", - "nowPlayingVolume": "Volume", + "extensionsNoExtensions": "Розширень не встановлено", + "@extensionsNoExtensions": { + "description": "Empty state - no extensions" + }, + "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", + "@trackConvertActionLabelLossy": { + "description": "Convert button label for lossy conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "trackConvertResamplerSwr": "SWR", + "@trackConvertResamplerSwr": { + "description": "Lossless conversion default FFmpeg swresample resampler option" + }, + "settingsPlaybackSubtitle": "Плеєр, гучність, автомікшування та аудіовихід", + "sectionPlayer": "Плеєр", + "sectionVolumeAndTransitions": "Гучність та переходи", + "sectionAudioOutput": "Аудіо вихід", + "usbBitPerfect": "Hi-res та якісне аудіо", + "usbBitPerfectDescription": "Зберігає точність джерела на сумісних виходах. Виберіть нижче прямий USB або ексклюзивний AAudio; в іншому випадку для виходу Android USB потрібен Android 14 або пізніша версія. Застосовується з наступного треку, без автомікшування або нормалізації. Системна гучність може не керувати прямим USB.", + "usbHardwareVolume": "Апаратний обсяг ЦАП", + "usbVolumeWarningTitle": "Перевірте гучність прослуховування", + "usbVolumeWarning": "Пряме відтворення аудіо через USB може бути набагато гучнішим за звичайне, і кнопки гучності телефону можуть не керувати ним. Зменште гучність ЦАП або підсилювача перед початком роботи. Якщо підтримується, SpotiFLAC встановлює ЦАП максимум на −40 дБ під час підключення; це не гарантує безпечного рівня прослуховування на кожному підсилювачі чи навушниках.", + "usbVolumeAccept": "Я розумію", + "usbVolumeUnavailable": "Відтворення призупинено, оскільки цей ЦАП не має перевіреного апаратного керування гучністю. Зменште гучність ЦАП або підсилювача, потім за потреби увімкніть вихід з фіксованою гучністю та виберіть доріжку ще раз.", + "usbFixedVolume": "Дозволити вихід USB з фіксованою гучністю", + "usbFixedVolumeDescription": "Для ЦАП без регулятора гучності, доступного в додатку. Вимкнено для USB-гарнітур без власного регулятора гучності. Діє з наступного треку.", + "usbFixedVolumeWarning": "Додаток не може зменшити гучність на цьому виході. Звук може початися на повній гучності, і повзунок гучності телефону не допоможе. Продовжуйте лише після зменшення гучності на ЦАП або зовнішньому підсилювачі. Не вмикайте цю функцію для гарнітури без власного регулятора гучності.", + "dapExclusive": "DAP hi-res (ексклюзивно для AAudio)", + "dapExclusiveDescription": "Використовуйте Oboe/AAudio з оригінальною частотою та точністю треку для FLAC/WAV PCM. Потрібен Android 8.1 або пізнішої версії та сумісне обладнання. Ексклюзивний доступ позначено; недоступні формати використовують звичайне відтворення. DSD вимагає драйвера Direct USB. Застосовується з наступного треку.", + "dapExclusiveUnavailable": "Ексклюзивний доступ до аудіо недоступний для цієї доріжки та поточного виходу. Використовується звичайне відтворення. Для USB DAC спробуйте драйвер Direct USB.", + "usbDirect": "Прямий драйвер USB", + "usbDirectDescription": "Використовуйте ексклюзивно USB-аудіо для FLAC/WAV, DSF/DFF та WavPack DSD з дозволом Android USB. Для нативного DSD потрібен розпізнаний сумісний ЦАП. Інші формати PCM використовують звичайне відтворення. Застосовується з наступного треку.", + "usbDsdOverPcm": "DSD поверх PCM (DoP)", + "usbDsdOverPcmDescription": "Увімкніть, лише якщо ваш ЦАП явно підтримує DoP. Надсилає DSF/DFF та WavPack DSD всередині поточної PCM, коли власний DSD недоступний. Несумісний пристрій може відтворювати шум; не виключайте для звичайних USB-гарнітур.", + "usbDsdUnsupported": "Цей формат DSD або підключений ЦАП не підтримується. Відтворення зупинено.", + "usbPermissionDenied": "Дозвіл на USB не надано. Використовується звичайне відтворення.", + "usbBitPerfectPending": "Чекайте на наступний трек та сумісний USB-вихід.", + "usbBitPerfectNoDevice": "Не під'єднаний USB-ЦАП. Використовується звичайний аудіовихід.", + "usbBitPerfectFallback": "Цей пристрій або аудіоформат не підтримує високо - бітовий вихід. Використовується звичайне відтворення.", + "usbBitPerfectRouteChanged": "Шлях аудіо USB змінився. Відтворення призупинено; виберіть доріжку для повторного підключення.", + "upgradeIntroWelcome": "Ласкаво просимо до SpotiFLAC-Mobile 5.0", + "upgradeIntroThemeTitle": "Зробіть це самостійно.", + "upgradeIntroThemeBody": "Виберіть вигляд. Ваш вибір застосовується негайно, і ви можете змінити його пізніше у розділі \"Зовнішній вигляд\".", + "upgradeIntroThemeMaterialBody": "Звичний макет з елементами керування матеріалами та вашим акцентним кольором.", + "upgradeIntroThemeMornyeBody": "Навігація Glass, перероблена Бібліотека та імерсивний плеєр.", + "upgradeIntroRustTitle": "Новий рушій.\nЗроблено за допомогою Rust.", + "upgradeIntroRustBody": "У версії 5.0 серверна частина програми перемістилася з Go на Rust. Це рушій, що працює за екранами, якими ви користуєтеся щодня.", + "upgradeIntroRustEngineTitle": "Робота за лаштунками", + "upgradeIntroRustEngineBody": "Rust обробляє завантаження, аудіометадані, сканування бібліотек та середовище виконання розширень на Android та iOS.", + "upgradeIntroRustMemoryTitle": "Обережніше з пам'яттю", + "upgradeIntroRustMemoryBody": "Повторно використані буфери та менша кількість копій зменшують тимчасові виділення під час обробки даних ілюстрацій та розширень.", + "upgradeIntroRustKeepTitle": "Зберегти свою музику", + "upgradeIntroRustKeepBody": "Немає потреби завантажувати свою колекцію знову. Ваша збережена музика та налаштування залишаються незмінними, без потреби в новому налаштуванні.", + "upgradeIntroWelcomeBody": "Короткий огляд того, що змінилося та де це знайти.", + "upgradeIntroMornyeBody": "Новий вигляд вашого плеєра, текстів пісень та навігації.", + "upgradeIntroLibrarySummary": "Переглядайте музику за списком відтворення, виконавцем або альбомом.", + "upgradeIntroRepoSummary": "Вибирайте джерела та постачальників музики за допомогою розширень.", + "upgradeIntroLibraryTitle": "Дізнатися про вашу бібліотеку.", + "upgradeIntroLibraryBody": "У Mornye переглядайте альбоми за категоріями або знаходьте їх у розділі «Нещодавно додані».", + "upgradeIntroDownloadsBody": "Зупиніть та повторіть спробу з розділу «Завантаження» у верхньому правому куті. Відтворена музика переміщується до розділу «Нещодавно додані».", + "upgradeIntroSearchBody": "Шукайте збережену музику тут. Окрема вкладка «Пошук» перегляне ваші розширення.", + "upgradeIntroPlayerTitle": "Налаштуйте свій плеєр.", + "upgradeIntroPlayerBody": "Ви можете змінити тему та параметри відтворення будь-коли. Ось де їх знайти.", + "upgradeIntroAppearanceBody": "Змініть теми в Налаштуваннях → Зовнішній вигляд. У Mornye прокрутіть униз для компактної навігації; прокрутіть угору, щоб розгорнути її.", + "upgradeIntroAutoMixBody": "Узгоджувати темп і ритми між треками. Увімкніть цю функцію в Налаштуваннях → Локальна бібліотека → Відтворення. Вимкнено за замовчуванням.", + "upgradeIntroSettingsBody": "У Mornye натисніть на свій профіль на головній сторінці, щоб відкрити налаштування та відредагувати своє ім’я й фотографію.", + "upgradeIntroSkip": "Пропустити", + "upgradeIntroContinue": "Продовжити", + "upgradeIntroDone": "Початок прослуховування", + "upgradeIntroReplay": "Що нового у версії 5.0", + "cacheMotionArtwork": "Рухомі обкладинки Offline", + "cacheMotionArtworkDesc": "Відеоальбоми зберігаються разом із завантаженнями. Після їх видалення ваші музичні файли та статичні обкладинки залишаться.", + "nowPlayingVolume": "Гучність", "@nowPlayingVolume": { "description": "System volume control label in the Mornye player" }, - "appearanceStyle": "App Style", + "appearanceStyle": "Стиль програми", + "appearanceAccentRed": "Червоний (за замовчуванням)", + "appearanceAccentOrange": "Помаранчевий", + "appearanceAccentGreen": "Зелений", + "appearanceAccentTeal": "Бірюзовий", + "appearanceAccentBlue": "Блакитний", + "appearanceAccentPurple": "Фіолетовий", + "appearanceAccentPink": "Рожевий", + "appearanceGlassClarity": "Прозорість скла", + "appearanceGlassClaritySubtitle": "Налаштуйте прозорість меню та навігації Mornye. Контрастність тексту зберігається.", + "appearanceGlassTinted": "Тонований", + "appearanceGlassClear": "Очистити", + "appearanceGlassClarityBlurOff": "Скло на цьому пристрої непрозоре. Увімкніть «{setting}», щоб налаштувати прозорість.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Скло залишається непрозорим, доки в системі ввімкнено режим високої контрастності.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Використовувати системний шрифт", + "appearanceUseSystemFontSubtitle": "Використовуйте стандартний шрифт вашого пристрою для тексту в додатку.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, "@@locale": "uk", "@@last_modified": "2026-04-28", - "appName": "", + "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" }, @@ -69,11 +145,11 @@ "@homeSubtitle": { "description": "Subtitle shown below search box" }, - "homeEmptyTitle": "", + "homeEmptyTitle": "Поки що немає постачальників послуг пошуку", "@homeEmptyTitle": { "description": "Title shown on home when no providers are available yet" }, - "homeEmptySubtitle": "Install an extension to continue.", + "homeEmptySubtitle": "Встановіть розширення, щоб продовжити.", "@homeEmptySubtitle": { "description": "Subtitle shown on home when no providers are available yet" }, @@ -97,11 +173,11 @@ "@historyFilterSingles": { "description": "Filter chip - show singles only" }, - "libraryRecentlyAdded": "Recently Added", - "libraryDownloads": "Downloads", - "libraryNoActiveDownloads": "No active downloads", - "librarySearchHint": "Search your library", - "libraryEmptyCollection": "Your music will appear here", + "libraryRecentlyAdded": "Нещодавно додані", + "libraryDownloads": "Завантаження", + "libraryNoActiveDownloads": "Немає активних завантажень", + "librarySearchHint": "Пошук у вашій бібліотеці", + "libraryEmptyCollection": "Ваша музика з’явиться тут", "historySearchHint": "Історія пошуку...", "@historySearchHint": { "description": "Search bar placeholder in history" @@ -142,11 +218,11 @@ "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, - "downloadSingleFilenameFormatDescription": "Шаблон назви файлу для синглів та міні-альбомів. Використовує ті самі теги, що й формат альбому.", + "downloadSingleFilenameFormatDescription": "Шаблон назви файлу для синглів та мініальбомів. Використовує ті самі теги, що й формат альбому.", "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, - "downloadFolderOrganization": "Організація папок", + "downloadFolderOrganization": "Організація теки", "@downloadFolderOrganization": { "description": "Title of the folder organization picker bottom sheet" }, @@ -190,7 +266,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", + "optionsPrimaryProviderSubtitle": "Сервіс для пошуку за назвою треку або альбому", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -211,7 +287,7 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsAutoFallback": "Автоматичний резервний варіант", + "optionsAutoFallback": "Авто. резервний варіант", "@optionsAutoFallback": { "description": "Auto-retry with other services" }, @@ -223,7 +299,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", + "optionsEmbedLyricsSubtitle": "Зберігайте синхронізовані тексти пісень разом із завантаженими треками", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -239,22 +315,54 @@ "@optionsReplayGainSubtitleOff": { "description": "Subtitle when ReplayGain is disabled" }, - "trackReplayGain": "Rescan ReplayGain", + "trackReplayGain": "Повторне сканування ReplayGain", "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainScanning": "Analyzing loudness...", + "trackReplayGainScanning": "Аналіз гучності...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" }, - "trackReplayGainSuccess": "ReplayGain tags added", + "trackReplayGainSuccess": "Додано теги ReplayGain", "@trackReplayGainSuccess": { "description": "Snackbar message after ReplayGain tags written for a single track" }, - "trackReplayGainFailed": "Failed to add ReplayGain tags", + "trackReplayGainFailed": "Не вдалося додати теги ReplayGain", "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Видалити ReplayGain", + "trackRemoveReplayGainSuccess": "Теги ReplayGain видалено", + "trackRemoveReplayGainFailed": "Не вдалося видалити теги ReplayGain", + "replayGainRemoving": "Видалення ReplayGain...", + "replayGainRemoveConfirmMessage": "Видалити теги ReplayGain для треків та альбомів з {count} трек(s)? Аудіодані, обкладинки та інші метадані буде збережено.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Видалити RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain видалено з {success} з {total} треків", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -264,11 +372,11 @@ } } }, - "replayGainBatchConfirmTitle": "Add ReplayGain", + "replayGainBatchConfirmTitle": "Додати ReplayGain", "@replayGainBatchConfirmTitle": { "description": "Title of the batch ReplayGain confirmation dialog" }, - "replayGainBatchConfirmMessage": "Analyze loudness and write ReplayGain tags to {count} track(s)?", + "replayGainBatchConfirmMessage": "Проаналізувати гучність та записати теги ReplayGain на {count} трек(s)?", "@replayGainBatchConfirmMessage": { "description": "Message of the batch ReplayGain confirmation dialog", "placeholders": { @@ -277,12 +385,12 @@ } } }, - "replayGainBatchAnalyzing": "Analyzing ReplayGain...", + "replayGainBatchAnalyzing": "Аналіз ReplayGain...", "@replayGainBatchAnalyzing": { "description": "Progress dialog title while batch scanning ReplayGain" }, - "replayGainBatchSuccess": "ReplayGain added to {success} of {total} tracks", - "replayGainUnsupportedDecoder": "Some tracks could not be analyzed because their audio codec is not supported by the ReplayGain decoder. Their files were not changed.", + "replayGainBatchSuccess": "ReplayGain додано до {success} з {total} треків", + "replayGainUnsupportedDecoder": "Деякі треки не вдалося проаналізувати, оскільки їхній аудіокодек не підтримується декодером ReplayGain. Їхні файли не були змінені.", "@replayGainBatchSuccess": { "description": "Snackbar after batch ReplayGain completes", "placeholders": { @@ -302,10 +410,6 @@ "@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": "Для максимальної сумісності програвача напишіть одне значення ARTIST, наприклад, «Виконавець A, Виконавець B».", "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" @@ -318,6 +422,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Тільки основний виконавець", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Вказуйте лише першого виконавця наприклад, «Artist A» у полях «Виконавець» та «Виконавець альбому» для всіх форматів, щоб програвачі показувати лише одного виконавця.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "Репозиторій розширень", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -451,7 +563,7 @@ "@aboutPCSource": { "description": "Link to PC GitHub repo" }, - "aboutKeepAndroidOpen": "Keep Android Open", + "aboutKeepAndroidOpen": "Зберігайте Android відкритим", "@aboutKeepAndroidOpen": { "description": "Link to Keep Android Open campaign website" }, @@ -499,27 +611,27 @@ "@aboutVersion": { "description": "Version info label" }, - "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", + "aboutBinimumDesc": "Розробник QQDL та HiFi API. Цей проєкт допоміг сформувати підтримку завантаження формату lossless.", "@aboutBinimumDesc": { "description": "Credit description for binimum" }, - "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", + "aboutSachinsenalDesc": "Автор оригінального проєкту HiFi. Основа для інтеграції джерел формату lossless.", "@aboutSachinsenalDesc": { "description": "Credit description for sachinsenal0x64" }, - "aboutUnituneDesc": "Open-source music link resolver by Flaze, used for cross-platform fallback matching.", + "aboutUnituneDesc": "Розв'язувач музичних посилань з відкритим кодом від Flaze, що використовується для кросплатформного підбору альтернативних варіантів.", "@aboutUnituneDesc": { "description": "Credit for the UniTune resolver" }, - "aboutMusicBrainzDesc": "Open music database maintained by MetaBrainz and its community, used for recording cross-references.", + "aboutMusicBrainzDesc": "Відкрита музична база даних, яку підтримують MetaBrainz та її спільнота; використовується для фіксації перехресних посилань.", "@aboutMusicBrainzDesc": { "description": "Credit for the MusicBrainz database" }, - "aboutSquiglyDesc": "Universal music link service by Liam Macmillan, used as a final cross-platform resolver fallback.", + "aboutSquiglyDesc": "Універсальний сервіс посилань на музику від Liam Macmillan, що використовується як кінцевий резервний варіант для кросплатформного визначення цільової сторінки.", "@aboutSquiglyDesc": { "description": "Credit for the Squigly resolver" }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "aboutAppDescription": "Шукайте музичні метадані, керуйте розширеннями та впорядковуйте свою бібліотеку.", "@aboutAppDescription": { "description": "App description in header card" }, @@ -527,7 +639,7 @@ "@artistAlbums": { "description": "Section header for artist albums" }, - "artistSingles": "Сингли та міні-альбоми", + "artistSingles": "Сингли та мініальбом", "@artistSingles": { "description": "Section header for singles/EPs" }, @@ -539,7 +651,7 @@ "@artistPopular": { "description": "Section header for popular/top tracks" }, - "artistMonthlyListeners": "{count} слухачів щомісяця", + "artistMonthlyListeners": "{count} Слухачів щомісяця", "@artistMonthlyListeners": { "description": "Monthly listener count display", "placeholders": { @@ -577,7 +689,7 @@ "@setupStorageAccessRequired": { "description": "Title when storage access needed" }, - "setupStorageAccessMessageAndroid11": "Для збереження файлів у вибрану папку завантажень для Android 11+ потрібен дозвіл «Доступ до всіх файлів».", + "setupStorageAccessMessageAndroid11": "Для збереження файлів у вибрану теку завантажень для Android 11+ потрібен дозвіл «Доступ до всіх файлів».", "@setupStorageAccessMessageAndroid11": { "description": "Android 11+ specific explanation" }, @@ -608,11 +720,11 @@ } } }, - "setupUseDefaultFolder": "Використати папку за замовчуванням?", + "setupUseDefaultFolder": "Використати теку за замовчуванням?", "@setupUseDefaultFolder": { "description": "Dialog title for default folder" }, - "setupNoFolderSelected": "Папку не вибрано. Бажаєте використовувати папку «Музика» за замовчуванням?", + "setupNoFolderSelected": "Теку не вибрано. Бажаєте використовувати теку «Музика» за замовчуванням?", "@setupNoFolderSelected": { "description": "Prompt when no folder selected" }, @@ -624,11 +736,11 @@ "@setupDownloadLocationTitle": { "description": "Download location dialog title" }, - "setupDownloadLocationIosMessage": "На iOS завантаження зберігаються в папці «Документи» програми. Ви можете отримати до них доступ через програму «Файли».", + "setupDownloadLocationIosMessage": "На iOS завантаження зберігаються в теці «Документи» програми. Ви можете отримати до них доступ через програму «Файли».", "@setupDownloadLocationIosMessage": { "description": "iOS-specific folder info" }, - "setupAppDocumentsFolder": "Папка з документами програми", + "setupAppDocumentsFolder": "Тека з документами програми", "@setupAppDocumentsFolder": { "description": "iOS documents folder option" }, @@ -640,19 +752,19 @@ "@setupChooseFromFiles": { "description": "iOS file picker option" }, - "setupChooseFromFilesSubtitle": "Виберіть iCloud або інше місцезнаходження", + "setupChooseFromFilesSubtitle": "Виберіть iCloud або інше місцеперебування", "@setupChooseFromFilesSubtitle": { "description": "Subtitle for file picker" }, - "setupIosEmptyFolderWarning": "Обмеження iOS: Не можна вибрати порожні папки. Виберіть папку, яка містить принаймні один файл.", + "setupIosEmptyFolderWarning": "iOS обмеження: Не можна вибрати порожні теки. Виберіть теку, яка містить принаймні один файл.", "@setupIosEmptyFolderWarning": { "description": "iOS folder selection warning" }, - "setupIcloudNotSupported": "iCloud Drive не підтримується. Будь ласка, скористайтеся папкою «Документи» програми.", + "setupIcloudNotSupported": "iCloud Drive не підтримується. Будь ласка, скористайтеся текою «Документи» програми.", "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", + "setupDownloadInFlac": "Завантажуйте музику у якості Lossless та Hi-Res", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -676,15 +788,15 @@ "@setupNotificationEnable": { "description": "Button to enable notifications" }, - "setupFolderChoose": "Виберати папку для завантаження", + "setupFolderChoose": "Вибрати теку для завантаження", "@setupFolderChoose": { "description": "Button to choose folder" }, - "setupFolderDescription": "Виберіть папку, де буде збережено завантажену музику.", + "setupFolderDescription": "Виберіть теку, де буде збережено завантажену музику.", "@setupFolderDescription": { "description": "Explanation for folder selection" }, - "setupSelectFolder": "Вибрати папку", + "setupSelectFolder": "Вибрати теку", "@setupSelectFolder": { "description": "Button to select folder" }, @@ -712,59 +824,27 @@ "@setupAllowAccessToManageFiles": { "description": "Instruction for file access permission" }, - "setupLanguageTitle": "Choose Language", + "setupLanguageTitle": "Виберіть мову", "@setupLanguageTitle": { "description": "Title for the language selection step in setup" }, - "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "setupLanguageDescription": "Виберіть бажану мову для програми. Ви зможете змінити її пізніше в налаштуваннях.", "@setupLanguageDescription": { "description": "Description for the language selection step in setup" }, - "setupLanguageSystemDefault": "System Default", + "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": "Play preview", + "previewPlay": "Відтворити попередній", "@previewPlay": { "description": "Tooltip for the button that plays a short track preview snippet" }, - "previewStop": "Stop preview", + "previewStop": "Зупинити попередній", "@previewStop": { "description": "Tooltip for the button that stops the playing track preview snippet" }, - "previewUnavailable": "Preview unavailable", + "previewUnavailable": "Попередній перегляд недоступний", "@previewUnavailable": { "description": "Snackbar shown when a track preview snippet cannot be played" }, @@ -838,8 +918,8 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", - "csvImportTracks": "{count} треків з CSV", + "dialogImportPlaylistMessage": "У файлі списку відтворення знайдено {count} треків. Додати їх до черги завантаження?", + "csvImportTracks": "{count} Треків з CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", "placeholders": { @@ -848,11 +928,11 @@ } } }, - "collectionExportM3u": "Export as M3U8", + "collectionExportM3u": "Експортувати як M3U8", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, - "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "collectionExportM3uDone": "Експортовано {exported} із {total} треків", "@collectionExportM3uDone": { "description": "Snackbar after M3U8 export; tracks without a local file are not exported", "placeholders": { @@ -864,47 +944,47 @@ } } }, - "collectionExportM3uNone": "No downloaded files to export", + "collectionExportM3uNone": "Немає завантажених файлів для експорту", "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, - "collectionExportM3uFailed": "Export failed", + "collectionExportM3uFailed": "Експорт не вдався", "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, - "trackOpenOn": "Open on...", + "trackOpenOn": "Відкрити на...", "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, - "trackOpenOnNoLinks": "No platform links found for this track.", + "trackOpenOnNoLinks": "Для цього треку не знайдено посилань на платформи.", "@trackOpenOnNoLinks": { "description": "Shown in the Open on sheet when song.link returns no links" }, - "libraryReviewDuplicates": "Review duplicates", + "libraryReviewDuplicates": "Переглянути дублікати", "@libraryReviewDuplicates": { "description": "Library settings row opening the duplicate review sheet" }, - "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "libraryReviewDuplicatesSubtitle": "Знайти треки, збережені більше одного разу", "@libraryReviewDuplicatesSubtitle": { "description": "Subtitle for the duplicate review settings row" }, - "duplicatesTitle": "Duplicates", + "duplicatesTitle": "Дублікати", "@duplicatesTitle": { "description": "Title of the duplicate review sheet" }, - "duplicatesEmpty": "No duplicate tracks found.", + "duplicatesEmpty": "Не знайдено повторюваних треків.", "@duplicatesEmpty": { "description": "Shown when the duplicate review sheet finds nothing" }, - "duplicatesKeepBest": "Keep best", + "duplicatesKeepBest": "Залишити краще", "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, - "duplicatesKeepBestAll": "Keep best for all", + "duplicatesKeepBestAll": "Зробити найкращим для всіх", "@duplicatesKeepBestAll": { "description": "Button that keeps the highest-quality copy in every duplicate group and deletes the rest" }, - "duplicatesKeepBestAllMessage": "Keep the best copy of {groupCount} {groupCount, plural, =1{track} other{tracks}} and delete {count} lower-quality {count, plural, =1{copy} other{copies}}?\n\nThe deleted files will be removed from storage.", + "duplicatesKeepBestAllMessage": "Зберегти найкращу копію {groupCount} {groupCount, plural, =1{треку} other{треків}}і видалити {count} гіршої якості {count, plural, =1{копію} other{копій}}?\n\nВидалені файли буде усунуто зі сховища.", "@duplicatesKeepBestAllMessage": { "description": "Confirmation message for keeping the best copy across every duplicate group", "placeholders": { @@ -916,7 +996,7 @@ } } }, - "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "duplicatesKeepBestMessage": "Видалити копії {count} низької якості \"{trackName}\"?", "@duplicatesKeepBestMessage": { "description": "Confirmation message for the keep-best action", "placeholders": { @@ -928,7 +1008,7 @@ } } }, - "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "duplicatesDeleteCopyMessage": "Видалити цю копію \"{trackName}\"?", "@duplicatesDeleteCopyMessage": { "description": "Confirmation message for deleting one duplicate copy", "placeholders": { @@ -1021,7 +1101,7 @@ "@snackbarFileNotFound": { "description": "Snackbar - file doesn't exist" }, - "snackbarSelectExtFile": "Будь ласка, виберіть файл .spotiflac-ext", + "snackbarSelectExtFile": "Будь ласка, виберіть файл.spotiflac-ext", "@snackbarSelectExtFile": { "description": "Snackbar - wrong file type selected" }, @@ -1042,7 +1122,7 @@ } } }, - "snackbarExtensionUpdated": "{extensionName} оновлено.", + "snackbarExtensionUpdated": "{extensionName} Оновлено.", "@snackbarExtensionUpdated": { "description": "Snackbar - extension updated successfully", "placeholders": { @@ -1071,7 +1151,7 @@ "@errorNoTracksFound": { "description": "Error - search returned no results" }, - "searchEmptyResultSubtitle": "Try another keyword", + "searchEmptyResultSubtitle": "Спробуйте інше ключове слово", "@searchEmptyResultSubtitle": { "description": "Subtitle shown under the empty search result state on the home screen" }, @@ -1173,19 +1253,19 @@ "@searchSortDefault": { "description": "Sort option - default API order" }, - "searchSortTitleAZ": "Назва (А-Я)", + "searchSortTitleAZ": "Назва (A-Z)", "@searchSortTitleAZ": { "description": "Sort option - title ascending" }, - "searchSortTitleZA": "Назва (Я-А)", + "searchSortTitleZA": "Назва (Z-A)", "@searchSortTitleZA": { "description": "Sort option - title descending" }, - "searchSortArtistAZ": "Виконавець (А-Я)", + "searchSortArtistAZ": "Виконавець (A-Z)", "@searchSortArtistAZ": { "description": "Sort option - artist ascending" }, - "searchSortArtistZA": "Виконавець (Я-А)", + "searchSortArtistZA": "Виконавець (Z-A)", "@searchSortArtistZA": { "description": "Sort option - artist descending" }, @@ -1229,7 +1309,7 @@ "@folderOrganizationByPlaylist": { "description": "Folder option - playlist folders" }, - "folderOrganizationByPlaylistSubtitle": "Окрема папка для кожного списку відтворення", + "folderOrganizationByPlaylistSubtitle": "Окрема тека для кожного списку відтворення", "@folderOrganizationByPlaylistSubtitle": { "description": "Subtitle for playlist folder option" }, @@ -1245,23 +1325,23 @@ "@folderOrganizationByArtistAlbum": { "description": "Folder option - nested folders" }, - "folderOrganizationDescription": "Упорядкувати завантажені файли в папки", + "folderOrganizationDescription": "Упорядкувати завантажені файли в теці", "@folderOrganizationDescription": { "description": "Folder organization sheet description" }, - "folderOrganizationNoneSubtitle": "Усі файли в папці завантажень", + "folderOrganizationNoneSubtitle": "Усі файли в теці завантажень", "@folderOrganizationNoneSubtitle": { "description": "Subtitle for no organization option" }, - "folderOrganizationByArtistSubtitle": "Окрема папка для кожного виконавця", + "folderOrganizationByArtistSubtitle": "Окрема тека для кожного виконавця", "@folderOrganizationByArtistSubtitle": { "description": "Subtitle for artist folder option" }, - "folderOrganizationByAlbumSubtitle": "Окрема папка для кожного альбому", + "folderOrganizationByAlbumSubtitle": "Окрема тека для кожного альбому", "@folderOrganizationByAlbumSubtitle": { "description": "Subtitle for album folder option" }, - "folderOrganizationByArtistAlbumSubtitle": "Вкладені папки для виконавця та альбому", + "folderOrganizationByArtistAlbumSubtitle": "Вкладені теки для виконавця та альбому", "@folderOrganizationByArtistAlbumSubtitle": { "description": "Subtitle for nested folder option" }, @@ -1289,11 +1369,11 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, - "updateRequiredTitle": "Update required", + "updateRequiredTitle": "Потрібне оновлення", "@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": "Ця версія {count} релізів і більше не підтримується. Оновіть, щоб користуватися додатком.", "@updateRequiredNotice": { "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", "placeholders": { @@ -1338,7 +1418,7 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", + "providerPriorityFallbackExtensionsDescription": "Виберіть, які встановлені розширення для завантаження можна використовувати як резервні.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, @@ -1406,7 +1486,7 @@ "@logNoLogsYet": { "description": "Empty state title" }, - "logNoLogsYetSubtitle": "Журнали відображатимуться тут під час використання програми", + "logNoLogsYetSubtitle": "Тут з’являтимуться записи журналу в міру використання програми", "@logNoLogsYetSubtitle": { "description": "Empty state subtitle" }, @@ -1476,11 +1556,13 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Не вимикати екран під час перегляду тексту пісні", + "lyricsKeepScreenOnSubtitle": "Запобігати вимкненню екрана, коли відкрито текст пісні, зокрема й під час паузи у відтворенні.", "lyricsMode": "Режим тексту пісні", "@lyricsMode": { "description": "Setting - how to save lyrics" }, - "lyricsModeDescription": "Виберіть, як тексти пісень зберігатимуться разом із завантаженнями пісень.", + "lyricsModeDescription": "Виберіть як тексти пісень зберігатимуться разом із завантаженнями пісень", "@lyricsModeDescription": { "description": "Lyrics mode picker description" }, @@ -1532,7 +1614,7 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Service, quality, fallback", + "settingsDownloadSubtitle": "Обслуговування, якість, резервний варіант", "@settingsDownloadSubtitle": { "description": "Download settings description" }, @@ -1638,23 +1720,23 @@ "@trackAudioQuality": { "description": "Metadata label - audio quality" }, - "trackReplayGainTrackGain": "ReplayGain Track Gain", + "trackReplayGainTrackGain": "ReplayGain: посилення для треку", "@trackReplayGainTrackGain": { "description": "Metadata label - ReplayGain track gain" }, - "trackReplayGainTrackPeak": "ReplayGain Track Peak", + "trackReplayGainTrackPeak": "Піковий рівень треку ReplayGain", "@trackReplayGainTrackPeak": { "description": "Metadata label - ReplayGain track peak" }, - "trackReplayGainAlbumGain": "ReplayGain Album Gain", + "trackReplayGainAlbumGain": "ReplayGain: посилення для альбому", "@trackReplayGainAlbumGain": { "description": "Metadata label - ReplayGain album gain" }, - "trackReplayGainAlbumPeak": "ReplayGain Album Peak", + "trackReplayGainAlbumPeak": "Піковий рівень альбому ReplayGain", "@trackReplayGainAlbumPeak": { "description": "Metadata label - ReplayGain album peak" }, - "libraryQualityLabelFileFormat": "File format", + "libraryQualityLabelFileFormat": "Формат файлу", "@libraryQualityLabelFileFormat": { "description": "Library audio quality label mode that shows the detected file format" }, @@ -1666,7 +1748,7 @@ "@trackGenre": { "description": "Metadata label - music genre" }, - "trackLabel": "Лейбл", + "trackLabel": "Обкладинка", "@trackLabel": { "description": "Metadata label - record label" }, @@ -1682,7 +1764,7 @@ "@trackCopyLyrics": { "description": "Action - copy lyrics to clipboard" }, - "trackLyricsSource": "Source: {source}", + "trackLyricsSource": "Джерело {source}", "@trackLyricsSource": { "description": "Label showing the lyrics source/provider", "placeholders": { @@ -1743,7 +1825,7 @@ "@dateYesterday": { "description": "Relative date - yesterday" }, - "dateDaysAgo": "{count} днів тому", + "dateDaysAgo": "{count} Днів тому", "@dateDaysAgo": { "description": "Relative date - days ago", "placeholders": { @@ -1752,7 +1834,7 @@ } } }, - "dateWeeksAgo": "{count} тижнів тому", + "dateWeeksAgo": "{count} Тижнів тому", "@dateWeeksAgo": { "description": "Relative date - weeks ago", "placeholders": { @@ -1761,7 +1843,7 @@ } } }, - "dateMonthsAgo": "{count} місяців тому", + "dateMonthsAgo": "{count} Місяців тому", "@dateMonthsAgo": { "description": "Relative date - months ago", "placeholders": { @@ -1862,7 +1944,7 @@ "@extensionMetadataProvider": { "description": "Capability - provides metadata" }, - "extensionDownloadProvider": "Постачальник завантажень", + "extensionDownloadProvider": "Провайдер завантажень", "@extensionDownloadProvider": { "description": "Capability - provides downloads" }, @@ -1878,7 +1960,7 @@ "@extensionQualityOptions": { "description": "Capability - quality selection" }, - "extensionPostProcessingHooks": "Хуки пост-обробки", + "extensionPostProcessingHooks": "Хуки постобробки", "@extensionPostProcessingHooks": { "description": "Capability - post-processing" }, @@ -1906,11 +1988,11 @@ "@extensionCustomTrackMatching": { "description": "Capability - custom track matching algorithm" }, - "extensionPostProcessing": "Післяобробка", + "extensionPostProcessing": "Постобробка", "@extensionPostProcessing": { "description": "Capability - post-download processing" }, - "extensionHooksAvailable": "{count} доступних хуків", + "extensionHooksAvailable": "{count} Доступних хуків()", "@extensionHooksAvailable": { "description": "Post-processing hooks count", "placeholders": { @@ -1919,7 +2001,7 @@ } } }, - "extensionPatternsCount": "{count} шаблон(ів)", + "extensionPatternsCount": "{count} Шаблон()", "@extensionPatternsCount": { "description": "URL patterns count", "placeholders": { @@ -1945,11 +2027,11 @@ "@extensionsInstalledSection": { "description": "Section header - installed extensions" }, - "extensionsNoExtensions": "Розширень не встановлено", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" + "optionsArtistTagModeJoined": "Одне об'єднане значення", + "@optionsArtistTagModeJoined": { + "description": "Artist tag mode option that joins multiple artists into one value" }, - "extensionsNoExtensionsSubtitle": "Встановіть файли .spotiflac-ext, щоб додати нових провайдерів", + "extensionsNoExtensionsSubtitle": "Встановіть файли.spotiflac-ext, щоб додати нових провайдерів", "@extensionsNoExtensionsSubtitle": { "description": "Empty state subtitle" }, @@ -1965,7 +2047,7 @@ "@extensionsInstalledSuccess": { "description": "Success message after install" }, - "extensionsInstalledCount": "{count} extensions installed successfully", + "extensionsInstalledCount": "{count} Розширення успішно встановлено", "@extensionsInstalledCount": { "description": "Success message after installing multiple extensions", "placeholders": { @@ -1975,7 +2057,7 @@ } } }, - "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "extensionsInstallPartialSuccess": "Встановлено {installed} із {attempted} розширень", "@extensionsInstallPartialSuccess": { "description": "Message when installing multiple extensions partially succeeds", "placeholders": { @@ -2069,43 +2151,43 @@ "@downloadLossy320": { "description": "Quality option label for lossy 320kbps" }, - "downloadLossyFormat": "Формат із втратами", + "downloadLossyFormat": "Формат Lossy", "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, - "downloadAutoConvert": "Auto-convert after download", + "downloadAutoConvert": "Автоматично конвертувати після завантаження", "@downloadAutoConvert": { "description": "Toggle for automatic post-download audio conversion" }, - "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "downloadAutoConvertSubtitle": "Конвертуйте завершені завантаження у компактніший формат із втратою якості. Оригінал замінюється лише після успішного завершення конвертації.", "@downloadAutoConvertSubtitle": { "description": "Explanation of safe automatic post-download conversion" }, - "downloadAutoConvertFormat": "Output format", + "downloadAutoConvertFormat": "Вихідний формат", "@downloadAutoConvertFormat": { "description": "Automatic conversion output format setting" }, - "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "downloadAutoConvertFormatSubtitle": "Виберіть формат з втратами, що використовуватиметься для щойно завершених завантажень.", "@downloadAutoConvertFormatSubtitle": { "description": "Automatic conversion format picker explanation" }, - "downloadAutoConvertBitrate": "Output quality", + "downloadAutoConvertBitrate": "Якість передачі", "@downloadAutoConvertBitrate": { "description": "Automatic conversion bitrate setting" }, - "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "downloadAutoConvertBitrateSubtitle": "Вища якість зберігає більше деталей, але створює більші файли.", "@downloadAutoConvertBitrateSubtitle": { "description": "Automatic conversion bitrate picker explanation" }, - "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "downloadAutoConvertMp3Subtitle": "Найкраща сумісність із програвачами та пристроями", "@downloadAutoConvertMp3Subtitle": { "description": "MP3 automatic conversion option description" }, - "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "downloadAutoConvertM4aSubtitle": "Ефективний звук у форматі AAC у контейнері M4A", "@downloadAutoConvertM4aSubtitle": { "description": "M4A AAC automatic conversion option description" }, - "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "downloadAutoConvertOpusSubtitle": "Найвища ефективність для сучасних програвачів", "@downloadAutoConvertOpusSubtitle": { "description": "Opus automatic conversion option description" }, @@ -2113,7 +2195,7 @@ "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" }, - "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", + "downloadLossy320FormatDesc": "Виберіть формат для завантаження з втратою якості 320kbps. За потреби вихідний потік буде конвертовано у вибраний вами формат.", "@downloadLossy320FormatDesc": { "description": "Description in the lossy format picker" }, @@ -2121,7 +2203,7 @@ "@downloadLossyMp3": { "description": "Lossy format option - MP3 320kbps" }, - "downloadLossyMp3Subtitle": "Найкраща сумісність, ~10 МБ на доріжку", + "downloadLossyMp3Subtitle": "Найкраща сумісність, ~10 Mb на трек", "@downloadLossyMp3Subtitle": { "description": "Subtitle for MP3 320kbps lossy option" }, @@ -2129,7 +2211,7 @@ "@downloadLossyAac": { "description": "Lossy format option - AAC in M4A container at 320kbps" }, - "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "downloadLossyAacSubtitle": "Найкраща сумісність із мобільними пристроями, контейнер M4A", "@downloadLossyAacSubtitle": { "description": "Subtitle for AAC/M4A 320kbps lossy option" }, @@ -2137,7 +2219,7 @@ "@downloadLossyOpus256": { "description": "Lossy format option - Opus 256kbps" }, - "downloadLossyOpus256Subtitle": "Opus найкращої якості, ~8 МБ на трек", + "downloadLossyOpus256Subtitle": "Opus найкращої якості, ~8 Mb на трек", "@downloadLossyOpus256Subtitle": { "description": "Subtitle for Opus 256kbps lossy option" }, @@ -2145,7 +2227,7 @@ "@downloadLossyOpus128": { "description": "Lossy format option - Opus 128kbps" }, - "downloadLossyOpus128Subtitle": "Найменший розмір, ~4 МБ на доріжку", + "downloadLossyOpus128Subtitle": "Найменший розмір, ~4 Mb на доріжку", "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, @@ -2157,31 +2239,31 @@ "@downloadDirectory": { "description": "Setting - download folder" }, - "downloadSeparateSinglesFolder": "Окрема папка для синглів", + "downloadSeparateSinglesFolder": "Окрема тека для синглів", "@downloadSeparateSinglesFolder": { "description": "Setting - separate folder for singles" }, - "downloadAlbumFolderStructure": "Структура папок альбому", + "downloadAlbumFolderStructure": "Структура альбому в теці", "@downloadAlbumFolderStructure": { "description": "Setting - album folder organization" }, - "albumFolderStructureDescription": "Choose how album folders are structured", + "albumFolderStructureDescription": "Вибрати як структуруються теки альбому", "@albumFolderStructureDescription": { "description": "Album folder structure picker description" }, - "downloadUseAlbumArtistForFolders": "Використовувати виконавця альбому для папок", + "downloadUseAlbumArtistForFolders": "Використовувати виконавця альбому для тек", "@downloadUseAlbumArtistForFolders": { "description": "Setting - choose whether artist folders use Album Artist or Track Artist" }, - "downloadUsePrimaryArtistOnly": "Тільки основний виконавець для папок", + "downloadUsePrimaryArtistOnly": "Тільки основний виконавець для тек", "@downloadUsePrimaryArtistOnly": { "description": "Setting - strip featured artists from folder name" }, - "downloadUsePrimaryArtistOnlyEnabled": "Вибраних виконавців видалити з назви папки (наприклад, Джастін Бібер, Quavo → Джастін Бібер)", + "downloadUsePrimaryArtistOnlyEnabled": "Вибраних виконавців видалити з назви тек (наприклад, Justin Bieber, Quavo → Justin Bieber)", "@downloadUsePrimaryArtistOnlyEnabled": { "description": "Subtitle when primary artist only is enabled" }, - "downloadUsePrimaryArtistOnlyDisabled": "Повний рядок виконавця, що використовується для назви папки", + "downloadUsePrimaryArtistOnlyDisabled": "Повний рядок виконавця, що використовується для назви теки", "@downloadUsePrimaryArtistOnlyDisabled": { "description": "Subtitle when primary artist only is disabled" }, @@ -2201,19 +2283,19 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, - "appearanceHeroAnimations": "Hero animations", + "appearanceHeroAnimations": "Анімації головного елемента", "@appearanceHeroAnimations": { "description": "Toggle for shared-element (Hero) transitions" }, - "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "appearanceHeroAnimationsSubtitle": "Анімація переходу між екранами, наприклад, під час відкриття плеєра", "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, - "appearanceForceBlur": "Always use blur effects", + "appearanceForceBlur": "Завжди використовуйте ефекти розмиття", "@appearanceForceBlur": { "description": "Toggle that forces backdrop blur on even when the device profile disabled it" }, - "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "appearanceForceBlurSubtitle": "Увімкнути розмиття панелі навігації навіть на пристроях за замовчуванням. Це може вплинути на продуктивність.", "@appearanceForceBlurSubtitle": { "description": "Subtitle for the force-blur toggle" }, @@ -2249,19 +2331,19 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, - "settingsConcurrentDownloads": "Concurrent downloads", + "settingsConcurrentDownloads": "Кількість одночасних завантажень", "@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": "Завантаження кількох треків одночасно відбувається швидше, але деякі провайдери можуть обмежувати швидкість паралельних запитів.", "@settingsConcurrentDownloadsSubtitle": { "description": "Subtitle explaining the concurrent downloads picker" }, - "concurrentDownloadsOne": "1 track at a time", + "concurrentDownloadsOne": "1 трек за один раз", "@concurrentDownloadsOne": { "description": "Concurrent downloads option - sequential" }, - "concurrentDownloadsCount": "Up to {count} tracks at once", + "concurrentDownloadsCount": "До {count} треків одночасно", "@concurrentDownloadsCount": { "description": "Concurrent downloads option - parallel", "placeholders": { @@ -2274,7 +2356,7 @@ "@albumFolderArtistAlbum": { "description": "Album folder option" }, - "albumFolderArtistAlbumSubtitle": "Альбоми/Ім'я артиста/Назва альбому/", + "albumFolderArtistAlbumSubtitle": "Альбоми/Ім'я артиста/Назва Альбому/", "@albumFolderArtistAlbumSubtitle": { "description": "Folder structure example" }, @@ -2306,7 +2388,7 @@ "@albumFolderArtistAlbumSingles": { "description": "Album folder option with singles inside artist" }, - "albumFolderArtistAlbumSinglesSubtitle": "Виконавець/Альбом/ та Виконавець/Сингли/", + "albumFolderArtistAlbumSinglesSubtitle": "Виконавець/Альбом/ Та Виконавець/Сингли/", "@albumFolderArtistAlbumSinglesSubtitle": { "description": "Folder structure example" }, @@ -2314,7 +2396,7 @@ "@albumFolderArtistAlbumFlat": { "description": "Album folder option with singles directly in artist folder" }, - "albumFolderArtistAlbumFlatSubtitle": "Виконавець/Альбом/ та Виконавець/пісня.flac", + "albumFolderArtistAlbumFlatSubtitle": "Виконавець/Альбом/ Та Виконавець/пісня.flac", "@albumFolderArtistAlbumFlatSubtitle": { "description": "Folder structure example for flat singles" }, @@ -2387,7 +2469,7 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, - "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "recentClearAllMessage": "Очистити всю нещодавню активність? Історію завантажень і музичні файли не буде видалено.", "@recentClearAllMessage": { "description": "Confirmation message before clearing all recent activity" }, @@ -2413,7 +2495,7 @@ "@discographyDownloadAll": { "description": "Option - download entire discography" }, - "discographyDownloadAllSubtitle": "{count} треків з {albumCount} релізів", + "discographyDownloadAllSubtitle": "{count} Треків з {albumCount} релізів", "@discographyDownloadAllSubtitle": { "description": "Subtitle showing total tracks and albums", "placeholders": { @@ -2429,7 +2511,7 @@ "@discographyAlbumsOnly": { "description": "Option - download only albums" }, - "discographyAlbumsOnlySubtitle": "{count} треків з {albumCount} альбомів", + "discographyAlbumsOnlySubtitle": "{count} Треків з {albumCount} альбомів", "@discographyAlbumsOnlySubtitle": { "description": "Subtitle showing album tracks count", "placeholders": { @@ -2441,11 +2523,11 @@ } } }, - "discographySinglesOnly": "Тільки сингли та міні-альбоми", + "discographySinglesOnly": "Тільки сингли та мініальбоми", "@discographySinglesOnly": { "description": "Option - download only singles" }, - "discographySinglesOnlySubtitle": "{count} треків з {albumCount} синглів", + "discographySinglesOnlySubtitle": "{count} Треків з {albumCount} синглів", "@discographySinglesOnlySubtitle": { "description": "Subtitle showing singles tracks count", "placeholders": { @@ -2481,7 +2563,7 @@ } } }, - "discographySelectedCount": "{count} вибрано", + "discographySelectedCount": "{count} Вибрано", "@discographySelectedCount": { "description": "Selection count badge", "placeholders": { @@ -2503,7 +2585,7 @@ } } }, - "discographySkippedDownloaded": "{added} додано, {skipped} вже завантажено", + "discographySkippedDownloaded": "{added} Додано, {skipped} вже завантажено", "@discographySkippedDownloaded": { "description": "Snackbar - with skipped tracks count", "placeholders": { @@ -2531,15 +2613,15 @@ "@allFilesAccess": { "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" }, - "allFilesAccessEnabledSubtitle": "Можна записувати в будь-яку папку", + "allFilesAccessEnabledSubtitle": "Можна записувати в будь-яку теку", "@allFilesAccessEnabledSubtitle": { "description": "Subtitle when all files access is enabled" }, - "allFilesAccessDisabledSubtitle": "Обмежено лише медіа-папками", + "allFilesAccessDisabledSubtitle": "Обмежено лише теками з медіафайлами", "@allFilesAccessDisabledSubtitle": { "description": "Subtitle when all files access is disabled" }, - "allFilesAccessDescription": "Увімкніть цю опцію, якщо під час збереження у власні папки виникають помилки запису. Android 13+ за замовчуванням обмежує доступ до певних каталогів.", + "allFilesAccessDescription": "Увімкніть цю опцію, якщо під час збереження у власній теці виникають помилки запису. Android 13+ за замовчуванням обмежує доступ до певних каталогів.", "@allFilesAccessDescription": { "description": "Description explaining when to enable all files access" }, @@ -2579,39 +2661,39 @@ "@libraryEnableLocalLibrary": { "description": "Toggle to enable library scanning" }, - "libraryEnableLocalLibrarySubtitle": "Скануати та відстежити свою існуючу музику", + "libraryEnableLocalLibrarySubtitle": "Скануйте та відстежуйте наявну музику", "@libraryEnableLocalLibrarySubtitle": { "description": "Subtitle for enable toggle" }, - "libraryFolder": "Папка бібліотеки", + "libraryFolder": "Тека бібліотеки", "@libraryFolder": { "description": "Folder selection setting" }, - "libraryFolderHint": "Натисніть, щоб вибрати папку", + "libraryFolderHint": "Натисніть, щоб вибрати теку", "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, - "libraryAddFolder": "Add library folder", + "libraryAddFolder": "Додати теку бібліотеки", "@libraryAddFolder": { "description": "Action to add another local library source" }, - "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "libraryAddFolderSubtitle": "Внутрішня пам’ять, SD-карта, SSD або інший зовнішній накопичувач", "@libraryAddFolderSubtitle": { "description": "Supported storage locations for local library sources" }, - "librarySourceOnline": "Online", + "librarySourceOnline": "Онлайн", "@librarySourceOnline": { "description": "Library source is connected and accessible" }, - "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "librarySourceOffline": "Офлайн. Знову приєднайте сховище, щоб відновити ці треки", "@librarySourceOffline": { "description": "Library source is temporarily disconnected" }, - "librarySourceDisabled": "Disabled", + "librarySourceDisabled": "Вимкнути", "@librarySourceDisabled": { "description": "Library source has been disabled by the user" }, - "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "librarySourceScanCount": "{scanned} Of {total} файлів проскановано ({progress}%)", "@librarySourceScanCount": { "description": "Live progress for one library folder scan", "placeholders": { @@ -2626,15 +2708,15 @@ } } }, - "libraryExternalStorage": "External storage", + "libraryExternalStorage": "Зовнішнє сховище", "@libraryExternalStorage": { "description": "Label for a removable or external library source" }, - "libraryRemoveFolder": "Remove library folder", + "libraryRemoveFolder": "Видалити теку бібліотеки", "@libraryRemoveFolder": { "description": "Action to remove one indexed library source" }, - "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "libraryRemoveFolderMessage": "Видалити цю теку та її індексовані треки зі SpotiFLAC Mobile? Аудіофайли на сховищі не будуть видалені.", "@libraryRemoveFolderMessage": { "description": "Confirmation shown before removing a library source" }, @@ -2642,7 +2724,7 @@ "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" }, - "libraryShowDuplicateIndicatorSubtitle": "Показувати під час пошуку існуючих треків", + "libraryShowDuplicateIndicatorSubtitle": "Показувати під час пошуку наявних треків", "@libraryShowDuplicateIndicatorSubtitle": { "description": "Subtitle for duplicate indicator toggle" }, @@ -2682,7 +2764,7 @@ "@libraryScanSubtitle": { "description": "Subtitle for scan button" }, - "libraryScanSelectFolderFirst": "Спочатку виберіть папку", + "libraryScanSelectFolderFirst": "Спочатку виберіть теку", "@libraryScanSelectFolderFirst": { "description": "Message when trying to scan without folder" }, @@ -2714,7 +2796,7 @@ "@libraryAbout": { "description": "Section header for about info" }, - "libraryAboutDescription": "Сканує вашу існуючу музичну колекцію для виявлення дублікатів під час завантаження. Підтримує формати FLAC, M4A, MP3, Opus та OGG. Метадані зчитуються з тегів файлів, коли вони доступні.", + "libraryAboutDescription": "Сканує наявну музичну колекцію для виявлення дублікатів під час завантаження. Підтримує формати FLAC, ALAC, M4A, MP3, Opus, OGG, WAV, AIFF та APE. Метадані зчитуються з тегів файлів, якщо вони доступні.", "@libraryAboutDescription": { "description": "Description of local library feature" }, @@ -2727,7 +2809,7 @@ } } }, - "libraryFilesUnit": "{count, plural, =1{file} other{файлів}}", + "libraryFilesUnit": "{count, plural, =1{файл} other{файлів}}", "@libraryFilesUnit": { "description": "Unit label for files count during library scanning", "placeholders": { @@ -2757,6 +2839,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Сканування призупинено", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% від {total} файлів", "@libraryScanProgress": { "description": "Scan progress display", @@ -2794,7 +2880,7 @@ "@libraryStorageAccessMessage": { "description": "Dialog message for storage permission" }, - "libraryFolderNotExist": "Вибрана папка не існує", + "libraryFolderNotExist": "Вибрана тека не існує", "@libraryFolderNotExist": { "description": "Error when folder doesn't exist" }, @@ -2862,7 +2948,7 @@ "@libraryFilterMetadataComplete": { "description": "Filter option - items with complete metadata" }, - "libraryFilterMetadataMissingAny": "будь-які метадані", + "libraryFilterMetadataMissingAny": "Відсутні будь-які метадані", "@libraryFilterMetadataMissingAny": { "description": "Filter option - items missing any tracked metadata field" }, @@ -2890,19 +2976,19 @@ "@libraryFilterSortOldest": { "description": "Sort option - oldest first" }, - "libraryFilterSortAlbumAsc": "Альбом (А-Я)", + "libraryFilterSortAlbumAsc": "Альбом (A-Z)", "@libraryFilterSortAlbumAsc": { "description": "Sort option - album ascending" }, - "libraryFilterSortAlbumDesc": "Альбом (Я-А)", + "libraryFilterSortAlbumDesc": "Альбом (Z-A)", "@libraryFilterSortAlbumDesc": { "description": "Sort option - album descending" }, - "libraryFilterSortGenreAsc": "Жанр (А-Я)", + "libraryFilterSortGenreAsc": "Жанр (A-Z)", "@libraryFilterSortGenreAsc": { "description": "Sort option - genre ascending" }, - "libraryFilterSortGenreDesc": "Жанр (Я-А)", + "libraryFilterSortGenreDesc": "Жанр (Z-A)", "@libraryFilterSortGenreDesc": { "description": "Sort option - genre descending" }, @@ -2910,7 +2996,7 @@ "@timeJustNow": { "description": "Relative time - less than a minute ago" }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} хвилин тому}}", + "timeMinutesAgo": "{count, plural, =1{1 хвилину тому} other{{count} хвилин тому}}", "@timeMinutesAgo": { "description": "Relative time - minutes ago", "placeholders": { @@ -2919,7 +3005,7 @@ } } }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} годин тому}}", + "timeHoursAgo": "{count, plural, =1{1 годину тому} other{{count} годин тому}}", "@timeHoursAgo": { "description": "Relative time - hours ago", "placeholders": { @@ -2928,23 +3014,23 @@ } } }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", + "tutorialWelcomeTitle": "Ласкаво просимо до SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", + "tutorialWelcomeDesc": "Дізнайтеся, як знаходити музику за допомогою розширень, вибирати потрібну якість і керувати завантаженнями у SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", + "tutorialWelcomeTip1": "Пошук за допомогою встановленого розширення або вставлення посилання на підтримувану музику", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", + "tutorialWelcomeTip2": "Оберіть один із варіантів якості аудіо, запропонованих вашим постачальником послуг завантаження", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", + "tutorialWelcomeTip3": "Автоматично вбудовуйте метадані, обкладинки, тексти пісень та інформацію про реліз", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2952,7 +3038,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", + "tutorialSearchDesc": "Виконайте пошук за допомогою вибраного розширення або вставте посилання на музику, що підтримується.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2960,7 +3046,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", + "tutorialDownloadDesc": "Виберіть доступну якість, розпочніть завантаження та стежте за його перебігом у черзі.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2968,19 +3054,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", + "tutorialLibraryDesc": "Завантажену та локально заскановану музику впорядковано у вашій бібліотеці.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", + "tutorialLibraryTip1": "Керуйте активними, очікуваними та завершеними завантаженнями в черзі бібліотеки", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap a track to play it with the built-in player", + "tutorialLibraryTip2": "Торкніться треку, щоб відтворити його за допомогою вбудованого програвача", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", + "tutorialLibraryTip3": "Переглядайте треки, альбоми та списки відтворення у списку або в сітках перегляду", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2988,7 +3074,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", + "tutorialExtensionsDesc": "Розширення додають функції пошуку, завантаження, роботи з метаданими, метаданих і резервних варіантів.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2996,11 +3082,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", + "tutorialExtensionsTip2": "Виберіть провайдерів для пошуку, завантаження, метаданих і резервних варіантів", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", + "tutorialExtensionsTip3": "Підключайте облікові записи за потреби та підтримуйте розширення в актуальному стані", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -3008,15 +3094,15 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", + "tutorialSettingsDesc": "Налаштуйте параметри завантаження, відтворення, роботи з бібліотекою, зовнішнього вигляду та зберігання.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, - "tutorialSettingsTip1": "Змініть місце завантаження та організації папок", + "tutorialSettingsTip1": "Змініть місце завантаження та об'єднання тек", "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", + "tutorialSettingsTip2": "Налаштуйте параметри якості, паралельної обробки, імен файлів та конвертації", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -3024,7 +3110,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", + "tutorialReadyMessage": "Ви готові. Виберіть розширення, а потім виконайте пошук або вставте підтримуване посилання.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3118,19 +3204,19 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, - "libraryPlaybackNormalization": "Volume normalization", + "libraryPlaybackNormalization": "Нормалізація звуку", "@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": "Вирівнюйте гучність між треками, використовуючи теги ReplayGain або R128 за їх наявності", "@libraryPlaybackNormalizationSubtitle": { "description": "Subtitle explaining playback volume normalization" }, - "cacheAudioAnalysis": "Audio analysis cache", + "cacheAudioAnalysis": "Кеш аудіо аналізу", "@cacheAudioAnalysis": { "description": "Cache item title for saved audio analysis results" }, - "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "cacheAudioAnalysisDesc": "Збережено спектрограми та результати аналізу. Повторний аналіз буде виконано під час наступного відкриття.", "@cacheAudioAnalysisDesc": { "description": "Description of what audio analysis cache contains" }, @@ -3158,7 +3244,7 @@ "@cacheNoData": { "description": "Label when cache category has no data" }, - "cacheSizeWithFiles": "{size} у {count} файлах", + "cacheSizeWithFiles": "{size} У {count} файлах", "@cacheSizeWithFiles": { "description": "Cache size and file count", "placeholders": { @@ -3179,7 +3265,7 @@ } } }, - "cacheEntries": "{count} записів", + "cacheEntries": "{count} Записів", "@cacheEntries": { "description": "Track cache entry count", "placeholders": { @@ -3258,7 +3344,7 @@ "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" }, - "trackReEnrich": "Перезбагачувати", + "trackReEnrich": "Поліпшувати", "@trackReEnrich": { "description": "Menu action - re-embed metadata into audio file" }, @@ -3266,7 +3352,7 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichBatchSubtitle": "Choose an online or manual update, then review every change before writing", + "trackReEnrichBatchSubtitle": "Виберіть онлайн оновлення або оновлення вручну, а потім перегляньте всі зміни перед записом", "@trackReEnrichBatchSubtitle": { "description": "Subtitle for batch metadata update choices" }, @@ -3290,7 +3376,7 @@ "@trackReEnrichFieldReleaseInfo": { "description": "Checkbox label for release info in re-enrich" }, - "trackReEnrichFieldExtra": "Жанр, Лейбл, Авторське право", + "trackReEnrichFieldExtra": "Жанр, Обкладинка, Авторське право", "@trackReEnrichFieldExtra": { "description": "Checkbox label for extra metadata in re-enrich" }, @@ -3298,59 +3384,59 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, - "trackReEnrichModeIsrc": "ISRC only", + "trackReEnrichModeIsrc": "Тільки ISRC", "@trackReEnrichModeIsrc": { "description": "Batch metadata mode that only writes ISRC" }, - "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "trackReEnrichModeIsrcSubtitle": "Знайдіть і додайте ідентифікатор запису, не змінюючи інших міток", "@trackReEnrichModeIsrcSubtitle": { "description": "Explanation for the ISRC-only batch metadata mode" }, - "trackReEnrichModeMissing": "Fill missing tags", + "trackReEnrichModeMissing": "Заповнити відсутні теги", "@trackReEnrichModeMissing": { "description": "Batch metadata mode that fills only empty tags" }, - "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "trackReEnrichModeMissingSubtitle": "Зберігати наявні значення та заповнювати тільки поля, які є порожніми", "@trackReEnrichModeMissingSubtitle": { "description": "Explanation for the fill-missing batch metadata mode" }, - "trackReEnrichModeReplace": "Update selected tags", + "trackReEnrichModeReplace": "Оновити вибрані теги", "@trackReEnrichModeReplace": { "description": "Batch metadata mode that replaces selected tag groups" }, - "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "trackReEnrichModeReplaceSubtitle": "Виберіть онлайн-оновлення або оновлення вручну, а потім перегляньте всі зміни перед записом", "@trackReEnrichModeReplaceSubtitle": { "description": "Explanation for the selected-tag batch metadata mode" }, - "trackReEnrichModeManual": "Set common values", + "trackReEnrichModeManual": "Установити загальні значення", "@trackReEnrichModeManual": { "description": "Batch metadata mode that applies shared values to every selected track" }, - "trackReEnrichModeManualSubtitle": "Apply the same values to every selected track", + "trackReEnrichModeManualSubtitle": "Застосувати одне й те ж значення до кожного обраного маршруту", "@trackReEnrichModeManualSubtitle": { "description": "Explanation for the manual shared-value batch metadata mode" }, - "trackReEnrichManualFieldsTitle": "Values to apply", + "trackReEnrichManualFieldsTitle": "Значення для застосування", "@trackReEnrichManualFieldsTitle": { "description": "Heading above manual batch metadata inputs" }, - "trackReEnrichManualHint": "Leave a field empty to keep its current value. Track titles, numbers, and ISRCs stay unchanged.", + "trackReEnrichManualHint": "Залиште поле порожнім, щоб зберегти своє поточне значення. Назва маршруту, цифри та ISRC не змінюються.", "@trackReEnrichManualHint": { "description": "Safety explanation for manual batch metadata inputs" }, - "trackReEnrichFieldsTitle": "Tags to update", + "trackReEnrichFieldsTitle": "Теги для оновлення", "@trackReEnrichFieldsTitle": { "description": "Heading above batch re-enrich field checkboxes" }, - "trackReEnrichReview": "Review changes", + "trackReEnrichReview": "Переглянути зміни", "@trackReEnrichReview": { "description": "Button that searches metadata and opens the batch change review" }, - "trackReEnrichReviewTitle": "Review metadata changes", + "trackReEnrichReviewTitle": "Переглянути зміни метаданих", "@trackReEnrichReviewTitle": { "description": "Title of the batch metadata review sheet" }, - "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "trackReEnrichReviewSubtitle": "{changeCount} Запропоновані зміни в межах {trackCount} треків", "@trackReEnrichReviewSubtitle": { "description": "Summary shown above proposed batch metadata changes", "placeholders": { @@ -3362,15 +3448,15 @@ } } }, - "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "trackReEnrichNoChanges": "Для вибраних треків не виявлено змін у метаданих.", "@trackReEnrichNoChanges": { "description": "Message when batch metadata preview has no proposed changes" }, - "trackReEnrichApplyChanges": "Apply changes", + "trackReEnrichApplyChanges": "Застосувати зміни", "@trackReEnrichApplyChanges": { "description": "Confirmation button in the batch metadata review sheet" }, - "trackReEnrichRefreshOnline": "Refresh from online", + "trackReEnrichRefreshOnline": "Оновити з мережі", "@trackReEnrichRefreshOnline": { "description": "Proposed value when lyrics will be refreshed during re-enrich" }, @@ -3408,15 +3494,15 @@ "@trackReEnrichSearching": { "description": "Snackbar while searching metadata from internet for local items" }, - "trackReEnrichPreparing": "Preparing metadata changes...", + "trackReEnrichPreparing": "Переглянути зміни метаданих...", "@trackReEnrichPreparing": { "description": "Progress message while preparing manual batch metadata changes" }, "trackReEnrichSuccess": "Метадані повторно збагачені успішно", - "trackReEnrichMetadataSaved": "Metadata saved", - "trackReEnrichLyricsUpdated": "Lyrics updated", - "trackReEnrichLyricsPreserved": "No new lyrics found; existing lyrics kept", - "trackReEnrichLyricsDisabled": "Lyrics not updated: lyric downloading is disabled in Settings", + "trackReEnrichMetadataSaved": "Метадані збережені", + "trackReEnrichLyricsUpdated": "Текст оновлено", + "trackReEnrichLyricsPreserved": "Нові тексти пісень не знайдено; наявні тексти пісень зберігаються", + "trackReEnrichLyricsDisabled": "Не оновлені тексти: завантаження текстів у налаштуваннях вимкнено", "@trackReEnrichSuccess": { "description": "Snackbar after successful re-enrichment" }, @@ -3428,7 +3514,7 @@ "@queueFlacAction": { "description": "Action/button label for queueing FLAC redownloads for local tracks" }, - "queueFlacConfirmMessage": "Пошук онлайн-збігів для вибраних треків та додавання завантажень FLAC до черги.\n\nІснуючі файли не будуть змінені або видалені.\n\nАвтоматично додаються до черги лише збіги з високою достовірністю.\n\n{count} вибрано", + "queueFlacConfirmMessage": "Пошук онлайн-збігів для вибраних треків та додавання завантажень FLAC до черги.\n\nЩо існують файли не будуть змінені або видалені.\n\nАвтоматично додаються до черги лише збіги з високою ймовірністю.\n\n{count} Вибрано", "@queueFlacConfirmMessage": { "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", "placeholders": { @@ -3478,11 +3564,11 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, - "trackConvertKeepOriginal": "Keep original file", + "trackConvertKeepOriginal": "Зберегти оригінальний файл", "@trackConvertKeepOriginal": { "description": "Toggle to preserve the source file during conversion" }, - "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "trackConvertKeepOriginalDescription": "Додати конвертований файл як окремий запис в бібліотеці", "@trackConvertKeepOriginalDescription": { "description": "Description for preserving the source file during conversion" }, @@ -3490,7 +3576,7 @@ "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" }, - "trackConvertConfirmMessage": "Конвертувати з {sourceFormat} в {targetFormat} із бітрейтом {bitrate}?\n\nОригінальний файл буде видалено після конвертації.", + "trackConvertConfirmMessage": "Конвертувати з {sourceFormat} в {targetFormat} зі швидкістю {bitrate}?\n\nОригінальний файл буде видалено після конвертації.", "@trackConvertConfirmMessage": { "description": "Confirmation dialog message", "placeholders": { @@ -3517,7 +3603,7 @@ } } }, - "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": "Конвертувати з {sourceFormat} в {targetFormat}?\n\nОригінальний файл буде збережений, а конвертований файл буде додано як окремий запис у бібліотеці.", "@trackConvertConfirmKeepOriginal": { "description": "Confirmation message when the source file will be preserved", "placeholders": { @@ -3572,7 +3658,7 @@ } } }, - "cueSplitTrackCount": "{count} треків", + "cueSplitTrackCount": "{count} Треків", "@cueSplitTrackCount": { "description": "Number of tracks in CUE sheet", "placeholders": { @@ -3609,7 +3695,7 @@ } } }, - "cueSplitSuccess": "Розділено на {count} треків успішно", + "cueSplitSuccess": "Розділено на {count} треки успішно", "@cueSplitSuccess": { "description": "Snackbar after successful CUE split", "placeholders": { @@ -3634,7 +3720,7 @@ "@actionCreate": { "description": "Generic action button - create" }, - "collectionFoldersTitle": "Мої папки", + "collectionFoldersTitle": "Мої теки", "@collectionFoldersTitle": { "description": "Library section title for custom folders" }, @@ -3646,7 +3732,7 @@ "@collectionLoved": { "description": "Custom folder for favorite tracks" }, - "collectionFavoriteArtists": "Favorite Artists", + "collectionFavoriteArtists": "Улюблені Виконавці", "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, @@ -3658,7 +3744,7 @@ "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" }, - "collectionCreatePlaylist": "Створити плейлист", + "collectionCreatePlaylist": "Створити список треків", "@collectionCreatePlaylist": { "description": "Action to create a new playlist" }, @@ -3675,7 +3761,7 @@ } } }, - "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "collectionArtistCount": "{count, plural, =1{1 виконавець} other{{count} виконавці}}", "@collectionArtistCount": { "description": "Artist count label for favorite artists", "placeholders": { @@ -3730,7 +3816,7 @@ "@collectionWishlistEmptySubtitle": { "description": "Wishlist empty state subtitle" }, - "collectionLovedEmptyTitle": "Папка \"Улюблені\" порожня", + "collectionLovedEmptyTitle": "Тека \"Улюблені\" порожня", "@collectionLovedEmptyTitle": { "description": "Loved empty state title" }, @@ -3738,11 +3824,11 @@ "@collectionLovedEmptySubtitle": { "description": "Loved empty state subtitle" }, - "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "collectionFavoriteArtistsEmptyTitle": "Немає улюблених виконавців", "@collectionFavoriteArtistsEmptyTitle": { "description": "Favorite artists empty state title" }, - "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "collectionFavoriteArtistsEmptySubtitle": "Натисніть на серце на сторінці виконавця, щоб зберегти його тут", "@collectionFavoriteArtistsEmptySubtitle": { "description": "Favorite artists empty state subtitle" }, @@ -3758,7 +3844,7 @@ "@collectionRemoveFromPlaylist": { "description": "Tooltip for removing track from playlist" }, - "collectionRemoveFromFolder": "Видалити з папки", + "collectionRemoveFromFolder": "Видалити з теки", "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, @@ -3798,7 +3884,7 @@ } } }, - "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "collectionAddedToFavoriteArtists": "\"{artistName}\" видалено з улюблених Виконавців", "@collectionAddedToFavoriteArtists": { "description": "Snackbar after adding artist to favorite artists", "placeholders": { @@ -3807,7 +3893,7 @@ } } }, - "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" видалено з улюблених Виконавців", "@collectionRemovedFromFavoriteArtists": { "description": "Snackbar after removing artist from favorite artists", "placeholders": { @@ -3832,11 +3918,11 @@ "@trackOptionRemoveFromWishlist": { "description": "Bottom sheet action label - remove track from wishlist" }, - "artistOptionAddToFavorites": "Add to Favorite Artists", + "artistOptionAddToFavorites": "Додати до улюблених Виконавців", "@artistOptionAddToFavorites": { "description": "Action label - add artist to favorite artists" }, - "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "artistOptionRemoveFromFavorites": "Видалено з улюблених Виконавців", "@artistOptionRemoveFromFavorites": { "description": "Action label - remove artist from favorite artists" }, @@ -3878,7 +3964,7 @@ "@selectionBatchConvertConfirmTitle": { "description": "Confirmation dialog title for batch conversion" }, - "selectionBatchConvertConfirmMessage": "Конвертувати {count} {count, plural, =1{трек} other{треків}} у {format} з бітрейтом {bitrate}?\n\nОригінальні файли будуть видалені після конвертації.", + "selectionBatchConvertConfirmMessage": "Конвертувати {count} {count, plural, =1{трек} other{треків}} у {format} з {bitrate}?\n\nОригінальні файли будуть видалені після конвертації.", "@selectionBatchConvertConfirmMessage": { "description": "Confirmation dialog message for batch conversion", "placeholders": { @@ -3905,7 +3991,7 @@ } } }, - "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": "Конвертувати {count} {count, plural, =1{трек} few{треки} other{треків}} у {format}?\n\nОригінальні файли буде збережено, а конвертовані — додано як окремі записи до медіатеки.", "@selectionBatchConvertConfirmKeepOriginal": { "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { @@ -3932,7 +4018,7 @@ } } }, - "downloadedAlbumDownloadedCount": "{count} завантажено", + "downloadedAlbumDownloadedCount": "{count} Завантажено", "@downloadedAlbumDownloadedCount": { "description": "Downloaded tracks count badge", "placeholders": { @@ -3941,15 +4027,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Тека з ім'ям виконавця альбому", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when album artist is used for folder names" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Тека з іменем виконавця пісні", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when track artist is used for folder names" }, - "lyricsProvidersTitle": "Lyrics Provider Priority", + "lyricsProvidersTitle": "Пріоритет джерела текстів пісень", "@lyricsProvidersTitle": { "description": "Settings item title for lyrics provider order" }, @@ -3957,7 +4043,7 @@ "@lyricsProvidersDescription": { "description": "Description on the lyrics provider priority page" }, - "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", + "lyricsProvidersInfoText": "Постачальники текстів пісень із розширень працюють перед вбудованими постачальниками. Принаймні один постачальник має залишатися ввімкненим.", "@lyricsProvidersInfoText": { "description": "Info tip on lyrics provider priority page" }, @@ -4007,11 +4093,11 @@ "@lyricsProviderAppleMusicDesc": { "description": "Description for Apple Music provider" }, - "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, direct API)", + "lyricsProviderQqMusicDesc": "QQ Music (добре підходить для китайських пісень, прямий API)", "@lyricsProviderQqMusicDesc": { "description": "Description for QQ Music provider" }, - "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", + "lyricsProviderLyricsPlusDesc": "Текст пісні для караоке (послідовний показ слів; Apple / Musixmatch / Spotify / QQ, через проксі)", "@lyricsProviderLyricsPlusDesc": { "description": "Description for LyricsPlus provider" }, @@ -4027,111 +4113,111 @@ "@safMigrationMessage1": { "description": "First paragraph of SAF migration dialog" }, - "safMigrationMessage2": "Будь ласка, виберіть папку завантажень ще раз, щоб перейти до нової системи зберігання.", + "safMigrationMessage2": "Будь ласка, виберіть теку завантажень ще раз, щоб перейти до нової системи зберігання.", "@safMigrationMessage2": { "description": "Second paragraph of SAF migration dialog" }, - "safMigrationSuccess": "Папку завантажень оновлено до режиму SAF", + "safMigrationSuccess": "Тека завантажень оновлено до режиму SAF", "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Support Development", + "settingsDonate": "Підтримати розробника", "@settingsDonate": { "description": "Settings menu item - donate page" }, - "settingsDonateSubtitle": "Buy the developer a coffee", + "settingsDonateSubtitle": "Пригостіть розробника кавою", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, - "settingsBackup": "Backup & Restore", + "settingsBackup": "Резервування та відновлення", "@settingsBackup": { "description": "Settings menu item - backup and restore page" }, - "settingsBackupSubtitle": "Move your library, history and settings to a new device", + "settingsBackupSubtitle": "Перемістити вашу бібліотеку, історію та налаштування на новий пристрій", "@settingsBackupSubtitle": { "description": "Subtitle for backup and restore settings item" }, - "backupTitle": "Backup & Restore", + "backupTitle": "Резервування та відновлення", "@backupTitle": { "description": "App bar title for the backup and restore page" }, - "backupExportSectionTitle": "Create backup", + "backupExportSectionTitle": "Створити резервну копію", "@backupExportSectionTitle": { "description": "Section title for the export/backup card" }, - "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", + "backupExportSectionDescription": "Збережіть свої налаштування, історію завантажень, вподобані треки, список бажань, улюблених виконавців і список треків в один файл, який можна зберегти або перенести на інший телефон.", "@backupExportSectionDescription": { "description": "Description of what a backup contains" }, - "backupExportButton": "Create backup file", + "backupExportButton": "Створити файл резервної копії", "@backupExportButton": { "description": "Button to create and share a backup file" }, - "backupImportSectionTitle": "Restore backup", + "backupImportSectionTitle": "Відновити резервну копію", "@backupImportSectionTitle": { "description": "Section title for the import/restore card" }, - "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", + "backupImportSectionDescription": "Виберіть файл резервної копії, щоб відновити дані. Це замінить поточні налаштування, історію та бібліотеку на цьому пристрої.", "@backupImportSectionDescription": { "description": "Description for the restore action" }, - "backupImportButton": "Choose backup file", + "backupImportButton": "Виберіть файл резервної копії", "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreated": "Backup created", + "backupCreated": "Резервну копію створено", "@backupCreated": { "description": "Snackbar after a backup file is created" }, - "backupCreateFailed": "Failed to create backup", + "backupCreateFailed": "Не вдалося створити резервну копію", "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupRestoreConfirmTitle": "Restore this backup?", + "backupRestoreConfirmTitle": "Відновити цю резервну копію?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" }, - "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", + "backupRestoreConfirmMessage": "Це замінить ваші поточні налаштування, історію завантажень, вподобані треки, список бажань і списки відтворення вмістом резервної копії. Цю дію неможливо скасувати.", "@backupRestoreConfirmMessage": { "description": "Confirmation dialog message before restoring a backup" }, - "backupRestoreConfirmButton": "Restore", + "backupRestoreConfirmButton": "Відновити", "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestored": "Backup restored successfully", + "backupRestored": "Резервну копію успішно відновлено", "@backupRestored": { "description": "Snackbar after a successful restore" }, - "backupRestoreFailed": "Failed to restore backup", + "backupRestoreFailed": "Не вдалося відновити резервну копію", "@backupRestoreFailed": { "description": "Snackbar when restore fails" }, - "backupInvalidFile": "This file is not a valid SpotiFLAC backup", + "backupInvalidFile": "Цей файл не є дійсною резервною копією SpotiFLAC", "@backupInvalidFile": { "description": "Snackbar when the chosen file is not a valid backup" }, - "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", + "backupRestoreRestartHint": "Перезапустіть програму, щоб переконатися, що всі зміни застосовано.", "@backupRestoreRestartHint": { "description": "Hint shown after restoring that an app restart is recommended" }, - "backupContentsTitle": "Backup contents", + "backupContentsTitle": "Вміст резервної копії", "@backupContentsTitle": { "description": "Header above the list summarizing what the backup contains" }, - "backupSettingsOnly": "Settings only", - "backupSelectHistory": "Download history", - "backupSelectCollections": "Library collections", - "backupSelectCollectionsDescription": "Liked tracks, wishlist, favorite artists, playlists and playlist covers.", - "backupSelectExtensions": "Extensions and their settings", - "backupSelectedExportDescription": "Save the selected categories to a backup file. Audio files are not included.", - "backupSelectAtLeastOne": "Select at least one category to create a backup.", - "backupSelectedRestoreMessage": "Only the categories listed below will be restored. Categories not included in this backup will stay unchanged. Restoring can replace existing data and cannot be undone.", - "backupContentsSettings": "App settings", + "backupSettingsOnly": "Тільки налаштування", + "backupSelectHistory": "Історія завантажень", + "backupSelectCollections": "Колекції бібліотек", + "backupSelectCollectionsDescription": "Вподобані треки, список бажань, улюблені виконавці, списки відтворення та обкладинки списку треків.", + "backupSelectExtensions": "Розширення та їх налаштування", + "backupSelectedExportDescription": "Зберегти вибрані категорії в файл резервної копії. Аудіофайли не включені.", + "backupSelectAtLeastOne": "Виберіть принаймні одну категорію, для створення резервної копії.", + "backupSelectedRestoreMessage": "Буде відновлено лише категорії, перелічені нижче. Категорії, не включені до цієї резервної копії, залишаться без змін. Процес відновлення може замінити наявні дані; скасувати цю дію неможливо.", + "backupContentsSettings": "Налаштування додатку", "@backupContentsSettings": { "description": "Backup contents row label for settings" }, - "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", + "backupContentsHistory": "{count} історію {count, plural, =1{елемент} other{елементи}}", "@backupContentsHistory": { "description": "Backup contents row for history count", "placeholders": { @@ -4140,7 +4226,7 @@ } } }, - "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", + "backupContentsLiked": "{count} вподобали {count, plural, =1{трек} other{треків}}", "@backupContentsLiked": { "description": "Backup contents row for liked tracks count", "placeholders": { @@ -4149,7 +4235,7 @@ } } }, - "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", + "backupContentsWishlist": "{count} список бажань {count, plural, =1{трек} other{треків}}", "@backupContentsWishlist": { "description": "Backup contents row for wishlist tracks count", "placeholders": { @@ -4158,7 +4244,7 @@ } } }, - "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "backupContentsPlaylists": "{count, plural, =1{1 список треків} other{{count} списки треків}}", "@backupContentsPlaylists": { "description": "Backup contents row for playlist count", "placeholders": { @@ -4167,7 +4253,7 @@ } } }, - "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", + "backupContentsArtists": "{count, plural, =1{1 улюблений виконавець} other{{count} улюблені виконавці}}", "@backupContentsArtists": { "description": "Backup contents row for favorite artists count", "placeholders": { @@ -4176,7 +4262,7 @@ } } }, - "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", + "backupContentsExtensions": "{count, plural, =1{1 розширення} other{{count} розширення}}", "@backupContentsExtensions": { "description": "Backup contents row for installed extensions count", "placeholders": { @@ -4185,15 +4271,15 @@ } } }, - "backupIncludeSecrets": "Include extension credentials", + "backupIncludeSecrets": "Додайте облікові дані розширення", "@backupIncludeSecrets": { "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" }, - "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", + "backupIncludeSecretsDescription": "Токени та ключі API з розширень будуть збережені у файлі резервної копії. Зберігайте цей файл у безпечному місці. Якщо цю опцію вимкнено, вам доведеться ввести їх знову після відновлення.", "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{розширення} other{розширень}} не вдалося перевстановити. Встановіть їх вручну з репозиторію.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4286,51 +4372,51 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose where to save your downloaded tracks", + "downloadLocationSubtitle": "Виберіть місце для збереження завантажених треків", "@downloadLocationSubtitle": { "description": "Subtitle shown in the download location picker sheet" }, - "storageAutomaticFolder": "Automatic folder", - "storageAutomaticDownloadFolder": "Uses Download/SpotiFLAC when writable, otherwise app storage", - "storageSafRecommended": "Choose folder (Recommended)", - "storageDownloadFolderHint": "In the Android folder picker, open Download and select SpotiFLAC. If it does not exist, create it using New folder, then tap Use this folder to grant access.", - "storageModeAppFolder": "App Folder (Recommended)", + "storageAutomaticFolder": "Автоматична тека", + "storageAutomaticDownloadFolder": "Використовує теку Завантаженн/SpotiFLAC, якщо вона доступна для запису; в іншому разі — сховище застосунку", + "storageSafRecommended": "Виберіть теку (рекомендовано)", + "storageDownloadFolderHint": "У засобі вибору тек Android відкрийте теку Завантаження і виберіть SpotiFLAC. Якщо її немає, створіть її за допомогою опції «Нова тека», а потім натисніть «Використовувати цю теку», щоб надати доступ.", + "storageModeAppFolder": "Виберіть теку (рекомендовано)", "@storageModeAppFolder": { "description": "Storage mode option - app-managed folder" }, - "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", + "storageModeAppFolderSubtitle": "Використовувати Музика/SpotiFLAC за замовчуванням", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "Custom Folder (SAF)", + "storageModeSaf": "Користувацька тека (SAF)", "@storageModeSaf": { "description": "Storage mode option - Storage Access Framework" }, - "storageModeSafSubtitle": "Pick any folder, including SD card", + "storageModeSafSubtitle": "Вибрати будь-яку теку, включаючи SD-карту", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFolderAccessLostTitle": "Download folder access lost", + "downloadFolderAccessLostTitle": "Втрачено доступ до теки завантажень", "@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": "Завантаження не вдасться, поки ви не оберете теку", "@downloadFolderAccessLostSubtitle": { "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" }, - "downloadFolderReselect": "Re-select folder", + "downloadFolderReselect": "Обрати теку повторно", "@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": "Доступ до SAF недійсний або відкликаний. Будь ласка, переналаштуйте розташування завантаження в налаштуваннях.", "@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": "Втрачено доступ до теки завантажень. Будь ласка, повторно виберіть теку завантажень у налаштуваннях.", "@downloadErrorFolderAccessLost": { "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" }, - "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", + "downloadFilenameDescription": "Використовуйте {artist}, {title}, {album}, {track}, {year}, {date}, {disc} як заповнювачі.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" }, @@ -4338,11 +4424,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", + "downloadSeparateSinglesEnabled": "Сингли та мініальбоми, збережені в окремій теці", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is on" }, - "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", + "downloadSeparateSinglesDisabled": "Сингли та альбоми, збережені в одній теці", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is off" }, @@ -4350,19 +4436,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", + "downloadCreatePlaylistSourceFolder": "Вихідна тека списку відтворення", "@downloadCreatePlaylistSourceFolder": { "description": "Setting to create a subfolder per playlist source" }, - "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", + "downloadCreatePlaylistSourceFolderEnabled": "Для кожного списку відтворення створюється підтека", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist folder is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", + "downloadCreatePlaylistSourceFolderDisabled": "Усі треки зберігаються безпосередньо в теці завантажень", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist folder is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", + "downloadCreatePlaylistSourceFolderRedundant": "Керується налаштуванням організації тек", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when folder organization is already set to playlist" }, @@ -4370,35 +4456,35 @@ "@downloadSongLinkRegion": { "description": "Setting for SongLink region used during fallback resolution" }, - "downloadNetworkCompatibilityMode": "Network Compatibility Mode", + "downloadNetworkCompatibilityMode": "Режим сумісності з мережею", "@downloadNetworkCompatibilityMode": { "description": "Setting for legacy TLS/network handling" }, - "downloadNetworkCompatibilityModeEnabled": "Allowing legacy HTTP endpoints; TLS verification remains enabled", + "downloadNetworkCompatibilityModeEnabled": "Дозволено використання застарілих HTTP endpoints; перевірку TLS збережено в увімкненому стані", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is on" }, - "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", + "downloadNetworkCompatibilityModeDisabled": "Використовується стандартні налаштування мережі", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is off" }, - "downloadAllowLocalNetwork": "Allow Local Network Access", + "downloadAllowLocalNetwork": "Дозволити доступ до локальної мережі", "@downloadAllowLocalNetwork": { "description": "Setting title for allowing requests to private/local network targets" }, - "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", + "downloadAllowLocalNetworkEnabled": "Дозволено надсилати запити на локальні або приватні адреси (для локального проксі-сервера чи власного DNS)", "@downloadAllowLocalNetworkEnabled": { "description": "Subtitle when allow local network access is on" }, - "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", + "downloadAllowLocalNetworkDisabled": "Локальні/приватні Адреси заблоковано з міркувань безпеки", "@downloadAllowLocalNetworkDisabled": { "description": "Subtitle when allow local network access is off" }, - "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", + "downloadSelectServiceToEnable": "Виберіть провайдера, що пропонує якісні варіанти, щоб увімкнути цю функцію", "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadEmbedLyricsDisabled": "Enable metadata embedding first", + "downloadEmbedLyricsDisabled": "Увімкнути метаданні спочатку", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" }, @@ -4406,11 +4492,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Setting to include translated lyrics from Netease" }, - "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", + "downloadNeteaseIncludeTranslationEnabled": "Китайські рядки перекладу включені", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is on" }, - "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Тільки оригінальні тексти пісень", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is off" }, @@ -4418,35 +4504,35 @@ "@downloadNeteaseIncludeRomanization": { "description": "Setting to include romanized lyrics from Netease" }, - "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", + "downloadNeteaseIncludeRomanizationEnabled": "Включені лінії романізації", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is on" }, - "downloadNeteaseIncludeRomanizationDisabled": "No romanization", + "downloadNeteaseIncludeRomanizationDisabled": "Без романізації", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is off" }, - "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", + "downloadAppleQqMultiPerson": "Apple / Q: Багатокористувацькі тексти", "@downloadAppleQqMultiPerson": { "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" }, - "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", + "downloadAppleQqMultiPersonEnabled": "Додано позначення виконавців для дуетів і групових треків", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person lyrics is on" }, - "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", + "downloadAppleQqMultiPersonDisabled": "Стандартний текст пісні без позначення виконавців", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person lyrics is off" }, - "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "downloadAppleElrcWordSync": "Синхронізація слів eLRC в Apple Music", "@downloadAppleElrcWordSync": { "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" }, - "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "downloadAppleElrcWordSyncEnabled": "Збережено вихідні часові мітки для кожного слова", "@downloadAppleElrcWordSyncEnabled": { "description": "Subtitle when Apple Music eLRC word sync is enabled" }, - "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "downloadAppleElrcWordSyncDisabled": "Безпечніше показ тексту пісень в Apple Music рядок за рядком", "@downloadAppleElrcWordSyncDisabled": { "description": "Subtitle when Apple Music eLRC word sync is disabled" }, @@ -4454,23 +4540,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting for Musixmatch lyrics translation language" }, - "downloadMusixmatchLanguageAuto": "Auto (original language)", + "downloadMusixmatchLanguageAuto": "Автоматично (мова оригіналу)", "@downloadMusixmatchLanguageAuto": { "description": "Subtitle when no language is set" }, - "downloadFilterContributing": "Filter Contributing Artists", + "downloadFilterContributing": "Поки що немає постачальників послуг пошуку", "@downloadFilterContributing": { "description": "Setting to strip contributing artists from Album Artist folder name" }, - "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", + "downloadFilterContributingEnabled": "Виконавців, що брали участь у записі, видалено з назви теки виконавця альбому", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is on" }, - "downloadFilterContributingDisabled": "Full Album Artist string used", + "downloadFilterContributingDisabled": "Використано повний тип даних виконавця альбому", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is off" }, - "downloadProvidersNoneEnabled": "No providers enabled", + "downloadProvidersNoneEnabled": "Немає доступних провайдерів", "@downloadProvidersNoneEnabled": { "description": "Shown when no lyrics providers are active" }, @@ -4482,7 +4568,7 @@ "@downloadMusixmatchLanguageHint": { "description": "Placeholder for Musixmatch language input" }, - "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", + "downloadMusixmatchLanguageDesc": "Введіть код мови BCP-47 (наприклад, en, de, ja), щоб отримати переклад тексту пісні з Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in Musixmatch language picker" }, @@ -4490,15 +4576,15 @@ "@downloadMusixmatchAuto": { "description": "Button to clear Musixmatch language (use auto)" }, - "downloadNetworkAnySubtitle": "Use WiFi or mobile data", + "downloadNetworkAnySubtitle": "Використовувати Wi-Fi або мобільні дані", "@downloadNetworkAnySubtitle": { "description": "Subtitle for any-network option in picker" }, - "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", + "downloadNetworkWifiOnlySubtitle": "Завантаження призупиняються під час використання мобільних даних", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for WiFi-only option in picker" }, - "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", + "downloadSongLinkRegionDesc": "Регіон, що використовується для визначення посилань на треки через SongLink. Оберіть країну, в якій доступні ваші стрімінгові сервіси.", "@downloadSongLinkRegionDesc": { "description": "Description in SongLink region picker" }, @@ -4510,7 +4596,7 @@ "@cacheRefresh": { "description": "Tooltip for refresh button on cache management page" }, - "dialogDownloadPlaylistsMessage": "Завантажити {trackCount} {trackCount, plural, =1{трек} other{треків}} з {playlistCount} {playlistCount, plural, =1{плейлист} other{плейлистів}}?", + "dialogDownloadPlaylistsMessage": "Завантажити {trackCount} {trackCount, plural, =1{трек} other{треків}} із {playlistCount} {playlistCount, plural, =1{список треків} other{списки треків}}?", "@dialogDownloadPlaylistsMessage": { "description": "Dialog message for bulk playlist download confirmation", "placeholders": { @@ -4522,7 +4608,7 @@ } } }, - "bulkDownloadPlaylistsButton": "Завантажити {count} {count, plural, =1{плейлист} other{плейлистів}}", + "bulkDownloadPlaylistsButton": "Завантажити {count} {count, plural, =1{список треків} other{списки треків}}", "@bulkDownloadPlaylistsButton": { "description": "Button label for bulk downloading selected playlists", "placeholders": { @@ -4539,7 +4625,7 @@ "@snackbarSelectedPlaylistsEmpty": { "description": "Snackbar when selected playlists contain no tracks" }, - "playlistsCount": "{count, plural, =1{1 плейлист} other{{count} плейлистів}}", + "playlistsCount": "{count, plural, =1{1 список треків} other{{count} списків треків}}", "@playlistsCount": { "description": "Playlist count display", "placeholders": { @@ -4552,23 +4638,23 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", + "editMetadataAutoFillDesc": "Виберіть розширення метаданих, оберіть поля, а потім перегляньте дані перед застосуванням", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, - "editMetadataAutoFillSource": "Metadata source", + "editMetadataAutoFillSource": "Джерело метаданих", "@editMetadataAutoFillSource": { "description": "Label for the metadata extension selector in online auto-fill" }, - "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "editMetadataAutoFillSourceAutomatic": "Автоматично (пріоритет провайдера)", "@editMetadataAutoFillSourceAutomatic": { "description": "Automatic source option that follows configured metadata provider priority" }, - "editMetadataAutoFillFind": "Find metadata", + "editMetadataAutoFillFind": "Знайти метадані", "@editMetadataAutoFillFind": { "description": "Button label for finding an online metadata candidate" }, - "editMetadataAutoFillPreview": "Data from {source}", + "editMetadataAutoFillPreview": "Дані з {source}", "@editMetadataAutoFillPreview": { "description": "Title for the online metadata preview", "placeholders": { @@ -4577,15 +4663,15 @@ } } }, - "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "editMetadataAutoFillCoverAvailable": "Доступне оформлення обкладинки", "@editMetadataAutoFillCoverAvailable": { "description": "Preview value when the selected metadata source provides cover artwork" }, - "editMetadataAutoFillApply": "Apply selected data", + "editMetadataAutoFillApply": "Застосувати вибрані дані", "@editMetadataAutoFillApply": { "description": "Button label for applying the previewed metadata" }, - "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "editMetadataAutoFillDoneFromSource": "Заповнено {count} {count, plural, =1{поле} other{поля}} з {source}", "@editMetadataAutoFillDoneFromSource": { "description": "Snackbar confirming fields applied from a selected metadata source", "placeholders": { @@ -4609,7 +4695,7 @@ "@editMetadataAutoFillNoResults": { "description": "Snackbar when online metadata search returns no results" }, - "editMetadataAutoFillDone": "Заповнено {count} {count, plural, =1{поле} other{полей}} з онлайн-метаданих", + "editMetadataAutoFillDone": "Заповнено {count} {count, plural, =1{поле} other{полів}} з онлайн-метаданих", "@editMetadataAutoFillDone": { "description": "Snackbar confirming how many fields were auto-filled", "placeholders": { @@ -4658,7 +4744,7 @@ "@editMetadataFieldIsrc": { "description": "Chip label for ISRC field in auto-fill selector" }, - "editMetadataFieldLabel": "Лейбл", + "editMetadataFieldLabel": "Обкладинка", "@editMetadataFieldLabel": { "description": "Chip label for label field in auto-fill selector" }, @@ -4674,7 +4760,7 @@ "@editMetadataSelectAll": { "description": "Button to select all fields for auto-fill" }, - "editMetadataSelectEmpty": "Порожні (без мета даних)", + "editMetadataSelectEmpty": "Тільки порожні", "@editMetadataSelectEmpty": { "description": "Button to select only fields that are currently empty" }, @@ -4725,7 +4811,7 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, - "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "queuePlaylistCount": "{count, plural, =1{1 список треків} other{{count} списки треків}}", "@queuePlaylistCount": { "description": "Playlist count label with plural support", "placeholders": { @@ -4734,15 +4820,15 @@ } } }, - "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "queueEmptyPlaylistsSubtitle": "Створіть списки треків, щоб упорядкувати свої треки", "@queueEmptyPlaylistsSubtitle": { "description": "Empty state subtitle for the playlists library view" }, - "libraryDefaultView": "Default view", + "libraryDefaultView": "Вигляд за замовчуванням", "@libraryDefaultView": { "description": "Setting title - which library view opens when switching to the Library tab" }, - "libraryDefaultViewLastUsed": "Last used", + "libraryDefaultViewLastUsed": "Останнє використання", "@libraryDefaultViewLastUsed": { "description": "Default view option - keep the last used library view" }, @@ -4782,15 +4868,15 @@ "@audioAnalysisSampleRate": { "description": "Sample rate metric label" }, - "audioAnalysisCodec": "Codec", + "audioAnalysisCodec": "Кодек", "@audioAnalysisCodec": { "description": "Audio codec metric label" }, - "audioAnalysisContainer": "Container", + "audioAnalysisContainer": "Контейнер", "@audioAnalysisContainer": { "description": "Audio container metric label" }, - "audioAnalysisDecodedFormat": "Decoded Format", + "audioAnalysisDecodedFormat": "Декодований формат", "@audioAnalysisDecodedFormat": { "description": "Decoded sample format metric label" }, @@ -4830,27 +4916,27 @@ "@audioAnalysisLufs": { "description": "Integrated loudness metric label" }, - "audioAnalysisTruePeak": "True Peak", + "audioAnalysisTruePeak": "Справжній пік", "@audioAnalysisTruePeak": { "description": "True peak metric label" }, - "audioAnalysisClipping": "Clipping", + "audioAnalysisClipping": "Обрізування", "@audioAnalysisClipping": { "description": "Clipping metric label" }, - "audioAnalysisNoClipping": "No clipping", + "audioAnalysisNoClipping": "Без обрізування", "@audioAnalysisNoClipping": { "description": "Displayed when no clipped samples were detected" }, - "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "audioAnalysisSpectralCutoff": "Спектральний розріз", "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, - "audioAnalysisCutoffNotDetected": "Not detected", + "audioAnalysisCutoffNotDetected": "Не виявлено", "@audioAnalysisCutoffNotDetected": { "description": "Displayed when no reliable broadband spectral cutoff can be detected" }, - "audioAnalysisChannelStats": "Per-channel Stats", + "audioAnalysisChannelStats": "Статистика окремих каналів", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" }, @@ -4858,43 +4944,43 @@ "@audioAnalysisSamples": { "description": "Total samples metric label" }, - "audioAnalysisRescan": "Re-analyze", + "audioAnalysisRescan": "Повторний аналіз", "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "downloadRedownloadFakeHiRes": "Re-download fake Hi-Res", + "downloadRedownloadFakeHiRes": "Повторно завантажити підроблений Hi-Res", "@downloadRedownloadFakeHiRes": { "description": "Setting title: automatically replace downloads that measure as fake Hi-Res" }, - "downloadRedownloadFakeHiResSubtitle": "Off by default. Check Hi-Res downloads and replace only when every audio sample is preserved. Keep the original if verification or processing fails", + "downloadRedownloadFakeHiResSubtitle": "Вимкнено за замовчуванням. Перевіряйте завантаження у високій якості Hi-Res і замінюйте файл лише за умови збереження всіх аудіосемплів. Зберігайте оригінал, якщо перевірка або обробка не вдалися", "@downloadRedownloadFakeHiResSubtitle": { "description": "Setting subtitle for the fake Hi-Res re-download toggle" }, - "hiResCheckVerdictFakeCertain": "Fake Hi-Res", + "hiResCheckVerdictFakeCertain": "Підроблений Hi-Res", "@hiResCheckVerdictFakeCertain": { "description": "Verdict: an exact fingerprint (padded bits or upsampling pattern) proves the file is not real Hi-Res" }, - "hiResCheckVerdictFakeSuspect": "Possibly a filtered master", + "hiResCheckVerdictFakeSuspect": "Можливо, відфільтрований майстер-трек", "@hiResCheckVerdictFakeSuspect": { "description": "Verdict: fails the cutoff test but may be a genuine master low-pass filtered in mastering" }, - "hiResCheckReasonSampleHold": "Every sample is repeated: upsampled by duplication", + "hiResCheckReasonSampleHold": "Кожен відлік повторюється: підвищення частоти дискретизації шляхом дублювання\n", "@hiResCheckReasonSampleHold": { "description": "Reason: sample-and-hold upsampling detected" }, - "hiResCheckReasonInterpolation": "In-between samples are linearly interpolated", + "hiResCheckReasonInterpolation": "Проміжні відліки лінійно інтерполюються", "@hiResCheckReasonInterpolation": { "description": "Reason: linear-interpolation upsampling detected" }, - "hiResCheckReasonImaging": "Content above 22 kHz mirrors the audible band", + "hiResCheckReasonImaging": "Віддзеркалює звуковий діапазон більш як 22 kHz", "@hiResCheckReasonImaging": { "description": "Reason: spectral imaging from upsampling detected" }, - "hiResCheckMusicContent": "Musical content", + "hiResCheckMusicContent": "Музичний контент", "@hiResCheckMusicContent": { "description": "Label for the highest frequency that still moves with the music" }, - "hiResCheckUltrasonicNoise": "Above {cutoff} only steady noise (typical of DSD or analog tape transfers): a {rate} file would hold all the music", + "hiResCheckUltrasonicNoise": "Вище {cutoff} — лише стабільний шум (характерний для DSD або записів з аналогової стрічки): файл із частотою {rate} містив би всю музику", "@hiResCheckUltrasonicNoise": { "description": "Shown when the ultrasonic content of a Hi-Res file is noise rather than music", "placeholders": { @@ -4906,55 +4992,110 @@ } } }, - "hiResCheckTitle": "Hi-Res Authenticity", + "hiResCheckTitle": "Автентичність Hi-Res", "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, - "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", + "hiResCheckSummary": "Перевірте спектр та активну розрядність на наявність ознак підвищення частоти дискретизації або простір між вмістом елемента та його рамкою/межами.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Обмежена пропускна здатність", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "Підвищення частоти дискретизації або доповнення не виявлено", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Орієнтовне обмеження", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Активні / збережені біти", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "Нижча межа відсікання може бути обумовлена освоєнням. Саме по собі це не доводить наявність підвищеної частоти дискретизації.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "На основі {seconds} секунд аудіозапису. Цей аналіз не може підтвердити автентичність оригіналу.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "Спектр містить дзеркальні смуги, характерні для підвищення частоти дискретизації.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "Різкий спад поблизу {cutoff} і виміряний рівень шуму вказують на джерело з нижчою частотою дискретизації.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Енергія вище рівня відсікання {cutoff} в аналізованому сегменті здебільшого стабільна і може бути зумовлена ​​шумом.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckDescription": "Виявляйте підроблені файли високої роздільної здатності Hi-Re, отримані шляхом підвищення частоти дискретизації або доповнення бітами", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" }, - "hiResCheckRun": "Check", + "hiResCheckRun": "Перевірити", "@hiResCheckRun": { "description": "Button that starts the Hi-Res authenticity check" }, - "hiResCheckChecking": "Checking Hi-Res authenticity...", + "hiResCheckChecking": "Перевірка автентичності Hi-Res...", "@hiResCheckChecking": { "description": "Loading text while the Hi-Res check runs" }, - "hiResCheckVerdictFake": "Likely fake Hi-Res", + "hiResCheckVerdictFake": "Ймовірно підробка Hi-Res", "@hiResCheckVerdictFake": { "description": "Verdict: the file claims Hi-Res but does not measure as it" }, - "hiResCheckVerdictGenuine": "Measures as genuine Hi-Res", + "hiResCheckVerdictGenuine": "Відповідає стандартам справжнього Hi-Res", "@hiResCheckVerdictGenuine": { "description": "Verdict: no upsampling or padded bit depth found" }, - "hiResCheckVerdictStandard": "Standard definition, nothing to flag", + "hiResCheckVerdictStandard": "Стандартне визначення, немає підстав для позначення", "@hiResCheckVerdictStandard": { "description": "Verdict: neither sample rate nor bit depth claims Hi-Res" }, - "hiResCheckVerdictInconclusive": "Inconclusive: the analyzed segment is too quiet or short", + "hiResCheckVerdictInconclusive": "Невизначений результат: проаналізований фрагмент занадто тихий або короткий", "@hiResCheckVerdictInconclusive": { "description": "Verdict: analysis could not reach a reliable conclusion" }, - "hiResCheckUnsupported": "Only FLAC and WAV files can be checked", + "hiResCheckUnsupported": "Можна перевірити лише файли у форматах FLAC і WAV", "@hiResCheckUnsupported": { "description": "Shown when the file format cannot be decoded by the Hi-Res check" }, - "hiResCheckCutoff": "Content cutoff", + "hiResCheckCutoff": "Контент відключено", "@hiResCheckCutoff": { "description": "Label for the highest frequency with real content" }, - "hiResCheckBitsInUse": "Bits in use", + "hiResCheckBitsInUse": "Використовувані біти", "@hiResCheckBitsInUse": { "description": "Label for effective vs declared bit depth" }, - "hiResCheckDisclaimer": "The spectrum stops early, but nothing proves it was upsampled: it may be a genuine master low-pass filtered in mastering. It is not replaced automatically.", + "hiResCheckDisclaimer": "Спектр обривається завчасно, але немає доказів того, що було застосовано підвищену частоту дискретизації: це може бути оригінальна фінальна версія треку, до якого на фінальному етапі обробки треку було застосовано фільтр низьких частот. Автоматичній заміні він не підлягає.", "@hiResCheckDisclaimer": { "description": "Caveat shown under a fake Hi-Res verdict" }, - "hiResCheckFailed": "Hi-Res check failed: {error}", + "hiResCheckFailed": "Помилка перевірки Hi-Res: {error}", "@hiResCheckFailed": { "description": "Error shown when the Hi-Res check fails", "placeholders": { @@ -4963,7 +5104,7 @@ } } }, - "hiResCheckReasonRate": "Declares {sampleRate} but content stops at ~{cutoff}", + "hiResCheckReasonRate": "Заявлено {sampleRate} але вміст зупиняється на ~{cutoff}", "@hiResCheckReasonRate": { "description": "Reason for a fake verdict caused by upsampling", "placeholders": { @@ -4975,7 +5116,7 @@ } } }, - "hiResCheckReasonDepth": "Declares {declared}-bit but only {effective} bits carry data", + "hiResCheckReasonDepth": "Заявлено {declared} біт, але тільки {effective} біти передають дані", "@hiResCheckReasonDepth": { "description": "Reason for a fake verdict caused by padded bit depth", "placeholders": { @@ -4987,7 +5128,7 @@ } } }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Повторний аналіз аудіо...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4995,7 +5136,7 @@ "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" }, - "extensionsHomeFeedDescription": "Виберіть, яке розширення відображатиме домашню стрічку на головному екрані", + "extensionsHomeFeedDescription": "Виберіть, яке розширення показуватиме домашню стрічку на головному екрані", "@extensionsHomeFeedDescription": { "description": "Extensions page - description for home feed provider picker" }, @@ -5007,11 +5148,11 @@ "@extensionsHomeFeedAutoSubtitle": { "description": "Extensions page - subtitle for auto home feed option" }, - "extensionsHomeFeedOff": "Off", + "extensionsHomeFeedOff": "Вимкнути", "@extensionsHomeFeedOff": { "description": "Extensions page - home feed provider option: off" }, - "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "extensionsHomeFeedOffSubtitle": "Приховати домашню стрічку на головному екрані", "@extensionsHomeFeedOffSubtitle": { "description": "Extensions page - subtitle for off home feed option" }, @@ -5045,11 +5186,11 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, - "queueCancelledTitle": "Download cancelled", + "queueCancelledTitle": "Завантаження скасоване", "@queueCancelledTitle": { "description": "Dialog title when opening a cancelled queue item" }, - "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "queueCancelledMessage": "Це завантаження було скасовано. Повторіть спробу, або видаліть його з черги.", "@queueCancelledMessage": { "description": "Dialog body when opening a cancelled queue item" }, @@ -5061,7 +5202,7 @@ "@metadataSaveFailedStorage": { "description": "Snackbar error when writing metadata file back to storage fails" }, - "snackbarFolderPickerFailed": "Не вдалося відкрити засіб вибору папок: {error}", + "snackbarFolderPickerFailed": "Не вдалося відкрити засіб вибору тек: {error}", "@snackbarFolderPickerFailed": { "description": "Snackbar shown when folder picker fails to open", "placeholders": { @@ -5136,11 +5277,11 @@ } } }, - "notifVerificationRequiredTitle": "Verification required", + "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": "Open the app to complete verification and resume downloads", + "notifVerificationRequiredBody": "Відкрийте програму, щоб завершити перевірку та відновити завантаження", "@notifVerificationRequiredBody": { "description": "Notification body prompting the user to return to the app to solve a verification challenge" }, @@ -5148,7 +5289,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 трек успішно завантажено} other{{count} треки успішно завантажено}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -5157,7 +5298,7 @@ } } }, - "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "notifDownloadsFinishedBody": "{completed, plural, =1{завантажено 1 трек} other{{completed} завантажені треки}}, {failed, plural, =1{1 помилка} other{{failed} помилка}}", "@notifDownloadsFinishedBody": { "description": "Notification body when queue finishes with failures", "placeholders": { @@ -5169,11 +5310,11 @@ } } }, - "notifDownloadsCanceledTitle": "Downloads canceled", + "notifDownloadsCanceledTitle": "Завантаження скасовано", "@notifDownloadsCanceledTitle": { "description": "Notification title when downloads are canceled by the user" }, - "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "notifDownloadsCanceledBody": "{count, plural, =1{1 завантаження скасовано} other{{count} завантаження скасовано}}", "@notifDownloadsCanceledBody": { "description": "Notification body when downloads are canceled by the user", "placeholders": { @@ -5201,7 +5342,7 @@ } } }, - "notifLibraryScanProgressNoTotal": "{scanned} файлів скановано • {percentage}%", + "notifLibraryScanProgressNoTotal": "{scanned} Файлів скановано • {percentage}%", "@notifLibraryScanProgressNoTotal": { "description": "Notification body for library scan progress when total is unknown", "placeholders": { @@ -5217,7 +5358,7 @@ "@notifLibraryScanComplete": { "description": "Notification title when library scan finishes" }, - "notifLibraryScanCompleteBody": "{count} треків індексовано", + "notifLibraryScanCompleteBody": "{count} Треків індексовано", "@notifLibraryScanCompleteBody": { "description": "Notification body for library scan complete - number of indexed tracks", "placeholders": { @@ -5226,7 +5367,7 @@ } } }, - "notifLibraryScanExcluded": "{count} виключені", + "notifLibraryScanExcluded": "{count} Виключені", "@notifLibraryScanExcluded": { "description": "Library scan complete suffix - excluded track count", "placeholders": { @@ -5235,7 +5376,7 @@ } } }, - "notifLibraryScanErrors": "{count} помилок", + "notifLibraryScanErrors": "{count} Помилок", "@notifLibraryScanErrors": { "description": "Library scan complete suffix - error count", "placeholders": { @@ -5256,7 +5397,20 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, - "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "notifLibraryScanPaused": "Сканування бібліотеки призупинено", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} Файли проскановано. Відновіть роботу в налаштуваннях локальної бібліотеки, щоб продовжити з цього місця.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifDownloadingUpdate": "Завантаження SpotiFLAC v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", "placeholders": { @@ -5284,7 +5438,7 @@ "@notifUpdateReady": { "description": "Notification title when app update download is complete" }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "notifUpdateReadyBody": "SpotiFLAC v{version} завантажена. Натисніть щоб установити.", "@notifUpdateReadyBody": { "description": "Notification body when app update is ready to install", "placeholders": { @@ -5301,15 +5455,15 @@ "@notifUpdateFailedBody": { "description": "Notification body when app update download fails" }, - "searchTracks": "Tracks", + "searchTracks": "Треки", "@searchTracks": { "description": "Search filter label - tracks" }, - "homeSearchHintDefault": "Paste supported URL or search...", + "homeSearchHintDefault": "Вставте підтримувану URL-адресу або виконайте пошук...", "@homeSearchHintDefault": { "description": "Default placeholder for the main search field on Home" }, - "homeSearchHintProvider": "Search with {providerName}...", + "homeSearchHintProvider": "Пошук за допомогою{providerName}...", "@homeSearchHintProvider": { "description": "Placeholder for the main search field when a provider is selected", "placeholders": { @@ -5318,135 +5472,135 @@ } } }, - "homeImportCsvTooltip": "Import playlist (CSV, M3U)", + "homeImportCsvTooltip": "Імпортувати список відтворення (CSV, M3U)", "@homeImportCsvTooltip": { "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, - "homeChangeSearchProviderTooltip": "Change search provider", + "homeChangeSearchProviderTooltip": "Змінити пошукову систему", "@homeChangeSearchProviderTooltip": { "description": "Tooltip for the Home search provider picker" }, - "actionPaste": "Paste", + "actionPaste": "Вставити", "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "tutorialSearchHint": "Paste or search...", + "tutorialSearchHint": "Вставити або шукати...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" }, - "tutorialDownloadCompletedSemantics": "Download completed", + "tutorialDownloadCompletedSemantics": "Завантаження завершено", "@tutorialDownloadCompletedSemantics": { "description": "Accessibility label for completed download state in tutorial demo" }, - "tutorialDownloadInProgressSemantics": "Download in progress", + "tutorialDownloadInProgressSemantics": "Завантаження триває", "@tutorialDownloadInProgressSemantics": { "description": "Accessibility label for active download state in tutorial demo" }, - "tutorialStartDownloadSemantics": "Start download", + "tutorialStartDownloadSemantics": "Почати завантаження", "@tutorialStartDownloadSemantics": { "description": "Accessibility label for idle download button in tutorial demo" }, - "optionsEmbedMetadata": "Embed Metadata", + "optionsEmbedMetadata": "Вбудувати метадані", "@optionsEmbedMetadata": { "description": "Settings toggle title for writing metadata into downloaded files" }, - "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "optionsEmbedMetadataSubtitleOn": "Записуйте метадані, обкладинки та вбудовані тексти пісень у файли", "@optionsEmbedMetadataSubtitleOn": { "description": "Subtitle when metadata embedding is enabled" }, - "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "optionsEmbedMetadataSubtitleOff": "Вимкнено (розширений режим): пропустити вбудовування всіх метаданих", "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "trackCoverNoEmbeddedArt": "No embedded album art found", + "trackCoverNoEmbeddedArt": "Вбудованих обкладинок альбому не знайдено", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" }, - "trackCoverReplace": "Replace Cover", + "trackCoverReplace": "Змінити обкладинку", "@trackCoverReplace": { "description": "Button label for replacing selected cover art" }, - "trackCoverPick": "Pick Cover", + "trackCoverPick": "Виберіть обкладинку", "@trackCoverPick": { "description": "Button label for selecting cover art" }, - "trackCoverClearSelected": "Clear selected cover", + "trackCoverClearSelected": "Очистити вибрану обкладинку", "@trackCoverClearSelected": { "description": "Tooltip for clearing the newly selected cover art" }, - "trackCoverCurrent": "Current cover", + "trackCoverCurrent": "Поточна обкладинка", "@trackCoverCurrent": { "description": "Label for the currently embedded cover preview" }, - "trackCoverSelected": "Selected cover", + "trackCoverSelected": "Вибрана обкладинка", "@trackCoverSelected": { "description": "Label for the newly selected cover preview" }, - "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "trackCoverReplaceNotice": "Вибрана обкладинка замінить поточну вбудовану обкладинку, коли ви натиснете «Зберегти».", "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, - "trackCoverResolution": "Cover resolution", + "trackCoverResolution": "Розмір обкладинки", "@trackCoverResolution": { "description": "Label for selecting the embedded cover art resolution" }, - "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "trackCoverResolutionHint": "Визначає розмір найдовшого краю під час збереження. Збільшення не додає зображенню деталей.", "@trackCoverResolutionHint": { "description": "Explanation below the embedded cover art resolution selector" }, - "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "trackCoverResizeFailed": "Не вдалося змінити розмір зображення обкладинки. Будь ласка, спробуйте інший розмір або зображення.", "@trackCoverResizeFailed": { "description": "Error shown when resizing cover art before saving metadata fails" }, - "actionStop": "Stop", + "actionStop": "Стоп", "@actionStop": { "description": "Generic action - stop" }, - "queueFinalizingDownload": "Finalizing download", + "queueFinalizingDownload": "Завершення завантаження", "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, - "queueDownloadNext": "Download next", + "queueDownloadNext": "Наступне завантаження", "@queueDownloadNext": { "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" }, - "queueMoveUp": "Move up", + "queueMoveUp": "Перемістити вверх", "@queueMoveUp": { "description": "Queue item menu action - move the queued item one position earlier" }, - "queueMoveDown": "Move down", + "queueMoveDown": "Перемістити вниз", "@queueMoveDown": { "description": "Queue item menu action - move the queued item one position later" }, - "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "editMetadataMusicBrainzButton": "Отримати з MusicBrainz", "@editMetadataMusicBrainzButton": { "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" }, - "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "editMetadataMusicBrainzFilled": "Оновлено з MusicBrainz", "@editMetadataMusicBrainzFilled": { "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" }, - "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "editMetadataMusicBrainzNothing": "На MusicBrainz нічого не знайдено", "@editMetadataMusicBrainzNothing": { "description": "Snackbar when the MusicBrainz lookup returns no data" }, - "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "editMetadataMusicBrainzNeedsIsrc": "Потребує коду ISRC", "@editMetadataMusicBrainzNeedsIsrc": { "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" }, - "nowPlayingRepeatOff": "Repeat off", + "nowPlayingRepeatOff": "Повторення вимкнено", "@nowPlayingRepeatOff": { "description": "Repeat toggle tooltip when repeat is disabled" }, - "nowPlayingRepeatAll": "Repeat all", + "nowPlayingRepeatAll": "Повторити все", "@nowPlayingRepeatAll": { "description": "Repeat toggle tooltip when the whole queue repeats" }, - "nowPlayingRepeatOne": "Repeat one", + "nowPlayingRepeatOne": "Повторити один", "@nowPlayingRepeatOne": { "description": "Repeat toggle tooltip when the current track repeats" }, - "queueNetworkFailedOffline": "{count} downloads failed while offline", + "queueNetworkFailedOffline": "{count} Завантаження не вдалося виконати в режимі офлайн", "@queueNetworkFailedOffline": { "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", "placeholders": { @@ -5455,27 +5609,27 @@ } } }, - "queueDownloadedFileMissing": "Downloaded file missing", + "queueDownloadedFileMissing": "Завантажений файл відсутній", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" }, - "queueCheckingDownloadedFile": "Checking downloaded file...", + "queueCheckingDownloadedFile": "Перевірка завантаженого файлу...", "@queueCheckingDownloadedFile": { "description": "Accessibility label while the app checks whether a just-completed download has appeared at its final path yet. Not about authentication or a download session." }, - "queueDownloadCompleted": "Download completed", + "queueDownloadCompleted": "Завантаження завершено", "@queueDownloadCompleted": { "description": "Accessibility label for completed download state in queue" }, - "queueRateLimitTitle": "Service rate limited", + "queueRateLimitTitle": "Обмежено частоту запитів до служби", "@queueRateLimitTitle": { "description": "Title shown on a failed queue item when the download service rate limits requests" }, - "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "queueRateLimitMessage": "Цей трек усе ще може бути доступним. Зачекайте кілька хвилин, зменште кількість одночасних завантажень і спробуйте знову.", "@queueRateLimitMessage": { "description": "Explanation shown on a failed queue item when the download service rate limits requests" }, - "appearanceSelectAccentColor": "Select accent color {hex}", + "appearanceSelectAccentColor": "Виберіть акцентний колір {hex}", "@appearanceSelectAccentColor": { "description": "Accessibility label for picking an accent color", "placeholders": { @@ -5484,75 +5638,75 @@ } } }, - "logAutoScrollOn": "Auto-scroll ON", + "logAutoScrollOn": "Автопрокручування увімкнено", "@logAutoScrollOn": { "description": "Tooltip when auto-scroll is enabled on the log screen" }, - "logAutoScrollOff": "Auto-scroll OFF", + "logAutoScrollOff": "Автопрокручування вимкнено", "@logAutoScrollOff": { "description": "Tooltip when auto-scroll is disabled on the log screen" }, - "logCopyLogs": "Copy logs", + "logCopyLogs": "Копіювати журнали", "@logCopyLogs": { "description": "Tooltip for copying logs" }, - "logClearSearch": "Clear search", + "logClearSearch": "Очистити пошук", "@logClearSearch": { "description": "Tooltip for clearing the log search field" }, - "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "logIssueIspBlockingLabel": "Блокування з боку інтернет-провайдера", "@logIssueIspBlockingLabel": { "description": "Diagnostic badge label when ISP blocking is detected" }, - "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "logIssueIspBlockingDescription": "Ваш інтернет-провайдер може блокувати доступ до сервісів завантаження", "@logIssueIspBlockingDescription": { "description": "Diagnostic badge description for ISP blocking" }, - "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "logIssueIspBlockingSuggestion": "Спробуйте скористатися VPN або змінити DNS на 1.1.1.1 чи 8.8.8.8", "@logIssueIspBlockingSuggestion": { "description": "Diagnostic badge suggestion for ISP blocking" }, - "logIssueRateLimitedLabel": "RATE LIMITED", + "logIssueRateLimitedLabel": "Перевищено ліміт запитів", "@logIssueRateLimitedLabel": { "description": "Diagnostic badge label when the service rate limits requests" }, - "logIssueRateLimitedDescription": "Too many requests to the service", + "logIssueRateLimitedDescription": "Забагато запитів до служби", "@logIssueRateLimitedDescription": { "description": "Diagnostic badge description for rate limiting" }, - "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "logIssueRateLimitedSuggestion": "Зачекайте кілька хвилин, перш ніж спробувати знову", "@logIssueRateLimitedSuggestion": { "description": "Diagnostic badge suggestion for rate limiting" }, - "logIssueNetworkErrorLabel": "NETWORK ERROR", + "logIssueNetworkErrorLabel": "ПОМИЛКА МЕРЕЖІ", "@logIssueNetworkErrorLabel": { "description": "Diagnostic badge label for generic network errors" }, - "logIssueNetworkErrorDescription": "Connection issues detected", + "logIssueNetworkErrorDescription": "Виявлено проблеми зі з’єднанням", "@logIssueNetworkErrorDescription": { "description": "Diagnostic badge description for generic network errors" }, - "logIssueNetworkErrorSuggestion": "Check your internet connection", + "logIssueNetworkErrorSuggestion": "Перевірте підключення до Інтернету", "@logIssueNetworkErrorSuggestion": { "description": "Diagnostic badge suggestion for generic network errors" }, - "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "logIssueTrackNotFoundLabel": "ТРЕК НЕ ЗНАЙДЕНО", "@logIssueTrackNotFoundLabel": { "description": "Diagnostic badge label when a track is unavailable" }, - "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "logIssueTrackNotFoundDescription": "Деякі треки не вдалося знайти на сервісах для завантаження", "@logIssueTrackNotFoundDescription": { "description": "Diagnostic badge description when a track is unavailable" }, - "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "logIssueTrackNotFoundSuggestion": "Трек може бути недоступний у якості lossless", "@logIssueTrackNotFoundSuggestion": { "description": "Diagnostic badge suggestion when a track is unavailable" }, - "clickableLookingUpArtist": "Looking up artist...", + "clickableLookingUpArtist": "Пошук виконавця...", "@clickableLookingUpArtist": { "description": "Snackbar shown while clickable artist metadata is being resolved" }, - "clickableInformationUnavailable": "{type} information not available", + "clickableInformationUnavailable": "Інформація {type} недоступна", "@clickableInformationUnavailable": { "description": "Snackbar shown when clickable metadata cannot open a destination", "placeholders": { @@ -5561,27 +5715,27 @@ } } }, - "extensionDetailsTags": "Tags", + "extensionDetailsTags": "Теги", "@extensionDetailsTags": { "description": "Section title for extension tags" }, - "extensionDetailsInformation": "Information", + "extensionDetailsInformation": "Інформація", "@extensionDetailsInformation": { "description": "Section title for extension metadata information" }, - "extensionUtilityFunctions": "Utility Functions", + "extensionUtilityFunctions": "Функції Утиліти", "@extensionUtilityFunctions": { "description": "Capability label for utility-only extensions" }, - "actionDismiss": "Dismiss", + "actionDismiss": "Відхилити", "@actionDismiss": { "description": "Generic action - dismiss" }, - "setupChangeFolderTooltip": "Change folder", + "setupChangeFolderTooltip": "Змінити теку", "@setupChangeFolderTooltip": { "description": "Tooltip for editing the selected download folder" }, - "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "a11yOpenTrackByArtist": "Відтворити {trackName} від {artistName}", "@a11yOpenTrackByArtist": { "description": "Accessibility label for opening a track item", "placeholders": { @@ -5593,7 +5747,7 @@ } } }, - "a11yOpenItem": "Open {itemType} {name}", + "a11yOpenItem": "Відтворити {itemType} {name}", "@a11yOpenItem": { "description": "Accessibility label for opening a generic item", "placeholders": { @@ -5605,7 +5759,7 @@ } } }, - "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "a11yOpenItemCount": "Відтворити {title}, {count} {count, plural, =1{item} other{items}}", "@a11yOpenItemCount": { "description": "Accessibility label for opening a grouped item with count", "placeholders": { @@ -5617,7 +5771,7 @@ } } }, - "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "a11yOpenAlbumByArtistTrackCount": "Відкрити альбом {albumName} по {artistName}, {trackCount} треків", "@a11yOpenAlbumByArtistTrackCount": { "description": "Accessibility label for opening an album item with track count", "placeholders": { @@ -5632,7 +5786,7 @@ } } }, - "a11yTrackByArtist": "{trackName} by {artistName}", + "a11yTrackByArtist": "{trackName} Від {artistName}", "@a11yTrackByArtist": { "description": "Accessibility label for a queue or list track item", "placeholders": { @@ -5644,7 +5798,7 @@ } } }, - "a11ySelectAlbum": "Select album {albumName}", + "a11ySelectAlbum": "Вибрати альбом {albumName}", "@a11ySelectAlbum": { "description": "Accessibility label for selecting an album", "placeholders": { @@ -5653,7 +5807,7 @@ } } }, - "a11yOpenAlbum": "Open album {albumName}", + "a11yOpenAlbum": "Відкрити альбом {albumName}", "@a11yOpenAlbum": { "description": "Accessibility label for opening an album", "placeholders": { @@ -5662,171 +5816,171 @@ } } }, - "settingsFiles": "Files & Folders", + "settingsFiles": "Файли та теки", "@settingsFiles": { "description": "Settings menu item - file and folder settings" }, - "settingsFilesSubtitle": "Download location, filename, folder structure", + "settingsFilesSubtitle": "Місце завантаження, ім'я файлу, структура тек", "@settingsFilesSubtitle": { "description": "Subtitle for files & folders settings" }, - "settingsMetadata": "Metadata", + "settingsMetadata": "Метадані", "@settingsMetadata": { "description": "Settings menu item - metadata settings" }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "settingsMetadataSubtitle": "Обкладинка, теги, вирівнювання гучності, провайдери", "@settingsMetadataSubtitle": { "description": "Subtitle for metadata settings" }, - "settingsLyrics": "Lyrics", + "settingsLyrics": "Тексти пісень", "@settingsLyrics": { "description": "Settings menu item - lyrics settings" }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "settingsLyricsSubtitle": "Вбудовувати, режим, провайдери, параметри мови", "@settingsLyricsSubtitle": { "description": "Subtitle for lyrics settings" }, - "settingsApp": "App", + "settingsApp": "Застосунок", "@settingsApp": { "description": "Settings menu item - app settings" }, - "settingsAppSubtitle": "Updates, data, extension repo, debug", + "settingsAppSubtitle": "Оновлення, дані, репозиторій розширень, налагодження", "@settingsAppSubtitle": { "description": "Subtitle for app settings" }, - "sectionMetadataProviders": "Providers", + "sectionMetadataProviders": "Провайдери", "@sectionMetadataProviders": { "description": "Settings section header for metadata providers" }, - "sectionDuplicates": "Duplicates", + "sectionDuplicates": "Дублікати", "@sectionDuplicates": { "description": "Settings section header for deduplication" }, - "sectionLyricsProviderOptions": "Provider Options", + "sectionLyricsProviderOptions": "Параметри провайдера", "@sectionLyricsProviderOptions": { "description": "Settings section header for per-provider lyrics options" }, - "metadataProvidersTitle": "Metadata Provider Priority", + "metadataProvidersTitle": "Пріоритет провайдера метаданих", "@metadataProvidersTitle": { "description": "Settings item title for metadata provider order" }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "metadataProvidersSubtitle": "Встановити порядок пошуку та джерел метаданих", "@metadataProvidersSubtitle": { "description": "Subtitle for metadata provider priority item" }, - "downloadDeduplication": "Skip Duplicate Downloads", + "downloadDeduplication": "Пропустити повторення завантажень", "@downloadDeduplication": { "description": "Setting - skip tracks already in download history" }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "downloadDeduplicationEnabled": "Вже завантажені треки буде пропущено", "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, - "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "downloadDeduplicationWithQualityVariants": "Наявні файли з вибраною якістю буде пропущено", "@downloadDeduplicationWithQualityVariants": { "description": "Deduplication subtitle when separate quality versions are allowed" }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", + "downloadDeduplicationDisabled": "Усі треки буде завантажено незалежно від історії", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, - "downloadQualityVariants": "Allow different quality versions", + "downloadQualityVariants": "Дозволити версії різної якості", "@downloadQualityVariants": { "description": "Setting to retain multiple quality versions of the same track" }, - "downloadQualityVariantsDescription": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "downloadQualityVariantsDescription": "Зберігайте всі якісні версії; додавайте показник якості до імені файлу лише тоді, коли таке ім’я вже використовується", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, - "trackOptionDownloadQualityVariant": "Download another quality", + "trackOptionDownloadQualityVariant": "Завантажити іншу якість", "@trackOptionDownloadQualityVariant": { "description": "Track menu action to download another quality version" }, - "downloadFallbackExtensions": "Fallback Extensions", + "downloadFallbackExtensions": "Резервні розширення", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" }, - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "downloadFallbackExtensionsSubtitle": "Виберіть, які розширення можна використовувати як резервний варіант", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" }, - "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "editMetadataFieldDateHint": "YYYY-MM-DD або YYYY", "@editMetadataFieldDateHint": { "description": "Hint text for the edit metadata date field" }, - "editMetadataFieldTrackTotal": "Track Total", + "editMetadataFieldTrackTotal": "Загальна кількість треків", "@editMetadataFieldTrackTotal": { "description": "Label for total tracks field in the edit metadata sheet" }, - "editMetadataFieldDiscTotal": "Disc Total", + "editMetadataFieldDiscTotal": "Загальна кількість дисків", "@editMetadataFieldDiscTotal": { "description": "Label for total discs field in the edit metadata sheet" }, - "editMetadataFieldComposer": "Composer", + "editMetadataFieldComposer": "Композитор", "@editMetadataFieldComposer": { "description": "Label for composer field in the edit metadata sheet" }, - "editMetadataFieldComment": "Comment", + "editMetadataFieldComment": "Коментар", "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, - "trackAlbumType": "Release Type", + "trackAlbumType": "Тип релізу", "@trackAlbumType": { "description": "Label for an album or release type metadata value" }, - "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "editMetadataFieldAlbumTypeHint": "Альбом, сингл, мініальбом, добірка...", "@editMetadataFieldAlbumTypeHint": { "description": "Hint for the release type metadata field" }, - "editMetadataFieldExplicit": "Explicit", + "editMetadataFieldExplicit": "Для дорослих", "@editMetadataFieldExplicit": { "description": "Label for the explicit content metadata field" }, - "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "editMetadataFieldExplicitHint": "Позначити цей трек як такий, що містить контент для дорослих", "@editMetadataFieldExplicitHint": { "description": "Description for the explicit content metadata switch" }, - "metadataExplicitValue": "Explicit", + "metadataExplicitValue": "Для дорослих", "@metadataExplicitValue": { "description": "Displayed value when a track is marked explicit" }, - "editMetadataFieldUpc": "UPC / Barcode", + "editMetadataFieldUpc": "UPC / Штрихкод", "@editMetadataFieldUpc": { "description": "Label for the release barcode metadata field" }, - "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "editMetadataFieldUpcHint": "Числовий код UPC, EAN або GTIN", "@editMetadataFieldUpcHint": { "description": "Hint for the release barcode metadata field" }, - "editMetadataAdvanced": "Advanced", + "editMetadataAdvanced": "Додатково", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" }, - "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "libraryFilterMetadataMissingTrackNumber": "Відсутній номер треку", "@libraryFilterMetadataMissingTrackNumber": { "description": "Filter option - items missing track number" }, - "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "libraryFilterMetadataMissingDiscNumber": "Відсутній номер диску", "@libraryFilterMetadataMissingDiscNumber": { "description": "Filter option - items missing disc number" }, - "libraryFilterMetadataMissingArtist": "Missing artist", + "libraryFilterMetadataMissingArtist": "Відсутній виконавець", "@libraryFilterMetadataMissingArtist": { "description": "Filter option - items missing artist" }, - "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "libraryFilterMetadataIncorrectIsrcFormat": "Неправильний формат ISRC", "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, - "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "libraryFilterMetadataMissingIsrc": "Відсутній код ISRC", "@libraryFilterMetadataMissingIsrc": { "description": "Filter option - items without any ISRC tag" }, - "libraryFilterMetadataMissingLabel": "Missing label", + "libraryFilterMetadataMissingLabel": "Відсутній ярлик", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" }, - "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "collectionDeletePlaylistsMessage": "Видалити {count} {count, plural, =1{список треків} other{списки треків}}?", "@collectionDeletePlaylistsMessage": { "description": "Confirmation message for deleting selected playlists", "placeholders": { @@ -5835,7 +5989,7 @@ } } }, - "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "collectionPlaylistsDeleted": "{count} {count, plural, =1{список треків} other{списки треків}} видалити", "@collectionPlaylistsDeleted": { "description": "Snackbar after deleting selected playlists", "placeholders": { @@ -5844,7 +5998,7 @@ } } }, - "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "collectionAddedTracksToPlaylist": "Додано {count} {count, plural, =1{трек} other{треків}} до {playlistName}", "@collectionAddedTracksToPlaylist": { "description": "Snackbar after adding multiple tracks to a playlist", "placeholders": { @@ -5856,7 +6010,7 @@ } } }, - "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "collectionAddedTracksToPlaylistWithExisting": "Додано {count} {count, plural, =1{трек} other{треків}} до {playlistName} ({alreadyCount} вже є у списку відтворення)", "@collectionAddedTracksToPlaylistWithExisting": { "description": "Snackbar after adding multiple tracks to a playlist when some were already present", "placeholders": { @@ -5871,7 +6025,7 @@ } } }, - "itemCount": "{count} {count, plural, =1{item} other{items}}", + "itemCount": "{count} {count, plural, =1{елемент} other{елементи}}", "@itemCount": { "description": "Generic item count label", "placeholders": { @@ -5880,7 +6034,7 @@ } } }, - "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "trackReEnrichSuccessWithFailures": "Метадані успішно збагачені ({successCount}/{total}) - Помилка: {failedCount}", "@trackReEnrichSuccessWithFailures": { "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", "placeholders": { @@ -5895,7 +6049,7 @@ } } }, - "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "selectionDeleteTracksCount": "Видалити {count} {count, plural, =1{трек} other{треків}}", "@selectionDeleteTracksCount": { "description": "Button label for deleting selected tracks", "placeholders": { @@ -5904,7 +6058,7 @@ } } }, - "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "queueDownloadSpeedStatus": "Завантаження - {speed} MB/s", "@queueDownloadSpeedStatus": { "description": "Queue status while downloading with speed", "placeholders": { @@ -5913,27 +6067,27 @@ } } }, - "queueDownloadStarting": "Starting...", - "queueCheckingDownloadSession": "Checking download session...", - "queueResolvingDownloadMetadata": "Resolving track metadata...", - "queueResolvingDownloadStream": "Preparing audio stream...", - "queueWaitingForVerification": "Waiting for verification...", - "queueResumingAfterVerification": "Resuming after verification...", + "queueDownloadStarting": "Запуск...", + "queueCheckingDownloadSession": "Перевірка сеансу завантаження...", + "queueResolvingDownloadMetadata": "Визначення метаданих треку...", + "queueResolvingDownloadStream": "Підготовка аудіопотоку...", + "queueWaitingForVerification": "Очікування перевірки...", + "queueResumingAfterVerification": "Відновлення після перевірки...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, "@queueCheckingDownloadSession": { "description": "Queue status while the download provider's session is being checked during preparation (preparationStage 'checking_session'). This is about the provider session, not about locating a finished file." }, - "a11ySelectTrack": "Select track", + "a11ySelectTrack": "Вибрати трек", "@a11ySelectTrack": { "description": "Accessibility label for selecting a track" }, - "a11yDeselectTrack": "Deselect track", + "a11yDeselectTrack": "Скасувати вибір треку", "@a11yDeselectTrack": { "description": "Accessibility label for deselecting a track" }, - "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "a11yPlayTrackByArtist": "Відтворити {trackName} від {artistName}", "@a11yPlayTrackByArtist": { "description": "Accessibility label for playing a local library track", "placeholders": { @@ -5945,7 +6099,7 @@ } } }, - "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "storeExtensionsCount": "{count} {count, plural, =1{розширення} other{розширень}}", "@storeExtensionsCount": { "description": "Store extension result count", "placeholders": { @@ -5954,7 +6108,7 @@ } } }, - "storeRequiresVersion": "Requires v{version}+", + "storeRequiresVersion": "Потрібна версія v{version} або новіша", "@storeRequiresVersion": { "description": "Store compatibility badge for minimum app version", "placeholders": { @@ -5963,15 +6117,15 @@ } } }, - "actionGo": "Go", + "actionGo": "Вперед", "@actionGo": { "description": "Generic action button label" }, - "logIssueSummary": "Issue Summary", + "logIssueSummary": "Короткий опис", "@logIssueSummary": { "description": "Header for log issue analysis summary" }, - "logTotalErrors": "Total errors: {count}", + "logTotalErrors": "Загальна кількість помилок: {count}", "@logTotalErrors": { "description": "Total error count in log issue analysis", "placeholders": { @@ -5980,7 +6134,7 @@ } } }, - "logAffectedDomains": "Affected: {domains}", + "logAffectedDomains": "Змінені домени: {domains}", "@logAffectedDomains": { "description": "Affected domains in log issue analysis", "placeholders": { @@ -5989,15 +6143,15 @@ } } }, - "libraryScanCancelled": "Scan cancelled", + "libraryScanCancelled": "Сканування скасовано", "@libraryScanCancelled": { "description": "Library scan status when a scan was cancelled" }, - "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "libraryScanCancelledSubtitle": "Ви можете повторити сканування, коли будете готові.", "@libraryScanCancelledSubtitle": { "description": "Library scan status subtitle after cancellation" }, - "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "libraryDownloadsHistoryExcluded": "{count} З історії завантажень (виключено зі списку)", "@libraryDownloadsHistoryExcluded": { "description": "Library count note for downloaded history items excluded from the local list", "placeholders": { @@ -6006,23 +6160,23 @@ } } }, - "downloadNativeWorker": "Native download worker", + "downloadNativeWorker": "Вбудований фоновий процес завантаження", "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "downloadNativeWorkerSubtitle": "Фонова служба Android для завантаження розширень", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "extensionServiceStatus": "Service Status", + "extensionServiceStatus": "Статус служби", "@extensionServiceStatus": { "description": "Extension detail section header for service status" }, - "extensionServiceHealth": "Service health", + "extensionServiceHealth": "Стан служби", "@extensionServiceHealth": { "description": "Extension capability label for service health checks" }, - "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "extensionHealthChecksConfigured": "{count} {count, plural, =1{перевірка} other{перевірок}} налаштований", "@extensionHealthChecksConfigured": { "description": "Extension service health check count", "placeholders": { @@ -6031,11 +6185,11 @@ } } }, - "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "extensionOauthConnectHint": "Натисніть «Під'єднатися до Spotify», щоб заповнити це поле.", "@extensionOauthConnectHint": { "description": "Hint for an OAuth login link field before connecting Spotify" }, - "extensionLastChecked": "Last checked {time}", + "extensionLastChecked": "Востаннє перевірено {time}", "@extensionLastChecked": { "description": "Timestamp for the latest extension service health check", "placeholders": { @@ -6044,23 +6198,23 @@ } } }, - "extensionRefreshStatus": "Refresh status", + "extensionRefreshStatus": "Оновити статус", "@extensionRefreshStatus": { "description": "Tooltip for refreshing extension service health status" }, - "extensionCustomUrlHandling": "Custom URL Handling", + "extensionCustomUrlHandling": "Обробка спеціальних URL-адрес", "@extensionCustomUrlHandling": { "description": "Extension detail section title for custom URL handling" }, - "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "extensionCustomUrlHandlingSubtitle": "Це розширення може обробляти посилання з цих сайтів", "@extensionCustomUrlHandlingSubtitle": { "description": "Extension detail subtitle for custom URL handling" }, - "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "extensionCustomUrlHandlingShareHint": "Поділіться посиланнями з цих сайтів із SpotiFLAC Mobile, і це розширення їх обробить.", "@extensionCustomUrlHandlingShareHint": { "description": "Extension detail hint explaining share-to-app URL handling" }, - "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "extensionSettingsCount": "{count} {count, plural, =1{налаштування} other{налаштувань}}", "@extensionSettingsCount": { "description": "Count of settings exposed by an extension quality option", "placeholders": { @@ -6069,67 +6223,67 @@ } } }, - "extensionHealthOnline": "Online", + "extensionHealthOnline": "Онлайн", "@extensionHealthOnline": { "description": "Extension service health status - online" }, - "extensionHealthDegraded": "Degraded", + "extensionHealthDegraded": "Знижена робота", "@extensionHealthDegraded": { "description": "Extension service health status - degraded" }, - "extensionHealthOffline": "Offline", + "extensionHealthOffline": "Офлайн", "@extensionHealthOffline": { "description": "Extension service health status - offline" }, - "extensionHealthNotConfigured": "Not configured", + "extensionHealthNotConfigured": "Не налаштовано", "@extensionHealthNotConfigured": { "description": "Extension service health status - not configured" }, - "extensionHealthUnknown": "Unknown", + "extensionHealthUnknown": "Невідомо", "@extensionHealthUnknown": { "description": "Extension service health status - unknown" }, - "extensionHealthRequired": "required", + "extensionHealthRequired": "обов’язково", "@extensionHealthRequired": { "description": "Label for a required extension service health check" }, - "extensionSettingNotSet": "Not set", + "extensionSettingNotSet": "Не встановлено", "@extensionSettingNotSet": { "description": "Value shown when an extension setting has no value" }, - "extensionActionFailed": "Action failed", + "extensionActionFailed": "Дія не вдалася", "@extensionActionFailed": { "description": "Fallback error when an extension action fails without details" }, - "extensionEnterValue": "Enter value", + "extensionEnterValue": "Введіть значення", "@extensionEnterValue": { "description": "Hint for editing an extension setting value" }, - "extensionHealthServiceOnline": "Service online", + "extensionHealthServiceOnline": "Сервіс онлайн", "@extensionHealthServiceOnline": { "description": "Tooltip for online extension service" }, - "extensionHealthServiceDegraded": "Service degraded", + "extensionHealthServiceDegraded": "Службу відключено", "@extensionHealthServiceDegraded": { "description": "Tooltip for degraded extension service" }, - "extensionHealthServiceOffline": "Service offline", + "extensionHealthServiceOffline": "Сервіс офлайн", "@extensionHealthServiceOffline": { "description": "Tooltip for offline extension service" }, - "extensionHealthServiceUnknown": "Service status unknown", + "extensionHealthServiceUnknown": "Невідомий статус служби", "@extensionHealthServiceUnknown": { "description": "Tooltip for unknown extension service health" }, - "audioAnalysisStereo": "Stereo", + "audioAnalysisStereo": "Стерео", "@audioAnalysisStereo": { "description": "Audio channel layout label - stereo" }, - "audioAnalysisMono": "Mono", + "audioAnalysisMono": "Моно", "@audioAnalysisMono": { "description": "Audio channel layout label - mono" }, - "trackOpenInService": "Open in {serviceName}", + "trackOpenInService": "Відкрити в {serviceName}", "@trackOpenInService": { "description": "Button label to open a track in a named music service", "placeholders": { @@ -6138,55 +6292,55 @@ } } }, - "trackLyricsEmbeddedSource": "Embedded", + "trackLyricsEmbeddedSource": "Вбудовано", "@trackLyricsEmbeddedSource": { "description": "Lyrics source label for embedded lyrics" }, - "unknownAlbum": "Unknown Album", + "unknownAlbum": "Невідомий альбом", "@unknownAlbum": { "description": "Fallback album name when metadata is missing" }, - "unknownArtist": "Unknown Artist", + "unknownArtist": "Невідомий виконавець", "@unknownArtist": { "description": "Fallback artist name when metadata is missing" }, - "permissionAudio": "Audio", + "permissionAudio": "Аудіо", "@permissionAudio": { "description": "Audio permission type label" }, - "permissionStorage": "Storage", + "permissionStorage": "Пам'ять", "@permissionStorage": { "description": "Storage permission type label" }, - "permissionNotification": "Notification", + "permissionNotification": "Сповіщення", "@permissionNotification": { "description": "Notification permission type label" }, - "errorInvalidFolderSelected": "Invalid folder selected", + "errorInvalidFolderSelected": "Вибрана неправильна тека", "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "storeAnyVersion": "Any", + "storeAnyVersion": "Будь-яке", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" }, - "storeCategoryMetadata": "Metadata", + "storeCategoryMetadata": "Метадані", "@storeCategoryMetadata": { "description": "Store extension category - metadata" }, - "storeCategoryDownload": "Download", + "storeCategoryDownload": "Завантажити", "@storeCategoryDownload": { "description": "Store extension category - download" }, - "storeCategoryUtility": "Utility", + "storeCategoryUtility": "Утиліта", "@storeCategoryUtility": { "description": "Store extension category - utility" }, - "storeCategoryLyrics": "Lyrics", + "storeCategoryLyrics": "Тексти пісень", "@storeCategoryLyrics": { "description": "Store extension category - lyrics" }, - "storeCategoryIntegration": "Integration", + "storeCategoryIntegration": "Інтеграція", "@storeCategoryIntegration": { "description": "Store extension category - integration" }, @@ -6287,6 +6441,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Up next", + "nowPlayingAudioOutput": "Audio Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Get Tickets", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Open Maps", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6353,15 +6532,27 @@ "@nowPlayingTabLyrics": { "description": "Tab label for the lyrics view" }, - "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingNoLyrics": "У цьому файлі не знайдено текстів пісень", + "nowPlayingInstrumental": "Інструментальний", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Мовні параметри текстів пісень", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Приховати вимову", + "nowPlayingShowPronunciation": "Показати вимову", + "nowPlayingHideTranslation": "Приховати переклад", + "nowPlayingShowTranslation": "Показати переклад", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, - "nowPlayingLibraryEmpty": "Your library is empty", + "nowPlayingLibraryEmpty": "Ваша бібліотека порожня", "@nowPlayingLibraryEmpty": { "description": "Snackbar when shuffle library is requested but library has no tracks" }, - "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", + "nowPlayingShuffleLibraryFailed": "Не вдалося перемішати бібліотеку: {error}", "@nowPlayingShuffleLibraryFailed": { "description": "Snackbar when shuffling the library fails", "placeholders": { @@ -6370,31 +6561,31 @@ } } }, - "nowPlayingShuffleOn": "Shuffle on", + "nowPlayingShuffleOn": "Увімкнути перемішування", "@nowPlayingShuffleOn": { "description": "Tooltip when shuffle mode is enabled" }, - "nowPlayingPlayInOrder": "Play in order", + "nowPlayingPlayInOrder": "Відтворювати по черзі", "@nowPlayingPlayInOrder": { "description": "Tooltip when shuffle mode is disabled" }, - "nowPlayingShuffleLibrary": "Shuffle library", + "nowPlayingShuffleLibrary": "Перемішати бібліотеку", "@nowPlayingShuffleLibrary": { "description": "Button label to shuffle and play the entire local library" }, - "nowPlayingQueueEmpty": "Queue is empty", + "nowPlayingQueueEmpty": "Черга порожня", "@nowPlayingQueueEmpty": { "description": "Empty state when the playback queue has no items" }, - "nowPlayingNoMetadata": "No metadata available", + "nowPlayingNoMetadata": "Метадані відсутні", "@nowPlayingNoMetadata": { "description": "Empty state when track metadata cannot be loaded" }, - "announcementUnableToOpenLink": "Unable to open link. Please try again.", + "announcementUnableToOpenLink": "Не вдалося відкрити посилання. Будь ласка, спробуйте ще раз.", "@announcementUnableToOpenLink": { "description": "Snackbar shown when an announcement CTA link cannot be opened" }, - "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", + "trackConvertLosslessOutputWithCap": "Вивід Lossless з обмеженням якості {quality}", "@trackConvertLosslessOutputWithCap": { "description": "Hint shown when lossless conversion will cap bit depth or sample rate", "placeholders": { @@ -6403,7 +6594,7 @@ } } }, - "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", + "trackConvertConfirmMessageLosslessCapped": "Конвертувати з {sourceFormat} в {targetFormat} ({quality})?\n\nВихідний файл зберігається у форматі lossless, але розрядність і частота дискретизації будуть обмежені. Оригінальний файл буде видалено після конвертації.", "@trackConvertConfirmMessageLosslessCapped": { "description": "Confirmation dialog message for capped lossless conversion of a single file", "placeholders": { @@ -6418,7 +6609,7 @@ } } }, - "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", + "selectionBatchConvertConfirmMessageLosslessCapped": "Конвертувати {count} {count, plural, =1{трек} few{треки} other{треків}} у {format} ({quality})?\n\nВихідний файл зберігається у форматі lossless, але розрядність і частота дискретизації будуть обмежені. Оригінальний файл буде видалено після конвертації.", "@selectionBatchConvertConfirmMessageLosslessCapped": { "description": "Confirmation dialog message for capped lossless batch conversion", "placeholders": { @@ -6448,34 +6639,51 @@ } } }, - "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", - "@trackConvertActionLabelLossy": { - "description": "Convert button label for lossy conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } + "dialogCancel": "Скасувати", + "@dialogCancel": { + "description": "Dialog button - cancel action" }, - "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", + "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" + }, + "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": "Playing next", + "snackbarPlayingNext": "Відтворити далі", "@snackbarPlayingNext": { "description": "Snackbar when a track is inserted as the next queue item" }, - "snackbarAddedToQueueGeneric": "Added to queue", + "snackbarAddedToQueueGeneric": "Додано до черги", "@snackbarAddedToQueueGeneric": { "description": "Snackbar when a track is added to the playback queue without naming it" }, - "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", + "selectionDeletePlaylistsCount": "Видалити {count} {count, plural, =1{список треків} other{списки треків}}", "@selectionDeletePlaylistsCount": { "description": "Button label for deleting multiple selected playlists", "placeholders": { @@ -6484,31 +6692,31 @@ } } }, - "actionShuffle": "Shuffle", + "actionShuffle": "Перемішати", "@actionShuffle": { "description": "Tooltip for shuffle playback action" }, - "downloadPrimaryArtistOnlyOn": "Primary only: On", + "downloadPrimaryArtistOnlyOn": "Тільки основний: Увімкнено", "@downloadPrimaryArtistOnlyOn": { "description": "Status label when primary-artist-only folder naming is enabled" }, - "downloadPrimaryArtistOnlyOff": "Primary only: Off", + "downloadPrimaryArtistOnlyOff": "Тільки основний: Вимкнено", "@downloadPrimaryArtistOnlyOff": { "description": "Status label when primary-artist-only folder naming is disabled" }, - "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", + "downloadAlbumArtistMetadataPrimaryOnly": "Виконавець альбому: Тільки основний", "@downloadAlbumArtistMetadataPrimaryOnly": { "description": "Status label when album-artist folder filtering uses primary artist only" }, - "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", + "downloadAlbumArtistMetadataFull": "Виконавець альбому: Повністю", "@downloadAlbumArtistMetadataFull": { "description": "Status label when album-artist folder filtering uses full metadata" }, - "trackConvertOriginal": "Original", + "trackConvertOriginal": "Оригінал", "@trackConvertOriginal": { "description": "Label for keeping original bit depth or sample rate during conversion" }, - "trackConvertOriginalQuality": "Original quality", + "trackConvertOriginalQuality": "Якість оригіналу", "@trackConvertOriginalQuality": { "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" }, @@ -6516,15 +6724,15 @@ "@trackConvertLosslessSuffix": { "description": "Suffix used in converted lossless quality labels" }, - "trackConvertDithering": "Dithering", + "trackConvertDithering": "Згладжування", "@trackConvertDithering": { "description": "Section label for lossless conversion dithering options" }, - "trackConvertResampler": "Resampler", + "trackConvertResampler": "Ре семплер", "@trackConvertResampler": { "description": "Section label for lossless conversion resampler options" }, - "trackConvertDitherNone": "None", + "trackConvertDitherNone": "Нічого", "@trackConvertDitherNone": { "description": "Lossless conversion dither option with no dithering applied" }, @@ -6532,35 +6740,31 @@ "@trackConvertDitherTriangular": { "description": "Lossless conversion triangular probability density function dither option" }, - "trackConvertDitherTriangularHp": "Triangular HP", + "trackConvertDitherTriangularHp": "Одиниця вимірювання ширини модуля", "@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": "See release notes for details.", + "updateSeeReleaseNotes": "Детальнішу інформацію див. у примітках до випуску.", "@updateSeeReleaseNotes": { "description": "Fallback changelog text when release notes cannot be parsed" }, - "unknownTitle": "Unknown title", + "unknownTitle": "Невідома назва", "@unknownTitle": { "description": "Fallback track title when metadata is missing" }, - "trackPlayNext": "Play next", + "trackPlayNext": "Відтворити далі", "@trackPlayNext": { "description": "Menu action to play a track as the next queue item" }, - "trackAddToQueue": "Add to queue", + "trackAddToQueue": "Додати до черги", "@trackAddToQueue": { "description": "Menu action to add a track to the playback queue" }, - "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", + "snackbarExtensionInstalledEnable": "{extensionName} Встановлено. Увімкніть це в Налаштуваннях> Розширеннях", "@snackbarExtensionInstalledEnable": { "description": "Snackbar after installing an extension from the repo tab", "placeholders": { @@ -6569,7 +6773,7 @@ } } }, - "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", + "snackbarExtensionUpdatedVersion": "{extensionName} Оновлено до v{version}", "@snackbarExtensionUpdatedVersion": { "description": "Snackbar after updating an extension from the repo tab", "placeholders": { @@ -6581,7 +6785,7 @@ } } }, - "snackbarFailedToInstallNamed": "Failed to install {extensionName}", + "snackbarFailedToInstallNamed": "Не вдалося встановити {extensionName}", "@snackbarFailedToInstallNamed": { "description": "Snackbar when extension install fails in the repo tab", "placeholders": { @@ -6590,7 +6794,7 @@ } } }, - "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", + "snackbarFailedToUpdateNamed": "Не вдалося оновити {extensionName}", "@snackbarFailedToUpdateNamed": { "description": "Snackbar when extension update fails in the repo tab", "placeholders": { @@ -6599,91 +6803,91 @@ } } }, - "releaseTypeEp": "EP", + "releaseTypeEp": "Мініальбом", "@releaseTypeEp": { "description": "Badge label for EP releases" }, - "releaseTypeSingle": "Single", + "releaseTypeSingle": "Сингл", "@releaseTypeSingle": { "description": "Badge label for single releases" }, - "trackCoverOnline": "Online cover", + "trackCoverOnline": "Онлайн обкладинка", "@trackCoverOnline": { "description": "Label shown when metadata autofill downloaded cover art from the internet" }, - "regionCountryUS": "United States", + "regionCountryUS": "Сполучені Штати Америки", "@regionCountryUS": { "description": "Country name for SongLink region picker" }, - "regionCountryGB": "United Kingdom", + "regionCountryGB": "Великобританія", "@regionCountryGB": { "description": "Country name for SongLink region picker" }, - "regionCountryFR": "France", + "regionCountryFR": "Франція", "@regionCountryFR": { "description": "Country name for SongLink region picker" }, - "regionCountryDE": "Germany", + "regionCountryDE": "Німеччина", "@regionCountryDE": { "description": "Country name for SongLink region picker" }, - "regionCountryJP": "Japan", + "regionCountryJP": "Японія", "@regionCountryJP": { "description": "Country name for SongLink region picker" }, - "regionCountryKR": "South Korea", + "regionCountryKR": "Південна Корея", "@regionCountryKR": { "description": "Country name for SongLink region picker" }, - "regionCountryIN": "India", + "regionCountryIN": "Індія", "@regionCountryIN": { "description": "Country name for SongLink region picker" }, - "regionCountryID": "Indonesia", + "regionCountryID": "Індонезія", "@regionCountryID": { "description": "Country name for SongLink region picker" }, - "regionCountryBR": "Brazil", + "regionCountryBR": "Бразилія", "@regionCountryBR": { "description": "Country name for SongLink region picker" }, - "regionCountryMX": "Mexico", + "regionCountryMX": "Мексика", "@regionCountryMX": { "description": "Country name for SongLink region picker" }, - "regionCountryAU": "Australia", + "regionCountryAU": "Австралія", "@regionCountryAU": { "description": "Country name for SongLink region picker" }, - "regionCountryCA": "Canada", + "regionCountryCA": "Канада", "@regionCountryCA": { "description": "Country name for SongLink region picker" }, - "regionCountryXK": "Kosovo", + "regionCountryXK": "Косово", "@regionCountryXK": { "description": "Country name for SongLink region picker" }, - "extensionVerificationBrowserTitle": "Verification browser", + "extensionVerificationBrowserTitle": "Браузер для перевірки", "@extensionVerificationBrowserTitle": { "description": "Settings option title for extension verification browser preference" }, - "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", + "extensionVerificationBrowserSubtitleExternal": "Відкрити завдання у браузері за замовчуванням", "@extensionVerificationBrowserSubtitleExternal": { "description": "Subtitle when external browser is preferred for extension verification" }, - "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", + "extensionVerificationBrowserSubtitleInApp": "Відкрити завдання в додатковому браузері", "@extensionVerificationBrowserSubtitleInApp": { "description": "Subtitle when in-app browser is preferred for extension verification" }, - "extensionVerificationBrowserExternal": "External", + "extensionVerificationBrowserExternal": "Компоненти", "@extensionVerificationBrowserExternal": { "description": "Chip label for external browser verification mode" }, - "extensionVerificationBrowserInApp": "In-app", + "extensionVerificationBrowserInApp": "В додатку", "@extensionVerificationBrowserInApp": { "description": "Chip label for in-app browser verification mode" }, - "extensionVerificationUnavailable": "No verification page is available for {extension}. Retry the download to request a new challenge.", + "extensionVerificationUnavailable": "Для {extension} немає доступної сторінки перевірки. Спробуйте завантажити знову, щоб отримати новий запит на перевірку.", "@extensionVerificationUnavailable": { "description": "Shown when the app cannot retrieve a pending verification challenge", "placeholders": { @@ -6692,43 +6896,43 @@ } } }, - "extensionVerificationHelpTitleManual": "Open verification manually", + "extensionVerificationHelpTitleManual": "Відкрити перевірку вручну", "@extensionVerificationHelpTitleManual": { "description": "Dialog title when automatic browser launch for verification fails" }, - "extensionVerificationHelpTitleWaiting": "Verification still waiting", + "extensionVerificationHelpTitleWaiting": "Очікується підтвердження", "@extensionVerificationHelpTitleWaiting": { "description": "Dialog title when verification is taking longer than expected" }, - "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", + "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile не вдалося автоматично відкрити браузер. Відкрийте це посилання в браузері або скопіюйте його вручну.", "@extensionVerificationHelpMessageManual": { "description": "Dialog message when automatic browser launch for verification fails" }, - "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", + "extensionVerificationHelpMessageWaiting": "Якщо браузер не відкрився або процес перевірки завершився, але не повернув вас до SpotiFLAC Mobile, відкрийте це посилання знову або скопіюйте його вручну.", "@extensionVerificationHelpMessageWaiting": { "description": "Dialog message when verification may need manual browser help" }, - "extensionVerificationClose": "Close", + "extensionVerificationClose": "Закрити", "@extensionVerificationClose": { "description": "Button to dismiss the extension verification help dialog" }, - "extensionVerificationCopyLink": "Copy link", + "extensionVerificationCopyLink": "Скопіювати посилання", "@extensionVerificationCopyLink": { "description": "Button to copy the extension verification URL" }, - "extensionVerificationLinkCopied": "Verification link copied", + "extensionVerificationLinkCopied": "Посилання для підтвердження скопійовано", "@extensionVerificationLinkCopied": { "description": "Snackbar after copying the extension verification URL" }, - "extensionVerificationOpenBrowser": "Open browser", + "extensionVerificationOpenBrowser": "Відкрити браузер", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" }, - "settingsSearchHint": "Search settings", + "settingsSearchHint": "Пошук налаштувань", "@settingsSearchHint": { "description": "Placeholder of the search field on the Settings tab" }, - "settingsSearchNoResults": "No settings match \"{query}\"", + "settingsSearchNoResults": "Жодні налаштування не відповідають запиту «{query}»", "@settingsSearchNoResults": { "description": "Shown when a Settings search returns nothing", "placeholders": { @@ -6737,88 +6941,98 @@ } } }, - "settingsGroupInterface": "Extensions & appearance", + "settingsGroupInterface": "Розширення та зовнішній вигляд", "@settingsGroupInterface": { "description": "Settings group covering look and feel" }, - "settingsGroupContent": "Content & metadata", + "settingsGroupContent": "Вміст та метадані", "@settingsGroupContent": { "description": "Settings group covering the library, metadata and lyrics" }, - "settingsGroupDownloads": "Downloads & files", + "settingsGroupDownloads": "Завантаження та файли", "@settingsGroupDownloads": { "description": "Settings group covering download behaviour and storage" }, - "settingsGroupSystem": "System", + "settingsGroupSystem": "Система", "@settingsGroupSystem": { "description": "Settings group covering app-level data, cache and logs" }, - "settingsGroupHelp": "About & support", + "settingsGroupHelp": "Про додаток", "@settingsGroupHelp": { "description": "Settings group covering the about page and donations" }, - "libraryFilterMetadataMissingLyrics": "Missing lyrics", + "libraryFilterMetadataMissingLyrics": "Відсутній текст пісні", "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, - "trackOptionCopyTrackName": "Copy track name", + "libraryFilterMetadataMissingReplayGain": "Відсутній ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, + "trackOptionCopyTrackName": "Копіювати назву треку", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" }, - "trackOptionCopyArtist": "Copy artist", + "trackOptionCopyArtist": "Копіювати виконавця", "@trackOptionCopyArtist": { "description": "Track menu action that copies the artist name" }, - "trackOptionCopyTrackAndArtist": "Copy track and artist", + "trackOptionCopyTrackAndArtist": "Копіювання пісні та виконавця", "@trackOptionCopyTrackAndArtist": { "description": "Track menu action that copies the track title and artist" }, - "metadataCopyValue": "Copy value", + "metadataCopyValue": "Копіювати значення", "@metadataCopyValue": { "description": "Metadata menu action that copies only the selected value" }, - "metadataCopyField": "Copy field and value", + "metadataCopyField": "Копіювати поле та значення", "@metadataCopyField": { "description": "Metadata menu action that copies the selected key and value" }, - "mornyeShowTabs": "Show tabs", - "mornyeSearch": "Search", - "mornyeContinuePlaying": "Continue Playing", - "metadataCopyAll": "Copy all metadata", + "mornyeShowTabs": "Показати вкладки", + "mornyeSearch": "Пошук", + "mornyeContinuePlaying": "Продовжити відтворювання", + "metadataCopyAll": "Копіювати всі метадані", "@metadataCopyAll": { "description": "Metadata menu action that copies every visible key and value" }, - "optionsEmbeddedCoverSize": "Embedded Cover Size", + "optionsEmbeddedCoverSize": "Розмір вбудованої обкладинки", "@optionsEmbeddedCoverSize": { "description": "Metadata setting that limits downloaded artwork resolution before it is embedded" }, - "optionsEmbeddedCoverSizeDescription": "Downscale remotely downloaded cover art before embedding it. Images already within the limit are kept unchanged.", + "optionsEmbeddedCoverSizeDescription": "Зменшуйте розмір віддалено завантажених обкладинок перед їх вбудовуванням. Зображення, що вже відповідають обмеженням, залишаються без змін.", "@optionsEmbeddedCoverSizeDescription": { "description": "Description shown in the embedded cover size picker" }, - "mornyeFavorite": "Favorite", - "mornyeGoToArtist": "Go to Artist", + "mornyeFavorite": "Обране", + "mornyeGoToArtist": "Перейти до виконавця", "@mornyeFavorite": { "description": "Compact context menu action that adds a track to Loved" }, - "mornyeFavorited": "Favorited", + "mornyeFavorited": "Додано до обраного", "@mornyeFavorited": { "description": "Selected state of the compact favorite action" }, - "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", - "autoMixOn": "AutoMix on", - "autoMixOff": "AutoMix off", - "profileTitle": "Profile", - "profileSetUp": "Set up your profile", - "profileEdit": "Edit name and photo", - "backupIncludesProfile": "Includes your profile name and photo", - "profileName": "Name", - "profileNameHint": "Your name", - "profileChangePhoto": "Choose photo", - "profileRemovePhoto": "Remove photo", - "profilePhotoError": "Choose a valid image smaller than 20 MB.", - "profileSaveError": "Could not save your profile. Please try again.", - "optionsEmbeddedCoverSizeOriginal": "Original resolution", + "autoMixDescription": "Поєднуйте композиції за допомогою синхронізації ритму та зміни темпу зі збереженням висоти тону. Використовує плавний перехід crossfade, якщо синхронізація ритму неможлива.", + "autoMixOn": "Автомікс увімкнено", + "autoMixOff": "Автомікс вимкнено", + "autoplayOn": "Автовідтворення увімкнено", + "autoplayOff": "Автовідтворення вимкнено", + "autoplayFromLibrary": "Автовідтворення з вашої бібліотеки", + "profileTitle": "Профіль", + "profileSetUp": "Налаштуйте свій профіль", + "profileEdit": "Редагувати ім'я та фотографію", + "backupIncludesProfile": "Включає ім'я та фотографію вашого профілю", + "profileName": "Ім’я", + "profileNameHint": "Ваше ім'я", + "profileChangePhoto": "Вибрати фото", + "profileRemovePhoto": "Видалити фото", + "profilePhotoError": "Виберіть коректне зображення менш як 20 Mb.", + "profileSaveError": "Не вдалося зберегти ваш профіль. Будь ласка, спробуйте ще раз.", + "artistUpcomingConcerts": "Майбутні концерти", + "artistAllUpcomingConcerts": "Всі майбутні концерти", + "artistNoUpcomingConcerts": "Немає майбутніх концертів.", + "optionsEmbeddedCoverSizeOriginal": "Вихідна роздільна здатність", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" } diff --git a/lib/l10n/arb/app_zh_CN.arb b/lib/l10n/arb/app_zh_CN.arb index b57746d1..3c3a9be0 100644 --- a/lib/l10n/arb/app_zh_CN.arb +++ b/lib/l10n/arb/app_zh_CN.arb @@ -1,4 +1,31 @@ { + "settingsPlaybackSubtitle": "Player, volume, AutoMix, and audio output", + "sectionPlayer": "Player", + "sectionVolumeAndTransitions": "Volume and transitions", + "sectionAudioOutput": "Audio output", + "usbBitPerfect": "Hi-res and bit-perfect audio", + "usbBitPerfectDescription": "Preserve source precision on compatible outputs. Choose direct USB or AAudio exclusive below; otherwise Android USB output requires Android 14 or later. Applies from the next track, without AutoMix or normalization. System volume may not control direct USB.", + "usbHardwareVolume": "DAC hardware volume", + "usbVolumeWarningTitle": "Check your listening volume", + "usbVolumeWarning": "Direct USB audio can be much louder than normal playback, and phone volume buttons may not control it. Lower your DAC or amplifier volume before starting. When supported, SpotiFLAC sets the DAC to at most −40 dB on connection; this does not guarantee a safe listening level on every amplifier or headphone.", + "usbVolumeAccept": "I understand", + "usbVolumeUnavailable": "Playback is paused because this DAC has no verified hardware volume control. Lower the DAC or amplifier volume, then enable fixed-volume output if needed and select the track again.", + "usbFixedVolume": "Allow fixed-volume USB output", + "usbFixedVolumeDescription": "For DACs without a volume control accessible to the app. Keep off for USB headsets without their own volume control. Applies from the next track.", + "usbFixedVolumeWarning": "The app cannot lower the volume on this output. Audio may start at full level, and the phone volume slider will not help. Only continue after lowering the volume on your DAC or external amplifier. Do not enable this for a headset without its own volume control.", + "dapExclusive": "DAP hi-res (AAudio exclusive)", + "dapExclusiveDescription": "Use Oboe/AAudio at the track's original rate and precision for FLAC/WAV PCM. Requires Android 8.1 or later and compatible hardware. Exclusive access is checked; unavailable formats use normal playback. DSD requires the direct USB driver. Applies from the next track.", + "dapExclusiveUnavailable": "AAudio exclusive access is unavailable for this track and current output. Using normal playback. For a USB DAC, try the direct USB driver.", + "usbDirect": "Direct USB driver", + "usbDirectDescription": "Use exclusive USB audio for FLAC/WAV, DSF/DFF and WavPack DSD, with Android USB permission. Native DSD requires a recognized compatible DAC. Other PCM formats use normal playback. Applies from the next track.", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "Enable only if your DAC explicitly supports DoP. Sends DSF/DFF and WavPack DSD inside a PCM carrier when native DSD is unavailable. An incompatible device may play noise; leave off for ordinary USB headsets.", + "usbDsdUnsupported": "This DSD format or connected DAC is not supported. Playback stopped.", + "usbPermissionDenied": "USB permission was not granted. Using normal playback.", + "usbBitPerfectPending": "Waiting for the next track and a compatible USB output.", + "usbBitPerfectNoDevice": "No USB DAC connected. Using normal audio output.", + "usbBitPerfectFallback": "This device or audio format does not support bit-perfect output. Using normal playback.", + "usbBitPerfectRouteChanged": "The USB audio route changed. Playback paused; select a track to reconnect.", "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Make it\nyour own.", "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", @@ -36,6 +63,32 @@ "description": "System volume control label in the Mornye player" }, "appearanceStyle": "App Style", + "appearanceAccentRed": "Red (default)", + "appearanceAccentOrange": "Orange", + "appearanceAccentGreen": "Green", + "appearanceAccentTeal": "Teal", + "appearanceAccentBlue": "Blue", + "appearanceAccentPurple": "Purple", + "appearanceAccentPink": "Pink", + "appearanceGlassClarity": "Glass clarity", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Tinted", + "appearanceGlassClear": "Clear", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Use system font", + "appearanceUseSystemFontSubtitle": "Use your device’s default typeface for app text.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Remove ReplayGain", + "trackRemoveReplayGainSuccess": "ReplayGain tags removed", + "trackRemoveReplayGainFailed": "Failed to remove ReplayGain tags", + "replayGainRemoving": "Removing ReplayGain...", + "replayGainRemoveConfirmMessage": "Remove track and album ReplayGain tags from {count} track(s)? Audio, artwork, and other metadata will be preserved.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Remove RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain removed from {success} of {total} tracks", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "ReplayGain ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "扩展仓库", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "Lyrics Mode", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% of {total} files", "@libraryScanProgress": { "description": "Scan progress display", @@ -4910,6 +5009,61 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "Inspect the spectrum and active bit depth for signs of upsampling or padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Limited bandwidth", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No upsampling or padding detected", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Estimated cutoff", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Active / stored bits", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "A lower cutoff can come from mastering. It does not, by itself, prove upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Based on {seconds} seconds of audio. This analysis cannot certify the original master.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "The spectrum contains mirrored bands consistent with upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "A sharp roll-off near {cutoff} and the measured noise floor suggest a lower-rate source.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energy above {cutoff} is mostly steady in the analyzed segment and may be noise.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Up next", + "nowPlayingAudioOutput": "Audio Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Get Tickets", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Open Maps", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Lyrics language options", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Hide Pronunciation", + "nowPlayingShowPronunciation": "Show Pronunciation", + "nowPlayingHideTranslation": "Hide Translation", + "nowPlayingShowTranslation": "Show Translation", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copy track name", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6808,6 +7016,9 @@ "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", "autoMixOn": "AutoMix on", "autoMixOff": "AutoMix off", + "autoplayOn": "Autoplay on", + "autoplayOff": "Autoplay off", + "autoplayFromLibrary": "Autoplay from your Library", "profileTitle": "Profile", "profileSetUp": "Set up your profile", "profileEdit": "Edit name and photo", @@ -6818,6 +7029,9 @@ "profileRemovePhoto": "Remove photo", "profilePhotoError": "Choose a valid image smaller than 20 MB.", "profileSaveError": "Could not save your profile. Please try again.", + "artistUpcomingConcerts": "Upcoming Concerts", + "artistAllUpcomingConcerts": "All Upcoming Concerts", + "artistNoUpcomingConcerts": "No upcoming concerts.", "optionsEmbeddedCoverSizeOriginal": "Original resolution", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution" diff --git a/lib/l10n/arb/app_zh_TW.arb b/lib/l10n/arb/app_zh_TW.arb index c3caa317..7805f5fc 100644 --- a/lib/l10n/arb/app_zh_TW.arb +++ b/lib/l10n/arb/app_zh_TW.arb @@ -1,4 +1,31 @@ { + "settingsPlaybackSubtitle": "Player, volume, AutoMix, and audio output", + "sectionPlayer": "Player", + "sectionVolumeAndTransitions": "Volume and transitions", + "sectionAudioOutput": "Audio output", + "usbBitPerfect": "Hi-res and bit-perfect audio", + "usbBitPerfectDescription": "Preserve source precision on compatible outputs. Choose direct USB or AAudio exclusive below; otherwise Android USB output requires Android 14 or later. Applies from the next track, without AutoMix or normalization. System volume may not control direct USB.", + "usbHardwareVolume": "DAC hardware volume", + "usbVolumeWarningTitle": "Check your listening volume", + "usbVolumeWarning": "Direct USB audio can be much louder than normal playback, and phone volume buttons may not control it. Lower your DAC or amplifier volume before starting. When supported, SpotiFLAC sets the DAC to at most −40 dB on connection; this does not guarantee a safe listening level on every amplifier or headphone.", + "usbVolumeAccept": "I understand", + "usbVolumeUnavailable": "Playback is paused because this DAC has no verified hardware volume control. Lower the DAC or amplifier volume, then enable fixed-volume output if needed and select the track again.", + "usbFixedVolume": "Allow fixed-volume USB output", + "usbFixedVolumeDescription": "For DACs without a volume control accessible to the app. Keep off for USB headsets without their own volume control. Applies from the next track.", + "usbFixedVolumeWarning": "The app cannot lower the volume on this output. Audio may start at full level, and the phone volume slider will not help. Only continue after lowering the volume on your DAC or external amplifier. Do not enable this for a headset without its own volume control.", + "dapExclusive": "DAP hi-res (AAudio exclusive)", + "dapExclusiveDescription": "Use Oboe/AAudio at the track's original rate and precision for FLAC/WAV PCM. Requires Android 8.1 or later and compatible hardware. Exclusive access is checked; unavailable formats use normal playback. DSD requires the direct USB driver. Applies from the next track.", + "dapExclusiveUnavailable": "AAudio exclusive access is unavailable for this track and current output. Using normal playback. For a USB DAC, try the direct USB driver.", + "usbDirect": "Direct USB driver", + "usbDirectDescription": "Use exclusive USB audio for FLAC/WAV, DSF/DFF and WavPack DSD, with Android USB permission. Native DSD requires a recognized compatible DAC. Other PCM formats use normal playback. Applies from the next track.", + "usbDsdOverPcm": "DSD over PCM (DoP)", + "usbDsdOverPcmDescription": "Enable only if your DAC explicitly supports DoP. Sends DSF/DFF and WavPack DSD inside a PCM carrier when native DSD is unavailable. An incompatible device may play noise; leave off for ordinary USB headsets.", + "usbDsdUnsupported": "This DSD format or connected DAC is not supported. Playback stopped.", + "usbPermissionDenied": "USB permission was not granted. Using normal playback.", + "usbBitPerfectPending": "Waiting for the next track and a compatible USB output.", + "usbBitPerfectNoDevice": "No USB DAC connected. Using normal audio output.", + "usbBitPerfectFallback": "This device or audio format does not support bit-perfect output. Using normal playback.", + "usbBitPerfectRouteChanged": "The USB audio route changed. Playback paused; select a track to reconnect.", "upgradeIntroWelcome": "Welcome to\nSpotiFLAC-Mobile 5.0", "upgradeIntroThemeTitle": "Make it\nyour own.", "upgradeIntroThemeBody": "Choose a look. Your choice applies immediately, and you can change it later in Appearance.", @@ -36,6 +63,32 @@ "description": "System volume control label in the Mornye player" }, "appearanceStyle": "App Style", + "appearanceAccentRed": "Red (default)", + "appearanceAccentOrange": "Orange", + "appearanceAccentGreen": "Green", + "appearanceAccentTeal": "Teal", + "appearanceAccentBlue": "Blue", + "appearanceAccentPurple": "Purple", + "appearanceAccentPink": "Pink", + "appearanceGlassClarity": "Glass clarity", + "appearanceGlassClaritySubtitle": "Adjust transparency in Mornye menus and navigation. Text contrast is preserved.", + "appearanceGlassTinted": "Tinted", + "appearanceGlassClear": "Clear", + "appearanceGlassClarityBlurOff": "Glass is opaque on this device. Turn on “{setting}” to adjust clarity.", + "@appearanceGlassClarityBlurOff": { + "description": "Shown under the disabled glass clarity slider when the device renders Mornye glass without blur. The placeholder is the name of the force-blur toggle.", + "placeholders": { + "setting": { + "type": "String" + } + } + }, + "appearanceGlassClarityHighContrast": "Glass stays opaque while the system’s high contrast setting is on.", + "@appearanceGlassClarityHighContrast": { + "description": "Shown under the disabled glass clarity slider while the OS high contrast accessibility setting is on" + }, + "appearanceUseSystemFont": "Use system font", + "appearanceUseSystemFontSubtitle": "Use your device’s default typeface for app text.", "@appearanceStyle": { "description": "Appearance section for choosing the app visual style" }, @@ -255,6 +308,38 @@ "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, + "trackRemoveReplayGain": "Remove ReplayGain", + "trackRemoveReplayGainSuccess": "ReplayGain tags removed", + "trackRemoveReplayGainFailed": "Failed to remove ReplayGain tags", + "replayGainRemoving": "Removing ReplayGain...", + "replayGainRemoveConfirmMessage": "Remove track and album ReplayGain tags from {count} track(s)? Audio, artwork, and other metadata will be preserved.", + "@replayGainRemoveConfirmMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionRemoveReplayGainCount": "Remove RG ({count})", + "@selectionRemoveReplayGainCount": { + "description": "Compact selection action label. RG abbreviates ReplayGain; keep this short for a two-column toolbar.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainRemoveBatchSuccess": "ReplayGain removed from {success} of {total} tracks", + "@replayGainRemoveBatchSuccess": { + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "selectionReplayGainCount": "音量平衡 ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", @@ -318,6 +403,14 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, + "optionsArtistTagModePrimary": "Primary artist only", + "@optionsArtistTagModePrimary": { + "description": "Artist tag mode option that writes only the first credited artist" + }, + "optionsArtistTagModePrimarySubtitle": "Write only the first artist, like \"Artist A\", to Artist and Album Artist in every format, so players list one artist.", + "@optionsArtistTagModePrimarySubtitle": { + "description": "Subtitle for the primary-artist tag mode. Applies when downloading and re-enriching; manual edits keep what the user typed." + }, "optionsExtensionStore": "擴充資料庫", "@optionsExtensionStore": { "description": "Show/hide repo tab" @@ -1476,6 +1569,8 @@ "@sectionLyrics": { "description": "Settings section header" }, + "lyricsKeepScreenOn": "Keep screen on while viewing lyrics", + "lyricsKeepScreenOnSubtitle": "Prevent screen timeout while lyrics are open, including when playback is paused.", "lyricsMode": "Lyrics Mode", "@lyricsMode": { "description": "Setting - how to save lyrics" @@ -2757,6 +2852,10 @@ "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, + "libraryScanPaused": "Scan paused", + "@libraryScanPaused": { + "description": "Status shown while a library scan is paused by the user" + }, "libraryScanProgress": "{progress}% of {total} files", "@libraryScanProgress": { "description": "Scan progress display", @@ -4910,6 +5009,61 @@ "@hiResCheckTitle": { "description": "Title of the fake Hi-Res check card" }, + "hiResCheckSummary": "Inspect the spectrum and active bit depth for signs of upsampling or padding.", + "@hiResCheckSummary": { + "description": "Introductory text for the sampled Hi-Res analysis" + }, + "hiResCheckLimitedBandwidth": "Limited bandwidth", + "@hiResCheckLimitedBandwidth": { + "description": "Neutral finding: a limited spectrum alone does not prove upsampling" + }, + "hiResCheckNoEvidence": "No upsampling or padding detected", + "@hiResCheckNoEvidence": { + "description": "No evidence was detected; this does not certify the master" + }, + "hiResCheckEstimatedCutoff": "Estimated cutoff", + "@hiResCheckEstimatedCutoff": { + "description": "Estimated upper spectral edge at the analysis threshold" + }, + "hiResCheckActiveBits": "Active / stored bits", + "@hiResCheckActiveBits": { + "description": "Active integer bit depth versus the container depth in the sampled segment" + }, + "hiResCheckBandwidthExplanation": "A lower cutoff can come from mastering. It does not, by itself, prove upsampling.", + "@hiResCheckBandwidthExplanation": { + "description": "Explains why the limited-bandwidth finding is neutral" + }, + "hiResCheckSampledExplanation": "Based on {seconds} seconds of audio. This analysis cannot certify the original master.", + "@hiResCheckSampledExplanation": { + "description": "Limits of the sampled Hi-Res analysis; seconds is a formatted duration", + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "hiResCheckImagingEvidence": "The spectrum contains mirrored bands consistent with upsampling.", + "@hiResCheckImagingEvidence": { + "description": "Spectral imaging is suggestive evidence rather than proof" + }, + "hiResCheckRateEvidence": "A sharp roll-off near {cutoff} and the measured noise floor suggest a lower-rate source.", + "@hiResCheckRateEvidence": { + "description": "Heuristic evidence from both a brickwall and a 16-bit-like noise floor", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, + "hiResCheckSteadyEnergy": "Energy above {cutoff} is mostly steady in the analyzed segment and may be noise.", + "@hiResCheckSteadyEnergy": { + "description": "An observation about ultrasonic energy, not proof that removing it is safe", + "placeholders": { + "cutoff": { + "type": "String" + } + } + }, "hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files", "@hiResCheckDescription": { "description": "Explains what the Hi-Res authenticity check does" @@ -5256,6 +5410,19 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, + "notifLibraryScanPaused": "Library scan paused", + "@notifLibraryScanPaused": { + "description": "Notification title when the user pauses a library scan" + }, + "notifLibraryScanPausedBody": "{count} files scanned. Resume in Local Library settings to continue from here.", + "@notifLibraryScanPausedBody": { + "description": "Notification body for a paused library scan - files scanned so far", + "placeholders": { + "count": { + "type": "int" + } + } + }, "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", @@ -6287,6 +6454,31 @@ "description": "Tooltip for minimizing the now playing screen" }, "nowPlayingUpNext": "Up next", + "nowPlayingAudioOutput": "Audio Output", + "nowPlayingWrittenBy": "Written by: {writers}", + "@nowPlayingWrittenBy": { + "placeholders": { + "writers": { + "type": "String" + } + } + }, + "nowPlayingLyricsProvider": "Lyrics: {provider}", + "@nowPlayingLyricsProvider": { + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "concertGetTickets": "Get Tickets", + "concertSetList": "Concert Set List", + "concertSetListButton": "Set List", + "concertAddToCalendar": "Add to Calendar", + "concertOpenMaps": "Open Maps", + "concertDetailsUnavailable": "Concert details are currently unavailable.", + "concertCalendarUnavailable": "Unable to open the calendar.", + "nowPlayingAudioOutputUnavailable": "Unable to open audio output settings.", "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, @@ -6354,6 +6546,18 @@ "description": "Tab label for the lyrics view" }, "nowPlayingNoLyrics": "No lyrics in this file", + "nowPlayingInstrumental": "Instrumental", + "@nowPlayingInstrumental": { + "description": "Accessibility label for the three-dot countdown during an instrumental break before lyrics resume" + }, + "nowPlayingLyricsLanguageOptions": "Lyrics language options", + "@nowPlayingLyricsLanguageOptions": { + "description": "Tooltip for the player menu that shows or hides existing lyric pronunciation and translation" + }, + "nowPlayingHidePronunciation": "Hide Pronunciation", + "nowPlayingShowPronunciation": "Show Pronunciation", + "nowPlayingHideTranslation": "Hide Translation", + "nowPlayingShowTranslation": "Show Translation", "@nowPlayingNoLyrics": { "description": "Empty state when the playing file has no embedded lyrics" }, @@ -6761,6 +6965,10 @@ "@libraryFilterMetadataMissingLyrics": { "description": "Filter option for tracks without embedded or sidecar lyrics" }, + "libraryFilterMetadataMissingReplayGain": "Missing ReplayGain", + "@libraryFilterMetadataMissingReplayGain": { + "description": "Filter option for scanned tracks without ReplayGain gain tags" + }, "trackOptionCopyTrackName": "Copy track name", "@trackOptionCopyTrackName": { "description": "Track menu action that copies the track title" @@ -6808,6 +7016,9 @@ "autoMixDescription": "Blend songs with beat matching and pitch-preserving tempo adjustment. Uses crossfade when beats cannot be matched.", "autoMixOn": "AutoMix on", "autoMixOff": "AutoMix off", + "autoplayOn": "Autoplay on", + "autoplayOff": "Autoplay off", + "autoplayFromLibrary": "Autoplay from your Library", "profileTitle": "Profile", "profileSetUp": "Set up your profile", "profileEdit": "Edit name and photo", @@ -6818,6 +7029,9 @@ "profileRemovePhoto": "Remove photo", "profilePhotoError": "Choose a valid image smaller than 20 MB.", "profileSaveError": "Could not save your profile. Please try again.", + "artistUpcomingConcerts": "Upcoming Concerts", + "artistAllUpcomingConcerts": "All Upcoming Concerts", + "artistNoUpcomingConcerts": "No upcoming concerts.", "optionsEmbeddedCoverSizeOriginal": "Original resolution", "@optionsEmbeddedCoverSizeOriginal": { "description": "Option that preserves the provider artwork at its original resolution"