chore(l10n): integrate Crowdin updates from PR #551

Import the Crowdin translations while preserving current app strings. Resolve locale IDs, ICU plurals, and placeholder mismatches so generated localization APIs remain compatible.

Source: https://github.com/spotiflacapp/SpotiFLAC-Mobile/pull/551
This commit is contained in:
zarzet committed 2026-09-26 02:26:15 +07:00
1 parent 64f76293ec
commit dbbefdd75d
16 files changed
+54126 -45192

No files matched your search

+435 -103
View File
File diff suppressed because it is too large. Load diff
+6293 -5566
View File
File diff suppressed because it is too large. Load diff
+969 -242
View File
File diff suppressed because it is too large. Load diff
+6293 -5566
View File
File diff suppressed because it is too large. Load diff
+333 -1
View File
@@ -1,4 +1,48 @@
{
"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",
"@nowPlayingVolume": {
"description": "System volume control label in the Mornye player"
},
"appearanceStyle": "App Style",
"@appearanceStyle": {
"description": "Appearance section for choosing the app visual style"
},
"discordRichPresence": "Discord Rich Presence",
"discordPresenceDescription": "Share the track playing in the built-in player on Discord. Requires Discord to be installed and signed in.",
"discordPresenceMissing": "Install Discord and sign in, then turn this setting off and on again.",
"discordPresenceUnavailable": "Discord Rich Presence is unavailable in this build or on this device.",
"@@locale": "hi",
"@@last_modified": "2026-04-28",
"appName": "Dd",
@@ -57,6 +101,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",
"historySearchHint": "Search history...",
"@historySearchHint": {
"description": "Search bar placeholder in history"
@@ -237,6 +286,7 @@
"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": {
"description": "Snackbar after batch ReplayGain completes",
"placeholders": {
@@ -461,6 +511,18 @@
"@aboutSachinsenalDesc": {
"description": "Credit description for sachinsenal0x64"
},
"aboutUnituneDesc": "Open-source music link resolver by Flaze, used for cross-platform fallback matching.",
"@aboutUnituneDesc": {
"description": "Credit for the UniTune resolver"
},
"aboutMusicBrainzDesc": "Open music database maintained by MetaBrainz and its community, used for recording cross-references.",
"@aboutMusicBrainzDesc": {
"description": "Credit for the MusicBrainz database"
},
"aboutSquiglyDesc": "Universal music link service by Liam Macmillan, used as a final cross-platform resolver fallback.",
"@aboutSquiglyDesc": {
"description": "Credit for the Squigly resolver"
},
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
@@ -842,6 +904,22 @@
"@duplicatesKeepBest": {
"description": "Button that deletes all but the highest-quality copy in a duplicate group"
},
"duplicatesKeepBestAll": "Keep best for all",
"@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": {
"description": "Confirmation message for keeping the best copy across every duplicate group",
"placeholders": {
"count": {
"type": "int"
},
"groupCount": {
"type": "int"
}
}
},
"duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?",
"@duplicatesKeepBestMessage": {
"description": "Confirmation message for the keep-best action",
@@ -1564,6 +1642,22 @@
"@trackAudioQuality": {
"description": "Metadata label - audio quality"
},
"trackReplayGainTrackGain": "ReplayGain Track Gain",
"@trackReplayGainTrackGain": {
"description": "Metadata label - ReplayGain track gain"
},
"trackReplayGainTrackPeak": "ReplayGain Track Peak",
"@trackReplayGainTrackPeak": {
"description": "Metadata label - ReplayGain track peak"
},
"trackReplayGainAlbumGain": "ReplayGain Album Gain",
"@trackReplayGainAlbumGain": {
"description": "Metadata label - ReplayGain album gain"
},
"trackReplayGainAlbumPeak": "ReplayGain Album Peak",
"@trackReplayGainAlbumPeak": {
"description": "Metadata label - ReplayGain album peak"
},
"libraryQualityLabelFileFormat": "File format",
"@libraryQualityLabelFileFormat": {
"description": "Library audio quality label mode that shows the detected file format"
@@ -3176,6 +3270,10 @@
"@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": {
"description": "Subtitle for batch metadata update choices"
},
"trackReEnrichFieldCover": "Cover Art",
"@trackReEnrichFieldCover": {
"description": "Checkbox label for cover art field in re-enrich"
@@ -3228,6 +3326,22 @@
"@trackReEnrichModeReplaceSubtitle": {
"description": "Explanation for the selected-tag batch metadata mode"
},
"trackReEnrichModeManual": "Set common values",
"@trackReEnrichModeManual": {
"description": "Batch metadata mode that applies shared values to every selected track"
},
"trackReEnrichModeManualSubtitle": "Apply the same values to every selected track",
"@trackReEnrichModeManualSubtitle": {
"description": "Explanation for the manual shared-value batch metadata mode"
},
"trackReEnrichManualFieldsTitle": "Values to apply",
"@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": {
"description": "Safety explanation for manual batch metadata inputs"
},
"trackReEnrichFieldsTitle": "Tags to update",
"@trackReEnrichFieldsTitle": {
"description": "Heading above batch re-enrich field checkboxes"
@@ -3298,7 +3412,15 @@
"@trackReEnrichSearching": {
"description": "Snackbar while searching metadata from internet for local items"
},
"trackReEnrichPreparing": "Preparing metadata changes...",
"@trackReEnrichPreparing": {
"description": "Progress message while preparing manual batch metadata changes"
},
"trackReEnrichSuccess": "Metadata re-enriched successfully",
"trackReEnrichMetadataSaved": "Metadata saved",
"trackReEnrichLyricsUpdated": "Lyrics updated",
"trackReEnrichLyricsPreserved": "No new lyrics found; existing lyrics kept",
"trackReEnrichLyricsDisabled": "Lyrics not updated: lyric downloading is disabled in Settings",
"@trackReEnrichSuccess": {
"description": "Snackbar after successful re-enrichment"
},
@@ -3889,7 +4011,7 @@
"@lyricsProviderAppleMusicDesc": {
"description": "Description for Apple Music provider"
},
"lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)",
"lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, direct API)",
"@lyricsProviderQqMusicDesc": {
"description": "Description for QQ Music provider"
},
@@ -4001,6 +4123,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.",
"backupContentsSettings": "App settings",
"@backupContentsSettings": {
"description": "Backup contents row label for settings"
@@ -4164,6 +4294,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.",
"storageModeAppFolder": "App Folder (Recommended)",
"@storageModeAppFolder": {
"description": "Storage mode option - app-managed folder"
@@ -4732,6 +4866,131 @@
"@audioAnalysisRescan": {
"description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results"
},
"downloadRedownloadFakeHiRes": "Re-download fake 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": {
"description": "Setting subtitle for the fake Hi-Res re-download toggle"
},
"hiResCheckVerdictFakeCertain": "Fake 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": {
"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": {
"description": "Reason: sample-and-hold upsampling detected"
},
"hiResCheckReasonInterpolation": "In-between samples are linearly interpolated",
"@hiResCheckReasonInterpolation": {
"description": "Reason: linear-interpolation upsampling detected"
},
"hiResCheckReasonImaging": "Content above 22 kHz mirrors the audible band",
"@hiResCheckReasonImaging": {
"description": "Reason: spectral imaging from upsampling detected"
},
"hiResCheckMusicContent": "Musical content",
"@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": {
"description": "Shown when the ultrasonic content of a Hi-Res file is noise rather than music",
"placeholders": {
"cutoff": {
"type": "String"
},
"rate": {
"type": "String"
}
}
},
"hiResCheckTitle": "Hi-Res Authenticity",
"@hiResCheckTitle": {
"description": "Title of the fake Hi-Res check card"
},
"hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files",
"@hiResCheckDescription": {
"description": "Explains what the Hi-Res authenticity check does"
},
"hiResCheckRun": "Check",
"@hiResCheckRun": {
"description": "Button that starts the Hi-Res authenticity check"
},
"hiResCheckChecking": "Checking Hi-Res authenticity...",
"@hiResCheckChecking": {
"description": "Loading text while the Hi-Res check runs"
},
"hiResCheckVerdictFake": "Likely fake Hi-Res",
"@hiResCheckVerdictFake": {
"description": "Verdict: the file claims Hi-Res but does not measure as it"
},
"hiResCheckVerdictGenuine": "Measures as genuine Hi-Res",
"@hiResCheckVerdictGenuine": {
"description": "Verdict: no upsampling or padded bit depth found"
},
"hiResCheckVerdictStandard": "Standard definition, nothing to flag",
"@hiResCheckVerdictStandard": {
"description": "Verdict: neither sample rate nor bit depth claims Hi-Res"
},
"hiResCheckVerdictInconclusive": "Inconclusive: the analyzed segment is too quiet or short",
"@hiResCheckVerdictInconclusive": {
"description": "Verdict: analysis could not reach a reliable conclusion"
},
"hiResCheckUnsupported": "Only FLAC and WAV files can be checked",
"@hiResCheckUnsupported": {
"description": "Shown when the file format cannot be decoded by the Hi-Res check"
},
"hiResCheckCutoff": "Content cutoff",
"@hiResCheckCutoff": {
"description": "Label for the highest frequency with real content"
},
"hiResCheckBitsInUse": "Bits in use",
"@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": {
"description": "Caveat shown under a fake Hi-Res verdict"
},
"hiResCheckFailed": "Hi-Res check failed: {error}",
"@hiResCheckFailed": {
"description": "Error shown when the Hi-Res check fails",
"placeholders": {
"error": {
"type": "String"
}
}
},
"hiResCheckReasonRate": "Declares {sampleRate} but content stops at ~{cutoff}",
"@hiResCheckReasonRate": {
"description": "Reason for a fake verdict caused by upsampling",
"placeholders": {
"sampleRate": {
"type": "String"
},
"cutoff": {
"type": "String"
}
}
},
"hiResCheckReasonDepth": "Declares {declared}-bit but only {effective} bits carry data",
"@hiResCheckReasonDepth": {
"description": "Reason for a fake verdict caused by padded bit depth",
"placeholders": {
"declared": {
"type": "int"
},
"effective": {
"type": "int"
}
}
},
"audioAnalysisRescanning": "Re-analyzing audio...",
"@audioAnalysisRescanning": {
"description": "Loading text while audio is being re-analyzed after an explicit refresh"
@@ -6047,6 +6306,45 @@
"@nowPlayingDetails": {
"description": "Menu item and section title for track metadata details"
},
"nowPlayingSleepTimer": "Sleep timer",
"@nowPlayingSleepTimer": {
"description": "Menu item and sheet title for the playback sleep timer"
},
"nowPlayingSleepTimerActive": "Ends at {time}",
"@nowPlayingSleepTimerActive": {
"description": "Active sleep timer deadline shown in the player menu",
"placeholders": {
"time": {
"type": "String"
}
}
},
"nowPlayingSleepTimerMinutes": "{minutes, plural, =1{1 minute} other{{minutes} minutes}}",
"@nowPlayingSleepTimerMinutes": {
"description": "Duration choice for the playback sleep timer",
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"nowPlayingSleepTimerOff": "Turn off sleep timer",
"@nowPlayingSleepTimerOff": {
"description": "Action to cancel the active playback sleep timer"
},
"nowPlayingSleepTimerSet": "Sleep timer set for {duration}",
"@nowPlayingSleepTimerSet": {
"description": "Confirmation after setting the playback sleep timer",
"placeholders": {
"duration": {
"type": "String"
}
}
},
"nowPlayingSleepTimerCancelled": "Sleep timer turned off",
"@nowPlayingSleepTimerCancelled": {
"description": "Confirmation after cancelling the playback sleep timer"
},
"nowPlayingOpenInExternalPlayer": "Open in external player",
"@nowPlayingOpenInExternalPlayer": {
"description": "Menu item to open the current track in an external player"
@@ -6389,6 +6687,15 @@
"@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": {
"description": "Shown when the app cannot retrieve a pending verification challenge",
"placeholders": {
"extension": {
"type": "String"
}
}
},
"extensionVerificationHelpTitleManual": "Open verification manually",
"@extensionVerificationHelpTitleManual": {
"description": "Dialog title when automatic browser launch for verification fails"
@@ -6478,6 +6785,9 @@
"@metadataCopyField": {
"description": "Metadata menu action that copies the selected key and value"
},
"mornyeShowTabs": "Show tabs",
"mornyeSearch": "Search",
"mornyeContinuePlaying": "Continue Playing",
"metadataCopyAll": "Copy all metadata",
"@metadataCopyAll": {
"description": "Metadata menu action that copies every visible key and value"
@@ -6490,6 +6800,28 @@
"@optionsEmbeddedCoverSizeDescription": {
"description": "Description shown in the embedded cover size picker"
},
"mornyeFavorite": "Favorite",
"mornyeGoToArtist": "Go to Artist",
"@mornyeFavorite": {
"description": "Compact context menu action that adds a track to Loved"
},
"mornyeFavorited": "Favorited",
"@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",
"@optionsEmbeddedCoverSizeOriginal": {
"description": "Option that preserves the provider artwork at its original resolution"
+6249 -5725
View File
File diff suppressed because it is too large. Load diff
+223 -16
View File
@@ -1,4 +1,48 @@
{
"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",
"@nowPlayingVolume": {
"description": "System volume control label in the Mornye player"
},
"appearanceStyle": "App Style",
"@appearanceStyle": {
"description": "Appearance section for choosing the app visual style"
},
"discordRichPresence": "Discord Rich Presence",
"discordPresenceDescription": "Share the track playing in the built-in player on Discord. Requires Discord to be installed and signed in.",
"discordPresenceMissing": "Install Discord and sign in, then turn this setting off and on again.",
"discordPresenceUnavailable": "Discord Rich Presence is unavailable in this build or on this device.",
"@@locale": "it",
"@@last_modified": "2026-04-28",
"appName": "SpotiFLAC Mobile",
@@ -57,6 +101,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",
"historySearchHint": "Cronologia ricerche...",
"@historySearchHint": {
"description": "Search bar placeholder in history"
@@ -237,6 +286,7 @@
"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": {
"description": "Snackbar after batch ReplayGain completes",
"placeholders": {
@@ -461,6 +511,18 @@
"@aboutSachinsenalDesc": {
"description": "Credit description for sachinsenal0x64"
},
"aboutUnituneDesc": "Open-source music link resolver by Flaze, used for cross-platform fallback matching.",
"@aboutUnituneDesc": {
"description": "Credit for the UniTune resolver"
},
"aboutMusicBrainzDesc": "Open music database maintained by MetaBrainz and its community, used for recording cross-references.",
"@aboutMusicBrainzDesc": {
"description": "Credit for the MusicBrainz database"
},
"aboutSquiglyDesc": "Universal music link service by Liam Macmillan, used as a final cross-platform resolver fallback.",
"@aboutSquiglyDesc": {
"description": "Credit for the Squigly resolver"
},
"aboutAppDescription": "Cerca i metadati, gestisci le estensioni e organizza la tua libreria.",
"@aboutAppDescription": {
"description": "App description in header card"
@@ -507,7 +569,7 @@
"@trackMetadataDelete": {
"description": "Action button - delete track"
},
"setupGrantPermission": "Grant Permission",
"setupGrantPermission": "Concedi autorizzazione",
"@setupGrantPermission": {
"description": "Button to request permission"
},
@@ -594,7 +656,7 @@
"@setupIcloudNotSupported": {
"description": "Error when user selects iCloud Drive on iOS"
},
"setupDownloadInFlac": "Download music in lossless and Hi-Res quality",
"setupDownloadInFlac": "Scarica musica in qualità lossless e Hi-Res",
"@setupDownloadInFlac": {
"description": "App tagline in setup"
},
@@ -842,6 +904,22 @@
"@duplicatesKeepBest": {
"description": "Button that deletes all but the highest-quality copy in a duplicate group"
},
"duplicatesKeepBestAll": "Mantieni la versione migliore",
"@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": {
"description": "Confirmation message for keeping the best copy across every duplicate group",
"placeholders": {
"count": {
"type": "int"
},
"groupCount": {
"type": "int"
}
}
},
"duplicatesKeepBestMessage": "Eliminare {count} copie con qualità minore di \"{trackName}\"?",
"@duplicatesKeepBestMessage": {
"description": "Confirmation message for the keep-best action",
@@ -1155,7 +1233,7 @@
"@folderOrganizationByPlaylist": {
"description": "Folder option - playlist folders"
},
"folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist",
"folderOrganizationByPlaylistSubtitle": "Cartella separata per ogni playlist",
"@folderOrganizationByPlaylistSubtitle": {
"description": "Subtitle for playlist folder option"
},
@@ -1167,7 +1245,7 @@
"@folderOrganizationByAlbum": {
"description": "Folder option - album folders"
},
"folderOrganizationByArtistAlbum": "Artist/Album",
"folderOrganizationByArtistAlbum": "Artista/Album",
"@folderOrganizationByArtistAlbum": {
"description": "Folder option - nested folders"
},
@@ -1179,11 +1257,11 @@
"@folderOrganizationNoneSubtitle": {
"description": "Subtitle for no organization option"
},
"folderOrganizationByArtistSubtitle": "Separate folder for each artist",
"folderOrganizationByArtistSubtitle": "Cartella separata per ogni artista",
"@folderOrganizationByArtistSubtitle": {
"description": "Subtitle for artist folder option"
},
"folderOrganizationByAlbumSubtitle": "Separate folder for each album",
"folderOrganizationByAlbumSubtitle": "Cartella separata per ogni album",
"@folderOrganizationByAlbumSubtitle": {
"description": "Subtitle for album folder option"
},
@@ -1191,7 +1269,7 @@
"@folderOrganizationByArtistAlbumSubtitle": {
"description": "Subtitle for nested folder option"
},
"updateAvailable": "Update Available",
"updateAvailable": "Aggiornamento disponibile",
"@updateAvailable": {
"description": "Update dialog title"
},
@@ -1244,7 +1322,7 @@
"@updateWhatsNew": {
"description": "Changelog section title"
},
"updateDownloadInstall": "Download & Install",
"updateDownloadInstall": "Scarica e installa",
"@updateDownloadInstall": {
"description": "Update button - download and install"
},
@@ -1300,27 +1378,27 @@
"@logSearchHint": {
"description": "Log search placeholder"
},
"logFilterLevel": "Level",
"logFilterLevel": "Livello",
"@logFilterLevel": {
"description": "Filter by log level"
},
"logFilterSection": "Filter",
"logFilterSection": "Filtro",
"@logFilterSection": {
"description": "Filter section title"
},
"logShareLogs": "Share logs",
"logShareLogs": "Condividi i log",
"@logShareLogs": {
"description": "Share button tooltip"
},
"logClearLogs": "Clear logs",
"logClearLogs": "Cancella i log",
"@logClearLogs": {
"description": "Clear button tooltip"
},
"logClearLogsTitle": "Clear Logs",
"logClearLogsTitle": "Cancella i log",
"@logClearLogsTitle": {
"description": "Clear logs dialog title"
},
"logClearLogsMessage": "Are you sure you want to clear all logs?",
"logClearLogsMessage": "Sei sicuro di voler cancellare tutti i log?",
"@logClearLogsMessage": {
"description": "Clear logs confirmation message"
},
@@ -1560,10 +1638,26 @@
"@trackDuration": {
"description": "Metadata label - track length"
},
"trackAudioQuality": "Audio quality",
"trackAudioQuality": "Qualità audio",
"@trackAudioQuality": {
"description": "Metadata label - audio quality"
},
"trackReplayGainTrackGain": "ReplayGain Track Gain",
"@trackReplayGainTrackGain": {
"description": "Metadata label - ReplayGain track gain"
},
"trackReplayGainTrackPeak": "ReplayGain Track Peak",
"@trackReplayGainTrackPeak": {
"description": "Metadata label - ReplayGain track peak"
},
"trackReplayGainAlbumGain": "ReplayGain Album Gain",
"@trackReplayGainAlbumGain": {
"description": "Metadata label - ReplayGain album gain"
},
"trackReplayGainAlbumPeak": "ReplayGain Album Peak",
"@trackReplayGainAlbumPeak": {
"description": "Metadata label - ReplayGain album peak"
},
"libraryQualityLabelFileFormat": "File format",
"@libraryQualityLabelFileFormat": {
"description": "Library audio quality label mode that shows the detected file format"
@@ -3176,6 +3270,10 @@
"@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": {
"description": "Subtitle for batch metadata update choices"
},
"trackReEnrichFieldCover": "Cover Art",
"@trackReEnrichFieldCover": {
"description": "Checkbox label for cover art field in re-enrich"
@@ -3228,6 +3326,22 @@
"@trackReEnrichModeReplaceSubtitle": {
"description": "Explanation for the selected-tag batch metadata mode"
},
"trackReEnrichModeManual": "Set common values",
"@trackReEnrichModeManual": {
"description": "Batch metadata mode that applies shared values to every selected track"
},
"trackReEnrichModeManualSubtitle": "Apply the same values to every selected track",
"@trackReEnrichModeManualSubtitle": {
"description": "Explanation for the manual shared-value batch metadata mode"
},
"trackReEnrichManualFieldsTitle": "Values to apply",
"@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": {
"description": "Safety explanation for manual batch metadata inputs"
},
"trackReEnrichFieldsTitle": "Tags to update",
"@trackReEnrichFieldsTitle": {
"description": "Heading above batch re-enrich field checkboxes"
@@ -3298,7 +3412,15 @@
"@trackReEnrichSearching": {
"description": "Snackbar while searching metadata from internet for local items"
},
"trackReEnrichPreparing": "Preparing metadata changes...",
"@trackReEnrichPreparing": {
"description": "Progress message while preparing manual batch metadata changes"
},
"trackReEnrichSuccess": "Metadata re-enriched successfully",
"trackReEnrichMetadataSaved": "Metadata saved",
"trackReEnrichLyricsUpdated": "Lyrics updated",
"trackReEnrichLyricsPreserved": "No new lyrics found; existing lyrics kept",
"trackReEnrichLyricsDisabled": "Lyrics not updated: lyric downloading is disabled in Settings",
"@trackReEnrichSuccess": {
"description": "Snackbar after successful re-enrichment"
},
@@ -3889,7 +4011,7 @@
"@lyricsProviderAppleMusicDesc": {
"description": "Description for Apple Music provider"
},
"lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)",
"lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, direct API)",
"@lyricsProviderQqMusicDesc": {
"description": "Description for QQ Music provider"
},
@@ -4001,6 +4123,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.",
"backupContentsSettings": "App settings",
"@backupContentsSettings": {
"description": "Backup contents row label for settings"
@@ -4164,6 +4294,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.",
"storageModeAppFolder": "App Folder (Recommended)",
"@storageModeAppFolder": {
"description": "Storage mode option - app-managed folder"
@@ -6172,6 +6306,45 @@
"@nowPlayingDetails": {
"description": "Menu item and section title for track metadata details"
},
"nowPlayingSleepTimer": "Sleep timer",
"@nowPlayingSleepTimer": {
"description": "Menu item and sheet title for the playback sleep timer"
},
"nowPlayingSleepTimerActive": "Ends at {time}",
"@nowPlayingSleepTimerActive": {
"description": "Active sleep timer deadline shown in the player menu",
"placeholders": {
"time": {
"type": "String"
}
}
},
"nowPlayingSleepTimerMinutes": "{minutes, plural, =1{1 minute} other{{minutes} minutes}}",
"@nowPlayingSleepTimerMinutes": {
"description": "Duration choice for the playback sleep timer",
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"nowPlayingSleepTimerOff": "Turn off sleep timer",
"@nowPlayingSleepTimerOff": {
"description": "Action to cancel the active playback sleep timer"
},
"nowPlayingSleepTimerSet": "Sleep timer set for {duration}",
"@nowPlayingSleepTimerSet": {
"description": "Confirmation after setting the playback sleep timer",
"placeholders": {
"duration": {
"type": "String"
}
}
},
"nowPlayingSleepTimerCancelled": "Sleep timer turned off",
"@nowPlayingSleepTimerCancelled": {
"description": "Confirmation after cancelling the playback sleep timer"
},
"nowPlayingOpenInExternalPlayer": "Open in external player",
"@nowPlayingOpenInExternalPlayer": {
"description": "Menu item to open the current track in an external player"
@@ -6514,6 +6687,15 @@
"@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": {
"description": "Shown when the app cannot retrieve a pending verification challenge",
"placeholders": {
"extension": {
"type": "String"
}
}
},
"extensionVerificationHelpTitleManual": "Open verification manually",
"@extensionVerificationHelpTitleManual": {
"description": "Dialog title when automatic browser launch for verification fails"
@@ -6603,6 +6785,9 @@
"@metadataCopyField": {
"description": "Metadata menu action that copies the selected key and value"
},
"mornyeShowTabs": "Show tabs",
"mornyeSearch": "Search",
"mornyeContinuePlaying": "Continue Playing",
"metadataCopyAll": "Copy all metadata",
"@metadataCopyAll": {
"description": "Metadata menu action that copies every visible key and value"
@@ -6615,6 +6800,28 @@
"@optionsEmbeddedCoverSizeDescription": {
"description": "Description shown in the embedded cover size picker"
},
"mornyeFavorite": "Favorite",
"mornyeGoToArtist": "Go to Artist",
"@mornyeFavorite": {
"description": "Compact context menu action that adds a track to Loved"
},
"mornyeFavorited": "Favorited",
"@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",
"@optionsEmbeddedCoverSizeOriginal": {
"description": "Option that preserves the provider artwork at its original resolution"
+6293 -5566
View File
File diff suppressed because it is too large. Load diff
+829 -102
View File
File diff suppressed because it is too large. Load diff
+333 -1
View File
@@ -1,4 +1,48 @@
{
"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",
"@nowPlayingVolume": {
"description": "System volume control label in the Mornye player"
},
"appearanceStyle": "App Style",
"@appearanceStyle": {
"description": "Appearance section for choosing the app visual style"
},
"discordRichPresence": "Discord Rich Presence",
"discordPresenceDescription": "Share the track playing in the built-in player on Discord. Requires Discord to be installed and signed in.",
"discordPresenceMissing": "Install Discord and sign in, then turn this setting off and on again.",
"discordPresenceUnavailable": "Discord Rich Presence is unavailable in this build or on this device.",
"@@locale": "nl",
"@@last_modified": "2026-04-28",
"appName": "SpotiFLAC Mobile",
@@ -57,6 +101,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",
"historySearchHint": "Search history...",
"@historySearchHint": {
"description": "Search bar placeholder in history"
@@ -237,6 +286,7 @@
"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": {
"description": "Snackbar after batch ReplayGain completes",
"placeholders": {
@@ -461,6 +511,18 @@
"@aboutSachinsenalDesc": {
"description": "Credit description for sachinsenal0x64"
},
"aboutUnituneDesc": "Open-source music link resolver by Flaze, used for cross-platform fallback matching.",
"@aboutUnituneDesc": {
"description": "Credit for the UniTune resolver"
},
"aboutMusicBrainzDesc": "Open music database maintained by MetaBrainz and its community, used for recording cross-references.",
"@aboutMusicBrainzDesc": {
"description": "Credit for the MusicBrainz database"
},
"aboutSquiglyDesc": "Universal music link service by Liam Macmillan, used as a final cross-platform resolver fallback.",
"@aboutSquiglyDesc": {
"description": "Credit for the Squigly resolver"
},
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
@@ -842,6 +904,22 @@
"@duplicatesKeepBest": {
"description": "Button that deletes all but the highest-quality copy in a duplicate group"
},
"duplicatesKeepBestAll": "Keep best for all",
"@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": {
"description": "Confirmation message for keeping the best copy across every duplicate group",
"placeholders": {
"count": {
"type": "int"
},
"groupCount": {
"type": "int"
}
}
},
"duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?",
"@duplicatesKeepBestMessage": {
"description": "Confirmation message for the keep-best action",
@@ -1564,6 +1642,22 @@
"@trackAudioQuality": {
"description": "Metadata label - audio quality"
},
"trackReplayGainTrackGain": "ReplayGain Track Gain",
"@trackReplayGainTrackGain": {
"description": "Metadata label - ReplayGain track gain"
},
"trackReplayGainTrackPeak": "ReplayGain Track Peak",
"@trackReplayGainTrackPeak": {
"description": "Metadata label - ReplayGain track peak"
},
"trackReplayGainAlbumGain": "ReplayGain Album Gain",
"@trackReplayGainAlbumGain": {
"description": "Metadata label - ReplayGain album gain"
},
"trackReplayGainAlbumPeak": "ReplayGain Album Peak",
"@trackReplayGainAlbumPeak": {
"description": "Metadata label - ReplayGain album peak"
},
"libraryQualityLabelFileFormat": "File format",
"@libraryQualityLabelFileFormat": {
"description": "Library audio quality label mode that shows the detected file format"
@@ -3176,6 +3270,10 @@
"@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": {
"description": "Subtitle for batch metadata update choices"
},
"trackReEnrichFieldCover": "Cover Art",
"@trackReEnrichFieldCover": {
"description": "Checkbox label for cover art field in re-enrich"
@@ -3228,6 +3326,22 @@
"@trackReEnrichModeReplaceSubtitle": {
"description": "Explanation for the selected-tag batch metadata mode"
},
"trackReEnrichModeManual": "Set common values",
"@trackReEnrichModeManual": {
"description": "Batch metadata mode that applies shared values to every selected track"
},
"trackReEnrichModeManualSubtitle": "Apply the same values to every selected track",
"@trackReEnrichModeManualSubtitle": {
"description": "Explanation for the manual shared-value batch metadata mode"
},
"trackReEnrichManualFieldsTitle": "Values to apply",
"@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": {
"description": "Safety explanation for manual batch metadata inputs"
},
"trackReEnrichFieldsTitle": "Tags to update",
"@trackReEnrichFieldsTitle": {
"description": "Heading above batch re-enrich field checkboxes"
@@ -3298,7 +3412,15 @@
"@trackReEnrichSearching": {
"description": "Snackbar while searching metadata from internet for local items"
},
"trackReEnrichPreparing": "Preparing metadata changes...",
"@trackReEnrichPreparing": {
"description": "Progress message while preparing manual batch metadata changes"
},
"trackReEnrichSuccess": "Metadata re-enriched successfully",
"trackReEnrichMetadataSaved": "Metadata saved",
"trackReEnrichLyricsUpdated": "Lyrics updated",
"trackReEnrichLyricsPreserved": "No new lyrics found; existing lyrics kept",
"trackReEnrichLyricsDisabled": "Lyrics not updated: lyric downloading is disabled in Settings",
"@trackReEnrichSuccess": {
"description": "Snackbar after successful re-enrichment"
},
@@ -3889,7 +4011,7 @@
"@lyricsProviderAppleMusicDesc": {
"description": "Description for Apple Music provider"
},
"lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)",
"lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, direct API)",
"@lyricsProviderQqMusicDesc": {
"description": "Description for QQ Music provider"
},
@@ -4001,6 +4123,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.",
"backupContentsSettings": "App settings",
"@backupContentsSettings": {
"description": "Backup contents row label for settings"
@@ -4164,6 +4294,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.",
"storageModeAppFolder": "App Folder (Recommended)",
"@storageModeAppFolder": {
"description": "Storage mode option - app-managed folder"
@@ -4732,6 +4866,131 @@
"@audioAnalysisRescan": {
"description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results"
},
"downloadRedownloadFakeHiRes": "Re-download fake 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": {
"description": "Setting subtitle for the fake Hi-Res re-download toggle"
},
"hiResCheckVerdictFakeCertain": "Fake 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": {
"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": {
"description": "Reason: sample-and-hold upsampling detected"
},
"hiResCheckReasonInterpolation": "In-between samples are linearly interpolated",
"@hiResCheckReasonInterpolation": {
"description": "Reason: linear-interpolation upsampling detected"
},
"hiResCheckReasonImaging": "Content above 22 kHz mirrors the audible band",
"@hiResCheckReasonImaging": {
"description": "Reason: spectral imaging from upsampling detected"
},
"hiResCheckMusicContent": "Musical content",
"@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": {
"description": "Shown when the ultrasonic content of a Hi-Res file is noise rather than music",
"placeholders": {
"cutoff": {
"type": "String"
},
"rate": {
"type": "String"
}
}
},
"hiResCheckTitle": "Hi-Res Authenticity",
"@hiResCheckTitle": {
"description": "Title of the fake Hi-Res check card"
},
"hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files",
"@hiResCheckDescription": {
"description": "Explains what the Hi-Res authenticity check does"
},
"hiResCheckRun": "Check",
"@hiResCheckRun": {
"description": "Button that starts the Hi-Res authenticity check"
},
"hiResCheckChecking": "Checking Hi-Res authenticity...",
"@hiResCheckChecking": {
"description": "Loading text while the Hi-Res check runs"
},
"hiResCheckVerdictFake": "Likely fake Hi-Res",
"@hiResCheckVerdictFake": {
"description": "Verdict: the file claims Hi-Res but does not measure as it"
},
"hiResCheckVerdictGenuine": "Measures as genuine Hi-Res",
"@hiResCheckVerdictGenuine": {
"description": "Verdict: no upsampling or padded bit depth found"
},
"hiResCheckVerdictStandard": "Standard definition, nothing to flag",
"@hiResCheckVerdictStandard": {
"description": "Verdict: neither sample rate nor bit depth claims Hi-Res"
},
"hiResCheckVerdictInconclusive": "Inconclusive: the analyzed segment is too quiet or short",
"@hiResCheckVerdictInconclusive": {
"description": "Verdict: analysis could not reach a reliable conclusion"
},
"hiResCheckUnsupported": "Only FLAC and WAV files can be checked",
"@hiResCheckUnsupported": {
"description": "Shown when the file format cannot be decoded by the Hi-Res check"
},
"hiResCheckCutoff": "Content cutoff",
"@hiResCheckCutoff": {
"description": "Label for the highest frequency with real content"
},
"hiResCheckBitsInUse": "Bits in use",
"@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": {
"description": "Caveat shown under a fake Hi-Res verdict"
},
"hiResCheckFailed": "Hi-Res check failed: {error}",
"@hiResCheckFailed": {
"description": "Error shown when the Hi-Res check fails",
"placeholders": {
"error": {
"type": "String"
}
}
},
"hiResCheckReasonRate": "Declares {sampleRate} but content stops at ~{cutoff}",
"@hiResCheckReasonRate": {
"description": "Reason for a fake verdict caused by upsampling",
"placeholders": {
"sampleRate": {
"type": "String"
},
"cutoff": {
"type": "String"
}
}
},
"hiResCheckReasonDepth": "Declares {declared}-bit but only {effective} bits carry data",
"@hiResCheckReasonDepth": {
"description": "Reason for a fake verdict caused by padded bit depth",
"placeholders": {
"declared": {
"type": "int"
},
"effective": {
"type": "int"
}
}
},
"audioAnalysisRescanning": "Re-analyzing audio...",
"@audioAnalysisRescanning": {
"description": "Loading text while audio is being re-analyzed after an explicit refresh"
@@ -6047,6 +6306,45 @@
"@nowPlayingDetails": {
"description": "Menu item and section title for track metadata details"
},
"nowPlayingSleepTimer": "Sleep timer",
"@nowPlayingSleepTimer": {
"description": "Menu item and sheet title for the playback sleep timer"
},
"nowPlayingSleepTimerActive": "Ends at {time}",
"@nowPlayingSleepTimerActive": {
"description": "Active sleep timer deadline shown in the player menu",
"placeholders": {
"time": {
"type": "String"
}
}
},
"nowPlayingSleepTimerMinutes": "{minutes, plural, =1{1 minute} other{{minutes} minutes}}",
"@nowPlayingSleepTimerMinutes": {
"description": "Duration choice for the playback sleep timer",
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"nowPlayingSleepTimerOff": "Turn off sleep timer",
"@nowPlayingSleepTimerOff": {
"description": "Action to cancel the active playback sleep timer"
},
"nowPlayingSleepTimerSet": "Sleep timer set for {duration}",
"@nowPlayingSleepTimerSet": {
"description": "Confirmation after setting the playback sleep timer",
"placeholders": {
"duration": {
"type": "String"
}
}
},
"nowPlayingSleepTimerCancelled": "Sleep timer turned off",
"@nowPlayingSleepTimerCancelled": {
"description": "Confirmation after cancelling the playback sleep timer"
},
"nowPlayingOpenInExternalPlayer": "Open in external player",
"@nowPlayingOpenInExternalPlayer": {
"description": "Menu item to open the current track in an external player"
@@ -6389,6 +6687,15 @@
"@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": {
"description": "Shown when the app cannot retrieve a pending verification challenge",
"placeholders": {
"extension": {
"type": "String"
}
}
},
"extensionVerificationHelpTitleManual": "Open verification manually",
"@extensionVerificationHelpTitleManual": {
"description": "Dialog title when automatic browser launch for verification fails"
@@ -6478,6 +6785,9 @@
"@metadataCopyField": {
"description": "Metadata menu action that copies the selected key and value"
},
"mornyeShowTabs": "Show tabs",
"mornyeSearch": "Search",
"mornyeContinuePlaying": "Continue Playing",
"metadataCopyAll": "Copy all metadata",
"@metadataCopyAll": {
"description": "Metadata menu action that copies every visible key and value"
@@ -6490,6 +6800,28 @@
"@optionsEmbeddedCoverSizeDescription": {
"description": "Description shown in the embedded cover size picker"
},
"mornyeFavorite": "Favorite",
"mornyeGoToArtist": "Go to Artist",
"@mornyeFavorite": {
"description": "Compact context menu action that adds a track to Loved"
},
"mornyeFavorited": "Favorited",
"@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",
"@optionsEmbeddedCoverSizeOriginal": {
"description": "Option that preserves the provider artwork at its original resolution"
+6317 -5590
View File
File diff suppressed because it is too large. Load diff
+6307 -5580
View File
File diff suppressed because it is too large. Load diff
+6293 -5566
View File
File diff suppressed because it is too large. Load diff
+6293 -5566
View File
File diff suppressed because it is too large. Load diff
+333 -1
View File
@@ -1,4 +1,48 @@
{
"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",
"@nowPlayingVolume": {
"description": "System volume control label in the Mornye player"
},
"appearanceStyle": "App Style",
"@appearanceStyle": {
"description": "Appearance section for choosing the app visual style"
},
"discordRichPresence": "Discord Rich Presence",
"discordPresenceDescription": "Share the track playing in the built-in player on Discord. Requires Discord to be installed and signed in.",
"discordPresenceMissing": "Install Discord and sign in, then turn this setting off and on again.",
"discordPresenceUnavailable": "Discord Rich Presence is unavailable in this build or on this device.",
"@@locale": "zh_CN",
"@@last_modified": "2026-04-28",
"appName": "SpotiFLAC 移动版",
@@ -57,6 +101,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",
"historySearchHint": "搜索历史……",
"@historySearchHint": {
"description": "Search bar placeholder in history"
@@ -237,6 +286,7 @@
"description": "Progress dialog title while batch scanning ReplayGain"
},
"replayGainBatchSuccess": "已为 {success}/{total} 首歌曲添加 ReplayGain",
"replayGainUnsupportedDecoder": "Some tracks could not be analyzed because their audio codec is not supported by the ReplayGain decoder. Their files were not changed.",
"@replayGainBatchSuccess": {
"description": "Snackbar after batch ReplayGain completes",
"placeholders": {
@@ -461,6 +511,18 @@
"@aboutSachinsenalDesc": {
"description": "Credit description for sachinsenal0x64"
},
"aboutUnituneDesc": "Open-source music link resolver by Flaze, used for cross-platform fallback matching.",
"@aboutUnituneDesc": {
"description": "Credit for the UniTune resolver"
},
"aboutMusicBrainzDesc": "Open music database maintained by MetaBrainz and its community, used for recording cross-references.",
"@aboutMusicBrainzDesc": {
"description": "Credit for the MusicBrainz database"
},
"aboutSquiglyDesc": "Universal music link service by Liam Macmillan, used as a final cross-platform resolver fallback.",
"@aboutSquiglyDesc": {
"description": "Credit for the Squigly resolver"
},
"aboutAppDescription": "搜索音乐元数据、管理扩展并整理你的乐库。",
"@aboutAppDescription": {
"description": "App description in header card"
@@ -842,6 +904,22 @@
"@duplicatesKeepBest": {
"description": "Button that deletes all but the highest-quality copy in a duplicate group"
},
"duplicatesKeepBestAll": "Keep best for all",
"@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": {
"description": "Confirmation message for keeping the best copy across every duplicate group",
"placeholders": {
"count": {
"type": "int"
},
"groupCount": {
"type": "int"
}
}
},
"duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?",
"@duplicatesKeepBestMessage": {
"description": "Confirmation message for the keep-best action",
@@ -1564,6 +1642,22 @@
"@trackAudioQuality": {
"description": "Metadata label - audio quality"
},
"trackReplayGainTrackGain": "ReplayGain Track Gain",
"@trackReplayGainTrackGain": {
"description": "Metadata label - ReplayGain track gain"
},
"trackReplayGainTrackPeak": "ReplayGain Track Peak",
"@trackReplayGainTrackPeak": {
"description": "Metadata label - ReplayGain track peak"
},
"trackReplayGainAlbumGain": "ReplayGain Album Gain",
"@trackReplayGainAlbumGain": {
"description": "Metadata label - ReplayGain album gain"
},
"trackReplayGainAlbumPeak": "ReplayGain Album Peak",
"@trackReplayGainAlbumPeak": {
"description": "Metadata label - ReplayGain album peak"
},
"libraryQualityLabelFileFormat": "File format",
"@libraryQualityLabelFileFormat": {
"description": "Library audio quality label mode that shows the detected file format"
@@ -3176,6 +3270,10 @@
"@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": {
"description": "Subtitle for batch metadata update choices"
},
"trackReEnrichFieldCover": "Cover Art",
"@trackReEnrichFieldCover": {
"description": "Checkbox label for cover art field in re-enrich"
@@ -3228,6 +3326,22 @@
"@trackReEnrichModeReplaceSubtitle": {
"description": "Explanation for the selected-tag batch metadata mode"
},
"trackReEnrichModeManual": "Set common values",
"@trackReEnrichModeManual": {
"description": "Batch metadata mode that applies shared values to every selected track"
},
"trackReEnrichModeManualSubtitle": "Apply the same values to every selected track",
"@trackReEnrichModeManualSubtitle": {
"description": "Explanation for the manual shared-value batch metadata mode"
},
"trackReEnrichManualFieldsTitle": "Values to apply",
"@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": {
"description": "Safety explanation for manual batch metadata inputs"
},
"trackReEnrichFieldsTitle": "Tags to update",
"@trackReEnrichFieldsTitle": {
"description": "Heading above batch re-enrich field checkboxes"
@@ -3298,7 +3412,15 @@
"@trackReEnrichSearching": {
"description": "Snackbar while searching metadata from internet for local items"
},
"trackReEnrichPreparing": "Preparing metadata changes...",
"@trackReEnrichPreparing": {
"description": "Progress message while preparing manual batch metadata changes"
},
"trackReEnrichSuccess": "Metadata re-enriched successfully",
"trackReEnrichMetadataSaved": "Metadata saved",
"trackReEnrichLyricsUpdated": "Lyrics updated",
"trackReEnrichLyricsPreserved": "No new lyrics found; existing lyrics kept",
"trackReEnrichLyricsDisabled": "Lyrics not updated: lyric downloading is disabled in Settings",
"@trackReEnrichSuccess": {
"description": "Snackbar after successful re-enrichment"
},
@@ -3889,7 +4011,7 @@
"@lyricsProviderAppleMusicDesc": {
"description": "Description for Apple Music provider"
},
"lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)",
"lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, direct API)",
"@lyricsProviderQqMusicDesc": {
"description": "Description for QQ Music provider"
},
@@ -4001,6 +4123,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.",
"backupContentsSettings": "App settings",
"@backupContentsSettings": {
"description": "Backup contents row label for settings"
@@ -4164,6 +4294,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.",
"storageModeAppFolder": "App Folder (Recommended)",
"@storageModeAppFolder": {
"description": "Storage mode option - app-managed folder"
@@ -4732,6 +4866,131 @@
"@audioAnalysisRescan": {
"description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results"
},
"downloadRedownloadFakeHiRes": "Re-download fake 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": {
"description": "Setting subtitle for the fake Hi-Res re-download toggle"
},
"hiResCheckVerdictFakeCertain": "Fake 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": {
"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": {
"description": "Reason: sample-and-hold upsampling detected"
},
"hiResCheckReasonInterpolation": "In-between samples are linearly interpolated",
"@hiResCheckReasonInterpolation": {
"description": "Reason: linear-interpolation upsampling detected"
},
"hiResCheckReasonImaging": "Content above 22 kHz mirrors the audible band",
"@hiResCheckReasonImaging": {
"description": "Reason: spectral imaging from upsampling detected"
},
"hiResCheckMusicContent": "Musical content",
"@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": {
"description": "Shown when the ultrasonic content of a Hi-Res file is noise rather than music",
"placeholders": {
"cutoff": {
"type": "String"
},
"rate": {
"type": "String"
}
}
},
"hiResCheckTitle": "Hi-Res Authenticity",
"@hiResCheckTitle": {
"description": "Title of the fake Hi-Res check card"
},
"hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files",
"@hiResCheckDescription": {
"description": "Explains what the Hi-Res authenticity check does"
},
"hiResCheckRun": "Check",
"@hiResCheckRun": {
"description": "Button that starts the Hi-Res authenticity check"
},
"hiResCheckChecking": "Checking Hi-Res authenticity...",
"@hiResCheckChecking": {
"description": "Loading text while the Hi-Res check runs"
},
"hiResCheckVerdictFake": "Likely fake Hi-Res",
"@hiResCheckVerdictFake": {
"description": "Verdict: the file claims Hi-Res but does not measure as it"
},
"hiResCheckVerdictGenuine": "Measures as genuine Hi-Res",
"@hiResCheckVerdictGenuine": {
"description": "Verdict: no upsampling or padded bit depth found"
},
"hiResCheckVerdictStandard": "Standard definition, nothing to flag",
"@hiResCheckVerdictStandard": {
"description": "Verdict: neither sample rate nor bit depth claims Hi-Res"
},
"hiResCheckVerdictInconclusive": "Inconclusive: the analyzed segment is too quiet or short",
"@hiResCheckVerdictInconclusive": {
"description": "Verdict: analysis could not reach a reliable conclusion"
},
"hiResCheckUnsupported": "Only FLAC and WAV files can be checked",
"@hiResCheckUnsupported": {
"description": "Shown when the file format cannot be decoded by the Hi-Res check"
},
"hiResCheckCutoff": "Content cutoff",
"@hiResCheckCutoff": {
"description": "Label for the highest frequency with real content"
},
"hiResCheckBitsInUse": "Bits in use",
"@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": {
"description": "Caveat shown under a fake Hi-Res verdict"
},
"hiResCheckFailed": "Hi-Res check failed: {error}",
"@hiResCheckFailed": {
"description": "Error shown when the Hi-Res check fails",
"placeholders": {
"error": {
"type": "String"
}
}
},
"hiResCheckReasonRate": "Declares {sampleRate} but content stops at ~{cutoff}",
"@hiResCheckReasonRate": {
"description": "Reason for a fake verdict caused by upsampling",
"placeholders": {
"sampleRate": {
"type": "String"
},
"cutoff": {
"type": "String"
}
}
},
"hiResCheckReasonDepth": "Declares {declared}-bit but only {effective} bits carry data",
"@hiResCheckReasonDepth": {
"description": "Reason for a fake verdict caused by padded bit depth",
"placeholders": {
"declared": {
"type": "int"
},
"effective": {
"type": "int"
}
}
},
"audioAnalysisRescanning": "Re-analyzing audio...",
"@audioAnalysisRescanning": {
"description": "Loading text while audio is being re-analyzed after an explicit refresh"
@@ -6047,6 +6306,45 @@
"@nowPlayingDetails": {
"description": "Menu item and section title for track metadata details"
},
"nowPlayingSleepTimer": "Sleep timer",
"@nowPlayingSleepTimer": {
"description": "Menu item and sheet title for the playback sleep timer"
},
"nowPlayingSleepTimerActive": "Ends at {time}",
"@nowPlayingSleepTimerActive": {
"description": "Active sleep timer deadline shown in the player menu",
"placeholders": {
"time": {
"type": "String"
}
}
},
"nowPlayingSleepTimerMinutes": "{minutes, plural, =1{1 minute} other{{minutes} minutes}}",
"@nowPlayingSleepTimerMinutes": {
"description": "Duration choice for the playback sleep timer",
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"nowPlayingSleepTimerOff": "Turn off sleep timer",
"@nowPlayingSleepTimerOff": {
"description": "Action to cancel the active playback sleep timer"
},
"nowPlayingSleepTimerSet": "Sleep timer set for {duration}",
"@nowPlayingSleepTimerSet": {
"description": "Confirmation after setting the playback sleep timer",
"placeholders": {
"duration": {
"type": "String"
}
}
},
"nowPlayingSleepTimerCancelled": "Sleep timer turned off",
"@nowPlayingSleepTimerCancelled": {
"description": "Confirmation after cancelling the playback sleep timer"
},
"nowPlayingOpenInExternalPlayer": "Open in external player",
"@nowPlayingOpenInExternalPlayer": {
"description": "Menu item to open the current track in an external player"
@@ -6389,6 +6687,15 @@
"@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": {
"description": "Shown when the app cannot retrieve a pending verification challenge",
"placeholders": {
"extension": {
"type": "String"
}
}
},
"extensionVerificationHelpTitleManual": "Open verification manually",
"@extensionVerificationHelpTitleManual": {
"description": "Dialog title when automatic browser launch for verification fails"
@@ -6478,6 +6785,9 @@
"@metadataCopyField": {
"description": "Metadata menu action that copies the selected key and value"
},
"mornyeShowTabs": "Show tabs",
"mornyeSearch": "Search",
"mornyeContinuePlaying": "Continue Playing",
"metadataCopyAll": "Copy all metadata",
"@metadataCopyAll": {
"description": "Metadata menu action that copies every visible key and value"
@@ -6490,6 +6800,28 @@
"@optionsEmbeddedCoverSizeDescription": {
"description": "Description shown in the embedded cover size picker"
},
"mornyeFavorite": "Favorite",
"mornyeGoToArtist": "Go to Artist",
"@mornyeFavorite": {
"description": "Compact context menu action that adds a track to Loved"
},
"mornyeFavorited": "Favorited",
"@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",
"@optionsEmbeddedCoverSizeOriginal": {
"description": "Option that preserves the provider artwork at its original resolution"
+333 -1
View File
@@ -1,4 +1,48 @@
{
"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",
"@nowPlayingVolume": {
"description": "System volume control label in the Mornye player"
},
"appearanceStyle": "App Style",
"@appearanceStyle": {
"description": "Appearance section for choosing the app visual style"
},
"discordRichPresence": "Discord Rich Presence",
"discordPresenceDescription": "Share the track playing in the built-in player on Discord. Requires Discord to be installed and signed in.",
"discordPresenceMissing": "Install Discord and sign in, then turn this setting off and on again.",
"discordPresenceUnavailable": "Discord Rich Presence is unavailable in this build or on this device.",
"@@locale": "zh_TW",
"@@last_modified": "2026-04-28",
"appName": "SpotiFLAC 行動版",
@@ -57,6 +101,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",
"historySearchHint": "搜尋紀錄……",
"@historySearchHint": {
"description": "Search bar placeholder in history"
@@ -237,6 +286,7 @@
"description": "Progress dialog title while batch scanning ReplayGain"
},
"replayGainBatchSuccess": "已{success}為{total}首歌添加音量平衡",
"replayGainUnsupportedDecoder": "Some tracks could not be analyzed because their audio codec is not supported by the ReplayGain decoder. Their files were not changed.",
"@replayGainBatchSuccess": {
"description": "Snackbar after batch ReplayGain completes",
"placeholders": {
@@ -461,6 +511,18 @@
"@aboutSachinsenalDesc": {
"description": "Credit description for sachinsenal0x64"
},
"aboutUnituneDesc": "Open-source music link resolver by Flaze, used for cross-platform fallback matching.",
"@aboutUnituneDesc": {
"description": "Credit for the UniTune resolver"
},
"aboutMusicBrainzDesc": "Open music database maintained by MetaBrainz and its community, used for recording cross-references.",
"@aboutMusicBrainzDesc": {
"description": "Credit for the MusicBrainz database"
},
"aboutSquiglyDesc": "Universal music link service by Liam Macmillan, used as a final cross-platform resolver fallback.",
"@aboutSquiglyDesc": {
"description": "Credit for the Squigly resolver"
},
"aboutAppDescription": "搜尋音樂元數據、管理擴充功能,並整理各個音樂庫。",
"@aboutAppDescription": {
"description": "App description in header card"
@@ -842,6 +904,22 @@
"@duplicatesKeepBest": {
"description": "Button that deletes all but the highest-quality copy in a duplicate group"
},
"duplicatesKeepBestAll": "Keep best for all",
"@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": {
"description": "Confirmation message for keeping the best copy across every duplicate group",
"placeholders": {
"count": {
"type": "int"
},
"groupCount": {
"type": "int"
}
}
},
"duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?",
"@duplicatesKeepBestMessage": {
"description": "Confirmation message for the keep-best action",
@@ -1564,6 +1642,22 @@
"@trackAudioQuality": {
"description": "Metadata label - audio quality"
},
"trackReplayGainTrackGain": "ReplayGain Track Gain",
"@trackReplayGainTrackGain": {
"description": "Metadata label - ReplayGain track gain"
},
"trackReplayGainTrackPeak": "ReplayGain Track Peak",
"@trackReplayGainTrackPeak": {
"description": "Metadata label - ReplayGain track peak"
},
"trackReplayGainAlbumGain": "ReplayGain Album Gain",
"@trackReplayGainAlbumGain": {
"description": "Metadata label - ReplayGain album gain"
},
"trackReplayGainAlbumPeak": "ReplayGain Album Peak",
"@trackReplayGainAlbumPeak": {
"description": "Metadata label - ReplayGain album peak"
},
"libraryQualityLabelFileFormat": "File format",
"@libraryQualityLabelFileFormat": {
"description": "Library audio quality label mode that shows the detected file format"
@@ -3176,6 +3270,10 @@
"@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": {
"description": "Subtitle for batch metadata update choices"
},
"trackReEnrichFieldCover": "Cover Art",
"@trackReEnrichFieldCover": {
"description": "Checkbox label for cover art field in re-enrich"
@@ -3228,6 +3326,22 @@
"@trackReEnrichModeReplaceSubtitle": {
"description": "Explanation for the selected-tag batch metadata mode"
},
"trackReEnrichModeManual": "Set common values",
"@trackReEnrichModeManual": {
"description": "Batch metadata mode that applies shared values to every selected track"
},
"trackReEnrichModeManualSubtitle": "Apply the same values to every selected track",
"@trackReEnrichModeManualSubtitle": {
"description": "Explanation for the manual shared-value batch metadata mode"
},
"trackReEnrichManualFieldsTitle": "Values to apply",
"@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": {
"description": "Safety explanation for manual batch metadata inputs"
},
"trackReEnrichFieldsTitle": "Tags to update",
"@trackReEnrichFieldsTitle": {
"description": "Heading above batch re-enrich field checkboxes"
@@ -3298,7 +3412,15 @@
"@trackReEnrichSearching": {
"description": "Snackbar while searching metadata from internet for local items"
},
"trackReEnrichPreparing": "Preparing metadata changes...",
"@trackReEnrichPreparing": {
"description": "Progress message while preparing manual batch metadata changes"
},
"trackReEnrichSuccess": "Metadata re-enriched successfully",
"trackReEnrichMetadataSaved": "Metadata saved",
"trackReEnrichLyricsUpdated": "Lyrics updated",
"trackReEnrichLyricsPreserved": "No new lyrics found; existing lyrics kept",
"trackReEnrichLyricsDisabled": "Lyrics not updated: lyric downloading is disabled in Settings",
"@trackReEnrichSuccess": {
"description": "Snackbar after successful re-enrichment"
},
@@ -3889,7 +4011,7 @@
"@lyricsProviderAppleMusicDesc": {
"description": "Description for Apple Music provider"
},
"lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)",
"lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, direct API)",
"@lyricsProviderQqMusicDesc": {
"description": "Description for QQ Music provider"
},
@@ -4001,6 +4123,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.",
"backupContentsSettings": "App settings",
"@backupContentsSettings": {
"description": "Backup contents row label for settings"
@@ -4164,6 +4294,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.",
"storageModeAppFolder": "App Folder (Recommended)",
"@storageModeAppFolder": {
"description": "Storage mode option - app-managed folder"
@@ -4732,6 +4866,131 @@
"@audioAnalysisRescan": {
"description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results"
},
"downloadRedownloadFakeHiRes": "Re-download fake 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": {
"description": "Setting subtitle for the fake Hi-Res re-download toggle"
},
"hiResCheckVerdictFakeCertain": "Fake 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": {
"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": {
"description": "Reason: sample-and-hold upsampling detected"
},
"hiResCheckReasonInterpolation": "In-between samples are linearly interpolated",
"@hiResCheckReasonInterpolation": {
"description": "Reason: linear-interpolation upsampling detected"
},
"hiResCheckReasonImaging": "Content above 22 kHz mirrors the audible band",
"@hiResCheckReasonImaging": {
"description": "Reason: spectral imaging from upsampling detected"
},
"hiResCheckMusicContent": "Musical content",
"@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": {
"description": "Shown when the ultrasonic content of a Hi-Res file is noise rather than music",
"placeholders": {
"cutoff": {
"type": "String"
},
"rate": {
"type": "String"
}
}
},
"hiResCheckTitle": "Hi-Res Authenticity",
"@hiResCheckTitle": {
"description": "Title of the fake Hi-Res check card"
},
"hiResCheckDescription": "Detect upsampled or bit-padded fake Hi-Res files",
"@hiResCheckDescription": {
"description": "Explains what the Hi-Res authenticity check does"
},
"hiResCheckRun": "Check",
"@hiResCheckRun": {
"description": "Button that starts the Hi-Res authenticity check"
},
"hiResCheckChecking": "Checking Hi-Res authenticity...",
"@hiResCheckChecking": {
"description": "Loading text while the Hi-Res check runs"
},
"hiResCheckVerdictFake": "Likely fake Hi-Res",
"@hiResCheckVerdictFake": {
"description": "Verdict: the file claims Hi-Res but does not measure as it"
},
"hiResCheckVerdictGenuine": "Measures as genuine Hi-Res",
"@hiResCheckVerdictGenuine": {
"description": "Verdict: no upsampling or padded bit depth found"
},
"hiResCheckVerdictStandard": "Standard definition, nothing to flag",
"@hiResCheckVerdictStandard": {
"description": "Verdict: neither sample rate nor bit depth claims Hi-Res"
},
"hiResCheckVerdictInconclusive": "Inconclusive: the analyzed segment is too quiet or short",
"@hiResCheckVerdictInconclusive": {
"description": "Verdict: analysis could not reach a reliable conclusion"
},
"hiResCheckUnsupported": "Only FLAC and WAV files can be checked",
"@hiResCheckUnsupported": {
"description": "Shown when the file format cannot be decoded by the Hi-Res check"
},
"hiResCheckCutoff": "Content cutoff",
"@hiResCheckCutoff": {
"description": "Label for the highest frequency with real content"
},
"hiResCheckBitsInUse": "Bits in use",
"@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": {
"description": "Caveat shown under a fake Hi-Res verdict"
},
"hiResCheckFailed": "Hi-Res check failed: {error}",
"@hiResCheckFailed": {
"description": "Error shown when the Hi-Res check fails",
"placeholders": {
"error": {
"type": "String"
}
}
},
"hiResCheckReasonRate": "Declares {sampleRate} but content stops at ~{cutoff}",
"@hiResCheckReasonRate": {
"description": "Reason for a fake verdict caused by upsampling",
"placeholders": {
"sampleRate": {
"type": "String"
},
"cutoff": {
"type": "String"
}
}
},
"hiResCheckReasonDepth": "Declares {declared}-bit but only {effective} bits carry data",
"@hiResCheckReasonDepth": {
"description": "Reason for a fake verdict caused by padded bit depth",
"placeholders": {
"declared": {
"type": "int"
},
"effective": {
"type": "int"
}
}
},
"audioAnalysisRescanning": "Re-analyzing audio...",
"@audioAnalysisRescanning": {
"description": "Loading text while audio is being re-analyzed after an explicit refresh"
@@ -6047,6 +6306,45 @@
"@nowPlayingDetails": {
"description": "Menu item and section title for track metadata details"
},
"nowPlayingSleepTimer": "Sleep timer",
"@nowPlayingSleepTimer": {
"description": "Menu item and sheet title for the playback sleep timer"
},
"nowPlayingSleepTimerActive": "Ends at {time}",
"@nowPlayingSleepTimerActive": {
"description": "Active sleep timer deadline shown in the player menu",
"placeholders": {
"time": {
"type": "String"
}
}
},
"nowPlayingSleepTimerMinutes": "{minutes, plural, =1{1 minute} other{{minutes} minutes}}",
"@nowPlayingSleepTimerMinutes": {
"description": "Duration choice for the playback sleep timer",
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"nowPlayingSleepTimerOff": "Turn off sleep timer",
"@nowPlayingSleepTimerOff": {
"description": "Action to cancel the active playback sleep timer"
},
"nowPlayingSleepTimerSet": "Sleep timer set for {duration}",
"@nowPlayingSleepTimerSet": {
"description": "Confirmation after setting the playback sleep timer",
"placeholders": {
"duration": {
"type": "String"
}
}
},
"nowPlayingSleepTimerCancelled": "Sleep timer turned off",
"@nowPlayingSleepTimerCancelled": {
"description": "Confirmation after cancelling the playback sleep timer"
},
"nowPlayingOpenInExternalPlayer": "Open in external player",
"@nowPlayingOpenInExternalPlayer": {
"description": "Menu item to open the current track in an external player"
@@ -6389,6 +6687,15 @@
"@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": {
"description": "Shown when the app cannot retrieve a pending verification challenge",
"placeholders": {
"extension": {
"type": "String"
}
}
},
"extensionVerificationHelpTitleManual": "Open verification manually",
"@extensionVerificationHelpTitleManual": {
"description": "Dialog title when automatic browser launch for verification fails"
@@ -6478,6 +6785,9 @@
"@metadataCopyField": {
"description": "Metadata menu action that copies the selected key and value"
},
"mornyeShowTabs": "Show tabs",
"mornyeSearch": "Search",
"mornyeContinuePlaying": "Continue Playing",
"metadataCopyAll": "Copy all metadata",
"@metadataCopyAll": {
"description": "Metadata menu action that copies every visible key and value"
@@ -6490,6 +6800,28 @@
"@optionsEmbeddedCoverSizeDescription": {
"description": "Description shown in the embedded cover size picker"
},
"mornyeFavorite": "Favorite",
"mornyeGoToArtist": "Go to Artist",
"@mornyeFavorite": {
"description": "Compact context menu action that adds a track to Loved"
},
"mornyeFavorited": "Favorited",
"@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",
"@optionsEmbeddedCoverSizeOriginal": {
"description": "Option that preserves the provider artwork at its original resolution"