Merge branch 'upcoming' into greek
This commit is contained in:
commit
2e4958354f
35 changed files with 1603 additions and 136 deletions
277
src/i18n/en_HODOR.jsonc
Normal file
277
src/i18n/en_HODOR.jsonc
Normal file
|
@ -0,0 +1,277 @@
|
|||
{ // HODOR
|
||||
|
||||
// i18n Info
|
||||
"i18n.languageName": "HODOR", // name of language in native language
|
||||
"i18n.languageNameEnglish": "HODOR", // name of language in English
|
||||
"i18n.category": "fun", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "HODOR", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
||||
// App info
|
||||
"app.name": "HODOR",
|
||||
|
||||
"date.format": "${m} ${d}, ${y}",
|
||||
|
||||
// Dialogs
|
||||
"dialog.cancel": "HODOR",
|
||||
"dialog.ok": "HODOR",
|
||||
|
||||
// Notification
|
||||
"notification.updatingLibrarySongs": "HODOR HODOR HODOR...",
|
||||
"notification.updatingLibraryAlbums": "HODOR HODOR HODOR...",
|
||||
"notification.updatingLibraryArtists": "HODOR HODOR HODOR...",
|
||||
// Terms
|
||||
"term.appleInc": "HODOR Inc.",
|
||||
"term.appleMusic": "HODOR HODOR",
|
||||
"term.applePodcasts": "HODOR HODOR",
|
||||
"term.itunes": "HODOR",
|
||||
"term.github": "HODOR",
|
||||
"term.discord": "HODOR",
|
||||
"term.learnMore": "HODOR HODOR",
|
||||
"term.accountSettings": "HODOR HODOR",
|
||||
"term.logout": "HODOR",
|
||||
"term.login": "HODOR",
|
||||
"term.about": "HODOR",
|
||||
"term.privateSession": "HODOR HODOR",
|
||||
"term.queue": "HODOR",
|
||||
"term.search": "HODOR",
|
||||
"term.library": "HODOR",
|
||||
"term.listenNow": "HODOR HODOR",
|
||||
"term.browse": "HODOR",
|
||||
"term.radio": "HODOR",
|
||||
"term.recentlyAdded": "HODOR HODOR",
|
||||
"term.songs": "HODOR",
|
||||
"term.albums": "HODOR",
|
||||
"term.artists": "HODOR",
|
||||
"term.podcasts": "HODOR",
|
||||
"term.playlists": "HODOR",
|
||||
"term.playlist": "HODOR",
|
||||
"term.play": "HODOR",
|
||||
"term.pause": "HODOR",
|
||||
"term.previous": "HODOR",
|
||||
"term.next": "HODOR",
|
||||
"term.shuffle": "HODOR",
|
||||
"term.repeat": "HODOR",
|
||||
"term.volume": "HODOR",
|
||||
"term.mute": "HODOR",
|
||||
"term.unmute": "HODOR",
|
||||
"term.share": "HODOR",
|
||||
"term.settings": "HODOR",
|
||||
"term.seeAll": "HODOR HODOR",
|
||||
"term.sortBy": "HODOR HODOR",
|
||||
"term.sortBy.album": "HODOR",
|
||||
"term.sortBy.artist": "HODOR",
|
||||
"term.sortBy.name": "HODOR",
|
||||
"term.sortBy.genre": "HODOR",
|
||||
"term.sortBy.releaseDate": "HODOR HODOR",
|
||||
"term.sortBy.duration": "HODOR",
|
||||
"term.sortOrder": "HODOR-HODOR",
|
||||
"term.sortOrder.ascending": "HODOR",
|
||||
"term.sortOrder.descending": "HODOR",
|
||||
"term.viewAs": "HODOR HODOR",
|
||||
"term.viewAs.coverArt": "HODOR HODOR",
|
||||
"term.viewAs.list": "HODOR",
|
||||
"term.size": "HODOR",
|
||||
"term.size.normal": "HODOR",
|
||||
"term.size.compact": "HODOR",
|
||||
"term.enable": "HODOR",
|
||||
"term.disable": "HODOR",
|
||||
"term.enabled": "HODOR",
|
||||
"term.disabled": "HODOR",
|
||||
"term.connect": "HODOR",
|
||||
"term.connecting": "HODOR",
|
||||
"term.disconnect": "HODOR",
|
||||
"term.authed": "HODOR",
|
||||
"term.confirm": "HODOR ?",
|
||||
"term.more": "HODOR",
|
||||
"term.less": "HODOR",
|
||||
"term.showMore": "HODOR HODOR",
|
||||
"term.showLess": "HODOR HODOR",
|
||||
"term.topSongs" : "HODOR HODOR",
|
||||
"term.latestReleases": "HODOR HODOR",
|
||||
"term.time.added": "HODOR",
|
||||
"term.time.released": "HODOR",
|
||||
"term.time.updated": "HODOR",
|
||||
"term.fullscreenView": "HODOR HODOR",
|
||||
"term.defaultView": "HODOR HODOR",
|
||||
"term.spacializedAudioSetting": "HODOR HODOR HODOR",
|
||||
"term.clearAll": "HODOR HODOR",
|
||||
"term.recentStations": "HODOR HODOR",
|
||||
"term.language": "HODOR",
|
||||
"term.noLyrics": "HODOR... / HODOR HODOR HODOR./ HODOR.",
|
||||
"term.copyright": "HODOR",
|
||||
"term.rightsReserved": "HODOR HODOR HODOR.",
|
||||
"term.sponsor": "HODOR HODOR HODOR",
|
||||
"term.ciderTeam": "HODOR HODOR",
|
||||
"term.developer": "HODOR",
|
||||
"term.socialTeam": "HODOR HODOR",
|
||||
"term.contributors": "HODOR",
|
||||
"term.equalizer": "HODOR",
|
||||
"term.reset": "HODOR",
|
||||
"term.tracks": "HODOR", // Assume x amount of tracks. e.g. 50 tracks
|
||||
|
||||
// Home
|
||||
"home.title": "HODOR",
|
||||
"home.recentlyPlayed": "HODOR HODOR",
|
||||
"home.recentlyAdded": "HODOR HODOR",
|
||||
"home.artistsFeed": "HODOR HODOR HODOR",
|
||||
"home.artistsFeed.noArtist": "HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR",
|
||||
"home.madeForYou": "HODOR HODOR HODOR",
|
||||
"home.friendsListeningTo": "HODOR HODOR HODOR",
|
||||
"home.followedArtists": "HODOR HODOR",
|
||||
// Errors
|
||||
"error.appleMusicSubRequired": "HODOR HODOR HODOR HODOR HODOR.",
|
||||
"error.connectionError": "HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR.",
|
||||
"error.noResults": "HODOR HODOR.",
|
||||
"error.noResults.description": "HODOR HODOR HODOR HODOR.",
|
||||
|
||||
//Podcasts
|
||||
"podcast.followOnCider": "HODOR HODOR HODOR",
|
||||
"podcast.followedOnCider": "HODOR HODOR HODOR",
|
||||
"podcast.subscribeOnItunes": "HODOR HODOR HODOR",
|
||||
"podcast.subscribedOnItunes": "HODOR HODOR HODOR",
|
||||
"podcast.itunesStore": "HODOR HODOR",
|
||||
"podcast.episodes": "HODOR",
|
||||
"podcast.playEpisode": "HODOR HODOR",
|
||||
"podcast.website": "HODOR HODOR",
|
||||
|
||||
// Actions
|
||||
"action.addToLibrary": "HODOR HODOR HODOR",
|
||||
"action.addToLibrary.success": "HODOR HODOR HODOR",
|
||||
"action.addToLibrary.error": "HODOR HODOR HODOR LiHODORbrary",
|
||||
"action.removeFromLibrary": "HODOR HODOR HODOR",
|
||||
"action.removeFromLibrary.success": "HODOR HODOR HODOR",
|
||||
"action.addToQueue": "HODOR HODOR HODOR",
|
||||
"action.addToQueue.success": "HODOR HODOR HODOR",
|
||||
"action.addToQueue.error": "HODOR HODOR HODOR HODOR",
|
||||
"action.removeFromQueue": "HODOR HODOR HODOR",
|
||||
"action.removeFromQueue.success": "HODOR HODOR HODOR",
|
||||
"action.removeFromQueue.error": "HODOR HODOR HODOR HODOR",
|
||||
"action.addToPlaylist": "HODOR HODOR HODOR",
|
||||
"action.removeFromPlaylist": "HODOR HODOR HODOR",
|
||||
"action.addToFavorites": "HODOR HODOR HODOR",
|
||||
"action.follow": "HODOR",
|
||||
"action.follow.success": "HODOR",
|
||||
"action.follow.error": "HODOR HODOR",
|
||||
"action.unfollow": "HODOR",
|
||||
"action.unfollow.success": "HODOR",
|
||||
"action.unfollow.error": "HODOR HODOR",
|
||||
"action.playNext": "HODOR HODOR",
|
||||
"action.playLater": "HODOR HODOR",
|
||||
"action.startRadio": "HODOR HODOR",
|
||||
"action.goToArtist": "HODOR HODOR HODOR",
|
||||
"action.goToAlbum": "HODOR HODOR HODOR",
|
||||
"action.moveToTop": "HODOR HODOR HODOR",
|
||||
"action.share": "HODOR",
|
||||
"action.rename": "HODOR",
|
||||
"action.love": "HODOR",
|
||||
"action.unlove": "HODOR",
|
||||
"action.dislike": "HODOR",
|
||||
"action.undoDislike": "HODOR HODOR",
|
||||
"action.showWebRemoteQR": "HODOR HODOR HODOR HODOR",
|
||||
"action.playTracksNext": "HODOR ${app.selectedMediaItems.length} HODOR HODOR",
|
||||
"action.playTracksLater": "HODOR ${app.selectedMediaItems.length} HODOR HODOR",
|
||||
"action.removeTracks": "HODOR ${self.selectedItems.length} HODOR HODOR HODOR",
|
||||
|
||||
// Settings - Audio
|
||||
"settings.header.audio": "HODOR",
|
||||
"settings.header.audio.description": "HODOR HODOR HODOR HODOR HODOR HODOR.",
|
||||
"settings.option.audio.quality": "HODOR HODOR", // Dropdown
|
||||
"settings.header.audio.quality.high": "HODOR.",
|
||||
"settings.header.audio.quality.low": "HODOR!",
|
||||
"settings.header.audio.quality.auto": "HODOR",
|
||||
"settings.option.audio.seamlessTransition": "HODOR HODOR HODOR", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality": "HODOR HODOR HODOR", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR , HODOR HODOR HODOR, HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "HODOR HODOR", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "HODOR HODOR", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "HODOR HODOR HODOR HODOR HODOR HODOR 3-HODOR (HODOR: HODOR HODOR HODOR HODOR HODOR)",
|
||||
// Settings - Visual
|
||||
"settings.header.visual": "HODOR",
|
||||
"settings.header.visual.description": "HODOR HODOR HODOR HODOR HODOR HODOR.",
|
||||
"settings.option.visual.windowBackgroundStyle": "HODOR HODOR HODOR", // Toggle
|
||||
"settings.header.visual.windowBackgroundStyle.none": "HODOR",
|
||||
"settings.header.visual.windowBackgroundStyle.artwork": "HODOR",
|
||||
"settings.option.visual.animatedArtwork": "HODOR HODOR", // Dropdown
|
||||
"settings.header.visual.animatedArtwork.always": "HODOR",
|
||||
"settings.header.visual.animatedArtwork.limited": "HODOR HODOR HODOR HODOR HODOR HODOR",
|
||||
"settings.header.visual.animatedArtwork.disable": "HODOR HODOR",
|
||||
"settings.option.visual.animatedArtworkQuality": "HODOR HODOR HODOR", // Dropdown
|
||||
"settings.header.visual.animatedArtworkQuality.low": "HODOR..",
|
||||
"settings.header.visual.animatedArtworkQuality.medium": "HODOR.",
|
||||
"settings.header.visual.animatedArtworkQuality.high": "HODOR!",
|
||||
"settings.header.visual.animatedArtworkQuality.veryHigh": "HODOR HODOR!",
|
||||
"settings.header.visual.animatedArtworkQuality.extreme": "HODOOOR!!",
|
||||
"settings.option.visual.animatedWindowBackground": "HODOR HODOR HODOR", // Toggle
|
||||
"settings.option.visual.hardwareAcceleration": "HODOR HODOR", // Dropdown
|
||||
"settings.option.visual.hardwareAcceleration.description": "HODOR HODOR",
|
||||
"settings.header.visual.hardwareAcceleration.default": "HODOR.",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "HODOR!!",
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.option.visual.showPersonalInfo": "HODOR HODOR HODOR?", // Toggle
|
||||
// Settings - General (Reserved)
|
||||
"settings.header.general": "HODOR",
|
||||
"settings.header.general.description": "HODOR HODOR HODOR HODOR HODOR HODOR.",
|
||||
|
||||
// Settings - Lyrics
|
||||
"settings.header.lyrics": "HODOR",
|
||||
"settings.header.lyrics.description": "HODOR HODOR HODOR HODOR HODOR HODOR.",
|
||||
"settings.option.lyrics.enableMusixmatch": "HODOR HODOR HODOR", // Toggle
|
||||
"settings.option.lyrics.enableMusixmatchKaraoke": "HODOR HODOR HODOR (HODOR HODOR)", // Toggle
|
||||
"settings.option.lyrics.musixmatchPreferredLanguage": "HODOR HODOR HODOR HODOR", // Dropdown
|
||||
"settings.option.lyrics.enableYoutubeLyrics": "HODOR HODOR HODOR HODOR HODOR HODOR", // Toggle
|
||||
|
||||
// Settings - Connectivity
|
||||
"settings.header.connectivity": "HODOR",
|
||||
"settings.header.connectivity.description": "HODOR HODOR HODOR HODOR HODOR HODOR.",
|
||||
"settings.option.connectivity.discordRPC": "HODOR HODOR HODOR", // Dropdown
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.header.connectivity.discordRPC.cider": "HODOR HODOR 'HODOR'",
|
||||
"settings.header.connectivity.discordRPC.appleMusic": "HODOR HODOR 'HODOR HODOR'",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "HODOR HODOR HODOR HODOR HODOR HODOR", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "HODOR HODOR", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "HODOR HODOR HODOR (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "HODOR HODOR HODOR HODOR",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "HODOR HODOR HODOR HODOR HODOR HODOR (HODOR)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "HODOR HODOR HODOR (HODOR)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
"settings.header.experimental": "HODOR",
|
||||
"settings.header.experimental.description": "HODOR HODOR HODOR HODOR HODOR HODOR.",
|
||||
"settings.option.experimental.compactUI": "HODOR UI", // Toggle
|
||||
"settings.option.experimental.closeButtonBehaviour": "HODOR HODOR HODOR",
|
||||
"settings.option.experimental.closeButtonBehaviour.quit": "HODOR HODOR",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "HODOR HODOR HODOR",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "HODOR HODOR HODOR HODOR",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
"spatial.spatialProperties" : "HODOR HODOR",
|
||||
"spatial.width" : "HODOR",
|
||||
"spatial.height" : "HODOR",
|
||||
"spatial.depth" : "HODOR",
|
||||
"spatial.roomMaterials" : "HODOR HODOR",
|
||||
"spatial.roomDimensions" : "HODOR HODOR",
|
||||
"spatial.roomPositions" : "HODOR HODOR",
|
||||
"spatial.setDimensions" : "HODOR HODOR",
|
||||
"spatial.setPositions" : "HODOR HODOR",
|
||||
"spatial.up" : "HODOR",
|
||||
"spatial.front" : "HODOR",
|
||||
"spatial.left" : "HODOR",
|
||||
"spatial.right" : "HODOR",
|
||||
"spatial.back" : "HODOR",
|
||||
"spatial.down" : "HODOR",
|
||||
"spatial.listener" : "HODOR",
|
||||
"spatial.audioSource" : "HODOR HODOR",
|
||||
|
||||
// Settings - Unfinished
|
||||
"settings.header.unfinished": "HODOR",
|
||||
|
||||
// Web Remote
|
||||
"remote.web.title": "HODOR HODOR",
|
||||
"remote.web.description": "HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR",
|
||||
|
||||
//About
|
||||
"about.thanks": "HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR HODOR."
|
||||
}
|
279
src/i18n/en_SGA.jsonc
Normal file
279
src/i18n/en_SGA.jsonc
Normal file
|
@ -0,0 +1,279 @@
|
|||
{
|
||||
|
||||
// i18n Info
|
||||
"i18n.languageName": "┤ᖋ|:ᖋᔮᒣ╎ᔮ ᖋ|:i!⍑ᖋᕊᒷᒣ", // name of language in native language
|
||||
"i18n.languageNameEnglish": "Galactic Alphabet", // name of language in English
|
||||
"i18n.category": "fun", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "@kyw504100", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
||||
// App info
|
||||
"app.name": "ᔮ╎↸ᒷ∷",
|
||||
|
||||
"date.format": "${m} ${d}, ${y}",
|
||||
|
||||
// Dialogs
|
||||
"dialog.cancel": "ᔮᖋリᔮᒷ|:",
|
||||
"dialog.ok": "ᒍ·ǀ·",
|
||||
|
||||
// Notification
|
||||
"notification.updatingLibrarySongs": "⚍i!↸ᖋᒣ╎リ┤ |:╎ᕊ∷ᖋ∷॥ ϟᒍリ┤ϟ...",
|
||||
"notification.updatingLibraryAlbums": "⚍i!↸ᖋᒣ╎リ┤ |:╎ᕊ∷ᖋ∷॥ ᖋ|:ᕊ⚍ᒲϟ...",
|
||||
"notification.updatingLibraryArtists": "⚍i!↸ᖋᒣ╎リ┤ |:╎ᕊ∷ᖋ∷॥ ᖋ∷ᒣ╎ϟᒣϟ...",
|
||||
// Terms
|
||||
"term.appleInc": "ᖋi!i!|:ᒷ ╎リᔮ.",
|
||||
"term.appleMusic": "ᖋi!i!|:ᒷ ᒲ⚍ϟ╎ᔮ",
|
||||
"term.applePodcasts": "ᖋi!i!|:ᒷ i!ᒍ↸ᔮᖋϟᒣϟ",
|
||||
"term.itunes": "╎ᒣ⚍リᒷϟ",
|
||||
"term.github": "┤╎ᒣ⍑⚍ᕊ",
|
||||
"term.discord": "↸╎ϟᔮᒍ∷↸",
|
||||
"term.learnMore": "|:ᒷᖋ∷リ ᒲᒍ∷ᒷ",
|
||||
"term.accountSettings": "ᖋᔮᔮᒍ⚍リᒣ ϟᒷᒣᒣ╎リ┤ϟ",
|
||||
"term.logout": "|:ᒍ┤ᒍ⚍ᒣ",
|
||||
"term.login": "|:ᒍ┤╎リ",
|
||||
"term.about": "ᖋᕊᒍ⚍ᒣ",
|
||||
"term.privateSession": "I!∷╎⍊ᖋᒣᒷ ϟᒷϟϟ╎ᒍリ",
|
||||
"term.queue": "ᑑ⚍ᒷ⚍ᒷ",
|
||||
"term.search": "ϟᒷᖋ∷ᔮ⍑",
|
||||
"term.library": "|:╎ᕊ∷ᖋ∷॥",
|
||||
"term.listenNow": "|:╎ϟᒣᒷリ",
|
||||
"term.browse": "リᒍ∴",
|
||||
"term.radio": "∷ᖋ↸╎ᒍ",
|
||||
"term.recentlyAdded": "∷ᒷᔮᒷリᒣ|:॥ ᖋ↸↸ᒷ↸",
|
||||
"term.songs": "ϟᒍリ┤ϟ",
|
||||
"term.albums": "ᖋ|:ᕊ⚍ᒲϟ",
|
||||
"term.artists": "ᖋ∷ᒣ╎ϟᒣϟ",
|
||||
"term.podcasts": "I!ᒍ↸ᔮᖋϟᒣϟ",
|
||||
"term.playlists": "i!|:ᖋ॥|:╎ϟᒣϟ",
|
||||
"term.playlist": "i!|:ᖋ॥|:╎ϟᒣ",
|
||||
"term.play": "i!|:ᖋ॥",
|
||||
"term.pause": "I!ᖋ⚍ϟᒷ",
|
||||
"term.previous": "I!∷ᒷ⍊╎ᒍ⚍ϟ",
|
||||
"term.next": "リᒷ/ᒣ",
|
||||
"term.shuffle": "ϟ⍑⚍⎓⎓|:ᒷ",
|
||||
"term.repeat": "∷ᒷi!ᒷᖋᒣ",
|
||||
"term.volume": "⍊ᒍ|:⚍ᒲᒷ",
|
||||
"term.mute": "ᒲ⚍ᒣᒷ",
|
||||
"term.unmute": "⚍リᒲ⚍ᒣᒷ",
|
||||
"term.share": "ϟ⍑ᖋ∷ᒷ",
|
||||
"term.settings": "ϟᒷᒣᒣ╎リ┤ϟ",
|
||||
"term.seeAll": "ϟᒷᒷ ᖋ|:|:",
|
||||
"term.sortBy": "ϟᒍ∷ᒣ ᕊ॥",
|
||||
"term.sortBy.album": "ᖋ|:ᕊ⚍ᒲ",
|
||||
"term.sortBy.artist": "ᖋ∷ᒣ╎ϟᒣ",
|
||||
"term.sortBy.name": "リᖋᒲᒷ",
|
||||
"term.sortBy.genre": "┤ᒷリ∷ᒷ",
|
||||
"term.sortBy.releaseDate": "∷ᒷ|:ᒷᖋϟᒷ ↸ᖋᒣᒷ",
|
||||
"term.sortBy.duration": "↸⚍∷ᖋᒣ╎ᒍリ",
|
||||
"term.sortOrder": "ᖋ-∩",
|
||||
"term.sortOrder.ascending": "ᖋϟᔮᒷリ↸╎リ┤",
|
||||
"term.sortOrder.descending": "↸ᒷϟᔮᒷリ↸╎リ┤",
|
||||
"term.viewAs": "⍊╎ᒷ∴ ᖋϟ",
|
||||
"term.viewAs.coverArt": "ᔮᒍ⍊ᒷ∷ ᖋ∷ᒣ",
|
||||
"term.viewAs.list": "|:╎ϟᒣ",
|
||||
"term.size": "ϟ╎∩ᒷ",
|
||||
"term.size.normal": "リᒍ∷ᒲᖋ|:",
|
||||
"term.size.compact": "ᔮᒍᒲi!ᖋᔮᒣ",
|
||||
"term.enable": "ᒷリᖋᕊ|:ᒷ",
|
||||
"term.disable": "↸╎ϟᖋᕊ|:ᒷ",
|
||||
"term.enabled": "ᒷリᖋᕊ|:ᒷ↸",
|
||||
"term.disabled": "↸╎ϟᖋᕊ|:ᒷ↸",
|
||||
"term.connect": "ᔮᒍリリᒷᔮᒣ",
|
||||
"term.connecting": "ᔮᒍリリᒷᔮᒣ╎リ┤",
|
||||
"term.disconnect": "↸╎ϟᔮᒍリリᒷᔮᒣ",
|
||||
"term.authed": "ᖋ⚍ᒣ⍑ᒷ↸",
|
||||
"term.confirm": "ᔮᒍリ⎓╎∷ᒲ ?",
|
||||
"term.more": "ᒲᒍ∷ᒷ",
|
||||
"term.less": "|:ᒷϟϟ",
|
||||
"term.showMore": "ϟ⍑ᒍ∴ ᒲᒍ∷ᒷ",
|
||||
"term.showLess": "ϟ⍑ᒍ∴ |:ᒷϟϟ",
|
||||
"term.topSongs" : "ᒣᒍi! ϟᒍリ┤ϟ",
|
||||
"term.latestReleases": "|:ᖋᒣᒷϟᒣ ∷ᒷ|:ᒷᖋϟᒷϟ",
|
||||
"term.time.added": "ᖋ↸↸ᒷ↸",
|
||||
"term.time.released": "∷ᒷ|:ᒷᖋϟᒷ↸",
|
||||
"term.time.updated": "⚍i!↸ᖋᒣᒷ↸",
|
||||
"term.fullscreenView": "⎓⚍|:|:ϟᔮ∷ᒷᒷリ ⍊╎ᒷ∴",
|
||||
"term.defaultView": "↸ᒷ⎓ᖋ⚍|:ᒣ ⍊╎ᒷ∴",
|
||||
"term.spacializedAudioSetting": "ϟi!ᖋᔮ╎ᖋ|:╎∩ᒷ↸ ᖋ⚍↸╎ᒍ ϟᒷᒣᒣ╎リ┤",
|
||||
"term.clearAll": "ᔮ|:ᒷᖋ∷ ᖋ|:|:",
|
||||
"term.recentStations": "∷ᒷᔮᒷリᒣ ϟᒣᖋᒣ╎ᒍリϟ",
|
||||
"term.language": "|:ᖋリ┤⚍ᖋ┤ᒷ",
|
||||
"term.noLyrics": "|:ᒍᖋ↸╎リ┤... / |:॥∷╎ᔮϟ リᒍᒣ ⎓ᒍ⚍リ↸./ ╎リϟᒣ∷⚍ᒲᒷリᒣᖋ|:.",
|
||||
"term.copyright": "ᔮᒍi!॥∷╎┤⍑ᒣ",
|
||||
"term.rightsReserved": "ᖋ|:|: ∷╎┤⍑ᒣϟ ∷ᒷϟᒷ∷⍊ᒷ↸.",
|
||||
"term.sponsor": "ϟi!ᒍリϟᒍ∷ ᒣ⍑╎ϟ i!∷ᒍ⋮ᒷᔮᒣ",
|
||||
"term.ciderTeam": "ᔮ╎↸ᒷ∷ ᒣᒷᖋᒲ",
|
||||
"term.developer": "↸ᒷ⍊ᒷ|:ᒍi!ᒷ∷",
|
||||
"term.socialTeam": "ϟᒍᔮ╎ᖋ|: ᒣᒷᖋᒲ",
|
||||
"term.contributors": "ᔮᒍリᒣ∷╎ᕊ⚍ᒣᒍ∷ϟ",
|
||||
"term.equalizer": "ᒷᑑ⚍ᖋ|:╎∩ᒷ∷",
|
||||
"term.reset": "∷ᒷϟᒷᒣ",
|
||||
"term.tracks": "ᒣ∷ᖋᔮ·ǀ·ϟ", // Assume x amount of tracks. e.g. 50 tracks
|
||||
|
||||
|
||||
// Home
|
||||
"home.title": "⍑ᒍᒲᒷ",
|
||||
"home.recentlyPlayed": "∷ᒷᔮᒷリᒣ|:॥ i!|:ᖋ॥ᒷ↸",
|
||||
"home.recentlyAdded": "∷ᒷᔮᒷリᒣ|:॥ ᖋ↸↸ᒷ↸",
|
||||
"home.artistsFeed": "॥ᒍ⚍∷ ᖋ∷ᒣ╎ϟᒣϟ ⎓ᒷᒷ↸",
|
||||
"home.artistsFeed.noArtist": "⎓ᒍ|:|:ᒍ∴ ϟᒍᒲᒷ ᖋ∷ᒣ╎ϟᒣϟ ⎓╎∷ϟᒣ ᖋリ↸ ᒣ⍑ᒷ╎∷ |:ᖋᒣᒷϟᒣ ∷ᒷ|:ᒷᖋϟᒷϟ ∴╎|:|: ᕊᒷ ⍑ᒷ∷ᒷ",
|
||||
"home.madeForYou": "ᒲᖋ↸ᒷ ⎓ᒍ∷ ॥ᒍ⚍",
|
||||
"home.friendsListeningTo": "⎓∷╎ᒷリ↸ϟ |:╎ϟᒣᒷリ╎リ┤ ᒣᒍ",
|
||||
"home.followedArtists": "⎓ᒍ|:|:ᒍ∴ᒷ↸ ᖋ∷ᒣ╎ϟᒣϟ",
|
||||
// Errors
|
||||
"error.appleMusicSubRequired": "ᖋi!i!|:ᒷ ᒲ⚍ϟ╎ᔮ ∷ᒷᑑ⚍╎∷ᒷϟ ᖋ ϟ⚍ᕊϟᔮ∷╎i!ᒣ╎ᒍリ.",
|
||||
"error.connectionError": "ᒣ⍑ᒷ∷ᒷ ∴ᖋϟ ᖋ i!∷ᒍᕊ|:ᒷᒲ ᔮᒍリリᒷᔮᒣ╎リ┤ ᒣᒍ ᖋi!i!|:ᒷ ᒲ⚍ϟ╎ᔮ.",
|
||||
"error.noResults": "リᒍ ∷ᒷϟ⚍|:ᒣϟ.",
|
||||
"error.noResults.description": "ᒣ∷॥ ᖋ リᒷ∴ ϟᒷᖋ∷ᔮ⍑.",
|
||||
|
||||
//Podcasts
|
||||
"podcast.followOnCider": "⎓ᒍ|:|:ᒍ∴ ᒍリ ᔮ╎↸ᒷ∷",
|
||||
"podcast.followedOnCider": "⎓ᒍ|:|:ᒍ∴╎リ┤ ᒍリ ᔮ╎↸ᒷ∷",
|
||||
"podcast.subscribeOnItunes": "ϟ⚍ᕊϟᔮ∷╎ᕊᒷ ᒍリ ╎ᒣ⚍リᒷϟ",
|
||||
"podcast.subscribedOnItunes": "ϟ⚍ᕊϟᔮ∷╎ᕊᒷ↸ ᒍリ ╎ᒣ⚍リᒷϟ",
|
||||
"podcast.itunesStore": "╎ᒣ⚍リᒷϟ ϟᒣᒍ∷ᒷ",
|
||||
"podcast.episodes": "ᒷi!╎ϟᒍ↸ᒷϟ",
|
||||
"podcast.playEpisode": "i!|:ᖋ॥ ᒷi!╎ϟᒍ↸ᒷ",
|
||||
"podcast.website": "I!ᒍ↸ᔮᖋϟᒣ ∴ᒷᕊϟ╎ᒣᒷ",
|
||||
|
||||
// Actions
|
||||
"action.addToLibrary": "ᖋ↸↸ ᒣᒍ |:╎ᕊ∷ᖋ∷॥",
|
||||
"action.addToLibrary.success": "ᖋ↸↸ᒷ↸ ᒣᒍ |:╎ᕊ∷ᖋ∷॥",
|
||||
"action.addToLibrary.error": "ᒷ∷∷ᒍ∷ ᖋ↸↸╎リ┤ ᒣᒍ |:╎ᕊ∷ᖋ∷॥",
|
||||
"action.removeFromLibrary": "∷ᒷᒲᒍ⍊ᒷ ⎓∷ᒍᒲ |:╎ᕊ∷ᖋ∷॥",
|
||||
"action.removeFromLibrary.success": "∷ᒷᒲᒍ⍊ᒷ↸ ⎓∷ᒍᒲ |:╎ᕊ∷ᖋ∷॥",
|
||||
"action.addToQueue": "ᖋ↸↸ ᒣᒍ ᑑ⚍ᒷ⚍ᒷ",
|
||||
"action.addToQueue.success": "ᖋ↸↸ᒷ↸ ᒣᒍ ᑑ⚍ᒷ⚍ᒷ",
|
||||
"action.addToQueue.error": "ᒷ∷∷ᒍ∷ ᖋ↸↸╎リ┤ ᒣᒍ ᑑ⚍ᒷ⚍ᒷ",
|
||||
"action.removeFromQueue": "∷ᒷᒲᒍ⍊ᒷ ⎓∷ᒍᒲ ᑑ⚍ᒷ⚍ᒷ",
|
||||
"action.removeFromQueue.success": "∷ᒷᒲᒍ⍊ᒷ↸ ⎓∷ᒍᒲ ᑑ⚍ᒷ⚍ᒷ",
|
||||
"action.removeFromQueue.error": "ᒷ∷∷ᒍ∷ ∷ᒷᒲᒍ⍊╎リ┤ ⎓∷ᒍᒲ ᑑ⚍ᒷ⚍ᒷ",
|
||||
"action.addToPlaylist": "ᖋ↸↸ ᒣᒍ i!|:ᖋ॥|:╎ϟᒣ",
|
||||
"action.removeFromPlaylist": "∷ᒷᒲᒍ⍊ᒷ ⎓∷ᒍᒲ i!|:ᖋ॥|:╎ϟᒣ",
|
||||
"action.addToFavorites": "ᖋ↸↸ ᒣᒍ ⎓ᖋ⍊ᒍ∷╎ᒣᒷϟ",
|
||||
"action.follow": "⎓ᒍ|:|:ᒍ∴",
|
||||
"action.follow.success": "⎓ᒍ|:|:ᒍ∴ᒷ↸",
|
||||
"action.follow.error": "ᒷ∷∷ᒍ∷ ⎓ᒍ|:|:ᒍ∴╎リ┤",
|
||||
"action.unfollow": "⚍リ⎓ᒍ|:|:ᒍ∴",
|
||||
"action.unfollow.success": "⚍リ⎓ᒍ|:|:ᒍ∴ᒷ↸",
|
||||
"action.unfollow.error": "ᒷ∷∷ᒍ∷ ⚍リ⎓ᒍ|:|:ᒍ∴╎リ┤",
|
||||
"action.playNext": "i!|:ᖋ॥ リᒷ/ᒣ",
|
||||
"action.playLater": "i!|:ᖋ॥ |:ᖋᒣᒷ∷",
|
||||
"action.startRadio": "ϟᒣᖋ∷ᒣ ∷ᖋ↸╎ᒍ",
|
||||
"action.goToArtist": "┤ᒍ ᒣᒍ ᖋ∷ᒣ╎ϟᒣ",
|
||||
"action.goToAlbum": "┤ᒍ ᒣᒍ ᖋ|:ᕊ⚍ᒲ",
|
||||
"action.moveToTop": "ᒲᒍ⍊ᒷ ᒣᒍ ᒣᒍi!",
|
||||
"action.share": "ϟ⍑ᖋ∷ᒷ",
|
||||
"action.rename": "∷ᒷリᖋᒲᒷ",
|
||||
"action.love": "|:ᒍ⍊ᒷ",
|
||||
"action.unlove": "⚍リ|:ᒍ⍊ᒷ",
|
||||
"action.dislike": "↸╎ϟ|:╎·ǀ·ᒷ",
|
||||
"action.undoDislike": "⚍リ↸ᒍ ↸╎ϟ|:╎·ǀ·ᒷ",
|
||||
"action.showWebRemoteQR": "ϟ⍑ᒍ∴ ∴ᒷᕊ ∷ᒷᒲᒍᒣᒷ ᑑ∷",
|
||||
"action.playTracksNext": "i!|:ᖋ॥ ${app.selectedMediaItems.length} ᒣ∷ᖋᔮ·ǀ·ϟ リᒷ/ᒣ",
|
||||
"action.playTracksLater": "i!|:ᖋ॥ ${app.selectedMediaItems.length} ᒣ∷ᖋᔮ·ǀ·ϟ |:ᖋᒣᒷ∷",
|
||||
"action.removeTracks": "∷ᒷᒲᒍ⍊ᒷ ${self.selectedItems.length} ᒣ∷ᖋᔮ·ǀ·ϟ ⎓∷ᒍᒲ ᑑ⚍ᒷ⚍ᒷ",
|
||||
|
||||
// Settings - Audio
|
||||
"settings.header.audio": "ᖋ⚍↸╎ᒍ",
|
||||
"settings.header.audio.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ᖋ⚍↸╎ᒍ ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.",
|
||||
"settings.option.audio.quality": "ᖋ⚍↸╎ᒍ ᑑ⚍ᖋ|:╎ᒣ॥", // Dropdown
|
||||
"settings.header.audio.quality.high": "⍑╎┤⍑",
|
||||
"settings.header.audio.quality.low": "|:ᒍ∴",
|
||||
"settings.header.audio.quality.auto": "ᖋ⚍ᒣᒍ",
|
||||
"settings.option.audio.seamlessTransition": "ϟᒷᖋᒲ|:ᒷϟϟ ᖋ⚍↸╎ᒍ ᒣ∷ᖋリϟ╎ᒣ╎ᒍリ", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality": "ᒷリᖋᕊ|:ᒷ ᖋ↸⍊ᖋリᔮᒷ↸ ⎓⚍リᔮᒣ╎ᒍリᖋ|:╎ᒣ॥", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "ᒷリᖋᕊ|:╎リ┤ ᖋ⚍↸╎ᒍᔮᒍリᒣᒷ/ᒣ ⎓⚍リᔮᒣ╎ᒍリᖋ|:╎ᒣ॥ ∴╎|:|: ᖋ|:|:ᒍ∴ ⎓ᒍ∷ ᒷ/ᒣᒷリ↸ᒷ↸ ᖋ⚍↸╎ᒍ ⎓ᒷᖋᒣ⚍∷ᒷϟ |:╎·ǀ·ᒷ ᖋ⚍↸╎ᒍ リᒍ∷ᒲᖋ|:╎∩ᖋᒣ╎ᒍリ , ᒷᑑ⚍ᖋ|:╎∩ᒷ∷ϟ ᖋリ↸ ⍊╎ϟ⚍ᖋ|:╎∩ᒷ∷ϟ, ⍑ᒍ∴ᒷ⍊ᒷ∷ ᒍリ ϟᒍᒲᒷ ϟ॥ϟᒣᒷᒲϟ ᒣ⍑╎ϟ ᒲᖋ॥ ᔮᖋ⚍ϟᒷ ϟᒣ⚍ᒣᒣᒷ∷╎リ┤ ╎リ ᖋ⚍↸╎ᒍ ᒣ∷ᖋᔮ·ǀ·ϟ.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ᖋ⚍↸╎ᒍ リᒍ∷ᒲᖋ|:╎∩ᖋᒣ╎ᒍリ", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "リᒍ∷ᒲᖋ|:╎∩ᒷϟ i!ᒷᖋ·ǀ· ⍊ᒍ|:⚍ᒲᒷ ⎓ᒍ∷ ╎リ↸╎⍊╎↸⚍ᖋ|: ᒣ∷ᖋᔮ·ǀ·ϟ ᒣᒍ ᔮ∷ᒷᖋᒣᒷ ᖋ ᒲᒍ∷ᒷ ⚍リ╎⎓ᒍ∷ᒲ |:╎ϟᒣᒷリ╎リ┤ ᒷ/i!ᒷ∷╎ᒷリᔮᒷ.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ᖋ⚍↸╎ᒍ ϟi!ᖋᒣ╎ᖋ|:╎∩ᖋᒣ╎ᒍリ", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "ϟi!ᖋᒣ╎ᖋ|:╎∩ᒷ ᖋ⚍↸╎ᒍ ᖋリ↸ ᒲᖋ·ǀ·ᒷ ᖋ⚍↸╎ᒍ ᒲᒍ∷ᒷ 3-↸╎ᒲᒷリϟ╎ᒍリᖋ|: (リᒍᒣᒷ: ᒣ⍑╎ϟ ╎ϟ リᒍᒣ ↸ᒍ|:ᕊ॥ ᖋᒣᒲᒍϟ)",
|
||||
// Settings - Visual
|
||||
"settings.header.visual": "⍊╎ϟ⚍ᖋ|:",
|
||||
"settings.header.visual.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ⍊╎ϟ⚍ᖋ| ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.",
|
||||
"settings.option.visual.windowBackgroundStyle": "∴╎リ↸ᒍ∴ ᕊᖋᔮ·ǀ·┤∷ᒍ⚍リ↸ ϟᒣ॥|:ᒷ", // Toggle
|
||||
"settings.header.visual.windowBackgroundStyle.none": "リᒍリᒷ",
|
||||
"settings.header.visual.windowBackgroundStyle.artwork": "ᖋ∷ᒣ∴ᒍ∷·ǀ·",
|
||||
"settings.option.visual.animatedArtwork": "ᖋリ╎ᒲᖋᒣᒷ↸ ᖋ∷ᒣ∴ᒍ∷·ǀ·", // Dropdown
|
||||
"settings.header.visual.animatedArtwork.always": "ᖋ|:∴ᖋ॥ϟ",
|
||||
"settings.header.visual.animatedArtwork.limited": "|:╎ᒲ╎ᒣᒷ↸ ᒣᒍ i!ᖋ┤ᒷϟ ᖋリ↸ ϟi!ᒷᔮ╎ᖋ|: ᒷリᒣ∷╎ᒷϟ",
|
||||
"settings.header.visual.animatedArtwork.disable": "↸╎ϟᖋᕊ|:ᒷ ᒷ⍊ᒷ∷॥∴⍑ᒷ∷ᒷ",
|
||||
"settings.option.visual.animatedArtworkQuality": "ᖋリ╎ᒲᖋᒣᒷ↸ ᖋ∷ᒣ∴ᒍ∷·ǀ· ᑑ⚍ᖋ|:╎ᒣ॥", // Dropdown
|
||||
"settings.header.visual.animatedArtworkQuality.low": "|:ᒍ∴",
|
||||
"settings.header.visual.animatedArtworkQuality.medium": "ᒲᒷ↸╎⚍ᒲ",
|
||||
"settings.header.visual.animatedArtworkQuality.high": "⍑╎┤⍑",
|
||||
"settings.header.visual.animatedArtworkQuality.veryHigh": "⍊ᒷ∷॥ ⍑╎┤⍑",
|
||||
"settings.header.visual.animatedArtworkQuality.extreme": "ᒷ/ᒣ∷ᒷᒲᒷ",
|
||||
"settings.option.visual.animatedWindowBackground": "ᖋリ╎ᒲᖋᒣᒷ↸ ∴╎リ↸ᒍ∴ ᕊᖋᔮ·ǀ·┤∷ᒍ⚍リ↸", // Toggle
|
||||
"settings.option.visual.hardwareAcceleration": "⍑ᖋ∷↸∴ᖋ∷ᒷ ᖋᔮᔮᒷ|:ᒷ∷ᖋᒣ╎ᒍリ", // Dropdown
|
||||
"settings.option.visual.hardwareAcceleration.description": "∷ᒷᑑ⚍╎∷ᒷϟ ∷ᒷ|:ᖋ⚍リᔮ⍑",
|
||||
"settings.header.visual.hardwareAcceleration.default": "↸ᒷ⎓ᖋ⚍|:ᒣ",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "∴ᒷᕊ┤i!⚍",
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.option.visual.showPersonalInfo": "ϟ⍑ᒍ∴ i!ᒷ∷ϟᒍリᖋ|: ╎リ⎓ᒍ", // Toggle
|
||||
// Settings - General (Reserved)
|
||||
"settings.header.general": "┤ᒷリᒷ∷ᖋ|:",
|
||||
"settings.header.general.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ┤ᒷリᒷ∷ᖋ|: ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.",
|
||||
|
||||
// Settings - Lyrics
|
||||
"settings.header.lyrics": "|:॥∷╎ᔮϟ",
|
||||
"settings.header.lyrics.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ |:॥∷╎ᔮϟ ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.",
|
||||
"settings.option.lyrics.enableMusixmatch": "ᒷリᖋᕊ|:ᒷ ᒲ⚍ϟ╎̇/ᒲᖋᒣᔮ⍑ |:॥∷╎ᔮϟ", // Toggle
|
||||
"settings.option.lyrics.enableMusixmatchKaraoke": "ᒷリᖋᕊ|:ᒷ ·ǀ·ᖋ∷ᖋᒍ·ǀ·ᒷ ᒲᒍ↸ᒷ (ᒲ⚍ϟ╎̇/ᒲᖋᒣᔮ⍑ ᒍリ|:॥)", // Toggle
|
||||
"settings.option.lyrics.musixmatchPreferredLanguage": "ᒲ⚍ϟ╎̇/ᒲᖋᒣᔮ⍑ ᒣ∷ᖋリϟ|:ᖋᒣ╎ᒍリ i!∷ᒷ⎓ᒷ∷∷ᒷ↸ |:ᖋリ┤⚍ᖋ┤ᒷ", // Dropdown
|
||||
"settings.option.lyrics.enableYoutubeLyrics": "ᒷリᖋᕊ|:ᒷ ॥ᒍ⚍ᒣ⚍ᕊᒷ |:॥∷╎ᔮϟ ⎓ᒍ∷ ᒲ⚍ϟ╎ᔮ ⍊╎↸ᒷᒍϟ", // Toggle
|
||||
|
||||
// Settings - Connectivity
|
||||
"settings.header.connectivity": "ᔮᒍリリᒷᔮᒣ╎⍊╎ᒣ॥",
|
||||
"settings.header.connectivity.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ᔮᒍリリᒷᔮᒣ╎⍊╎ᒣ॥ ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.",
|
||||
"settings.option.connectivity.discordRPC": "↸╎ϟᔮᒍ∷↸ ∷╎ᔮ⍑ i!∷ᒷϟᒷリᔮᒷ", // Dropdown
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.header.connectivity.discordRPC.cider": "↸╎ϟi!|:ᖋ॥ ᖋϟ 'ᔮ╎↸ᒷ∷'",
|
||||
"settings.header.connectivity.discordRPC.appleMusic": "↸╎ϟi!|:ᖋ॥ ᖋϟ 'ᖋi!i!|:ᒷ ᒲ⚍ϟ╎ᔮ'",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "ᔮ|:ᒷᖋ∷ ↸╎ϟᔮᒍ∷↸ ∷╎ᔮ⍑ i!∷ᒷϟᒷリᔮᒷ ᒍリ i!ᖋ⚍ϟᒷ", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "|:ᖋϟᒣ⎓ᒲ ϟᔮ∷ᒍᕊᕊ|:╎リ┤", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "|:ᖋϟᒣ⎓ᒲ ϟᔮ∷ᒍᕊᕊ|:ᒷ ↸ᒷ|:ᖋ॥ (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "ᒷリᖋᕊ|:ᒷ |:ᖋϟᒣ⎓ᒲ リᒍ∴ i!|:ᖋ॥╎リ┤",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "∷ᒷᒲᒍ⍊ᒷ ⎓ᒷᖋᒣ⚍∷╎リ┤ ᖋ∷ᒣ╎ϟᒣϟ ⎓∷ᒍᒲ ϟᒍリ┤ ᒣ╎ᒣ|:ᒷ (|:ᖋϟᒣ⎓ᒲ)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "⎓╎|:ᒣᒷ∷ |:ᒍᒍi!ᒷ↸ ᒣ∷ᖋᔮ·ǀ· (|:ᖋϟᒣ⎓ᒲ)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
"settings.header.experimental": "ᒷ/i!ᒷ∷╎ᒲᒷリᒣᖋ|:",
|
||||
"settings.header.experimental.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ᒷ/i!ᒷ∷╎ᒲᒷリᒣᖋ|: ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.",
|
||||
"settings.option.experimental.compactUI": "ᔮᒍᒲi!ᖋᔮᒣ ⚍╎", // Toggle
|
||||
"settings.option.experimental.closeButtonBehaviour": "ᔮ|:ᒍϟᒷ ᕊ⚍ᒣᒣᒍリ ᕊᒷ⍑ᖋ⍊╎ᒍ⚍∷",
|
||||
"settings.option.experimental.closeButtonBehaviour.quit": "ᑑ⚍╎ᒣ ᔮ╎↸ᒷ∷",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "ᒲ╎リ╎ᒲ╎∩ᒷ ᒣᒍ ᒣᖋϟ·ǀ·ᕊᖋ∷",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "ᒲ╎リ╎ᒲ╎∩ᒷ ᒣᒍ ϟ॥ϟᒣᒷᒲ ᒣ∷ᖋ॥",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
"spatial.spatialProperties" : "ϟi!ᖋᒣ╎ᖋ|: i!∷ᒍi!ᒷ∷ᒣ╎ᒷϟ",
|
||||
"spatial.width" : "∴╎↸ᒣ⍑",
|
||||
"spatial.height" : "⍑ᒷ╎┤⍑ᒣ",
|
||||
"spatial.depth" : "↸ᒷi!ᒣ⍑",
|
||||
"spatial.gain" : "┤ᖋ╎リ",
|
||||
"spatial.roomMaterials" : "∷ᒍᒍᒲ ᒲᖋᒣᒷ∷╎ᖋ|:ϟ",
|
||||
"spatial.roomDimensions" : "∷ᒍᒍᒲ ↸╎ᒲᒷリϟ╎ᒍリϟ",
|
||||
"spatial.roomPositions" : "∷ᒍᒍᒲ i!ᒍϟ╎ᒣ╎ᒍリϟ",
|
||||
"spatial.setDimensions" : "ϟᒷᒣ ↸╎ᒲᒷリϟ╎ᒍリϟ",
|
||||
"spatial.setPositions" : "ϟᒷᒣ i!ᒍϟ╎ᒣ╎ᒍリϟ",
|
||||
"spatial.up" : "⚍i!",
|
||||
"spatial.front" : "⎓∷ᒍリᒣ",
|
||||
"spatial.left" : "|:ᒷ⎓ᒣ",
|
||||
"spatial.right" : "∷╎┤⍑ᒣ",
|
||||
"spatial.back" : "ᕊᖋᔮ·ǀ·",
|
||||
"spatial.down" : "↸ᒍ∴リ",
|
||||
"spatial.listener" : "|:╎ϟᒣᒷリᒷ∷",
|
||||
"spatial.audioSource" : "ᖋ⚍↸╎ᒍ ϟᒍ⚍∷ᔮᒷ",
|
||||
|
||||
// Settings - Unfinished
|
||||
"settings.header.unfinished": "⚍リ⎓╎リ╎ϟ⍑ᒷ↸",
|
||||
|
||||
// Web Remote
|
||||
"remote.web.title": "ᔮ╎↸ᒷ∷ ∷ᒷᒲᒍᒣᒷ",
|
||||
"remote.web.description": "ϟᔮᖋリ ᒣ⍑ᒷ ᑑ∷ ᔮᒍ↸ᒷ ᒣᒍ i!ᖋ╎∷ ॥ᒍ⚍∷ i!⍑ᒍリᒷ ⚍i! ∴╎ᒣ⍑ ᒣ⍑╎ϟ ᔮ╎↸ᒷ∷ ╎リϟᒣᖋリᔮᒷ",
|
||||
|
||||
// About
|
||||
"about.thanks": "ᒲᖋ⋮ᒍ∷ ᒣ⍑ᖋリ·ǀ·ϟ ᒣᒍ ᒣ⍑ᒷ ᔮ╎↸ᒷ∷ ᔮᒍ|:|:ᒷᔮᒣ╎⍊ᒷ ᒣᒷᖋᒲ ᖋリ↸ ᖋ|:|: ᒍ⎓ ᒍ⚍∷ ᔮᒍリᒣ∷╎ᕊ⚍ᒣᒍ∷ϟ."
|
||||
}
|
|
@ -1,4 +1,11 @@
|
|||
{ // Base File
|
||||
|
||||
// i18n Info
|
||||
"i18n.languageName": "English", // name of language in native language
|
||||
"i18n.languageNameEnglish": "English", // name of language in English
|
||||
"i18n.category": "main", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
||||
// App info
|
||||
"app.name": "Cider",
|
||||
|
||||
|
@ -98,6 +105,10 @@
|
|||
"term.developer": "Developer",
|
||||
"term.socialTeam": "Social Team",
|
||||
"term.contributors": "Contributors",
|
||||
"term.equalizer": "Equalizer",
|
||||
"term.reset": "Reset",
|
||||
"term.tracks": "tracks", // Assume x amount of tracks. e.g. 50 tracks
|
||||
|
||||
|
||||
// Home
|
||||
"home.title": "Home",
|
||||
|
@ -158,6 +169,9 @@
|
|||
"action.dislike": "Dislike",
|
||||
"action.undoDislike": "Undo dislike",
|
||||
"action.showWebRemoteQR": "Show Web Remote QR",
|
||||
"action.playTracksNext": "Play ${app.selectedMediaItems.length} tracks next",
|
||||
"action.playTracksLater": "Play ${app.selectedMediaItems.length} tracks later",
|
||||
"action.removeTracks": "Remove ${self.selectedItems.length} tracks from queue",
|
||||
|
||||
// Settings - Audio
|
||||
"settings.header.audio": "Audio",
|
||||
|
@ -220,12 +234,17 @@
|
|||
"settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Delay (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable LastFM Now Playing",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (LastFM)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
"settings.header.experimental": "Experimental",
|
||||
"settings.header.experimental.description": "Adjust the experimental settings for Cider.",
|
||||
"settings.option.experimental.compactUI": "Compact UI", // Toggle
|
||||
"settings.option.experimental.closeButtonBehaviour": "Close Button Behaviour",
|
||||
"settings.option.experimental.closeButtonBehaviour.quit": "Quit Cider",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "Minimize to taskbar",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "Minimize to system tray",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
|
@ -233,6 +252,7 @@
|
|||
"spatial.width" : "Width",
|
||||
"spatial.height" : "Height",
|
||||
"spatial.depth" : "Depth",
|
||||
"spatial.gain" : "Gain",
|
||||
"spatial.roomMaterials" : "Room Materials",
|
||||
"spatial.roomDimensions" : "Room Dimensions",
|
||||
"spatial.roomPositions" : "Room Positions",
|
||||
|
@ -254,6 +274,6 @@
|
|||
"remote.web.title": "Cider Remote",
|
||||
"remote.web.description": "Scan the QR code to pair your phone up with this Cider instance",
|
||||
|
||||
//About
|
||||
// About
|
||||
"about.thanks": "Major thanks to the Cider Collective Team and all of our contributors."
|
||||
}
|
|
@ -4,6 +4,12 @@
|
|||
|
||||
"date.format": "${y}年${m}月${d}日",
|
||||
|
||||
// i18n Info
|
||||
"i18n.languageName": "日本語", // name of language in native language
|
||||
"i18n.languageNameEnglish": "Japanese", // name of language in English
|
||||
"i18n.category": "main", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
||||
// Dialogs
|
||||
"dialog.cancel": "キャンセル",
|
||||
"dialog.ok": "OK",
|
||||
|
@ -71,6 +77,9 @@
|
|||
"term.enabled": "ON",
|
||||
"term.disabled": "OFF",
|
||||
"term.connect": "接続",
|
||||
"term.connecting": "接続中",
|
||||
"term.disconnect": "切断",
|
||||
"term.authed": "認証済み",
|
||||
"term.confirm": "よろしいでしょうか?",
|
||||
"term.more": "もっと",
|
||||
"term.less": "減らす",
|
||||
|
@ -84,9 +93,20 @@
|
|||
"term.fullscreenView": "全画面表示",
|
||||
"term.defaultView": "ウィンドウ表示",
|
||||
"term.spacializedAudioSetting": "オーディオ空間化設定",
|
||||
"term.clearAll": "クリア",
|
||||
"term.clearAll": "消去",
|
||||
"term.recentStations": "最近の再生",
|
||||
"term.language": "言語",
|
||||
"term.noLyrics": "ローディング。。 / 歌詞が見つからない / 器楽曲.",
|
||||
"term.copyright": "著作権",
|
||||
"term.rightsReserved": "All Rights Reserved.", // Translation does not exist in Japanese
|
||||
"term.sponsor": "スポンサーになりましょう",
|
||||
"term.ciderTeam": "Cider チーム",
|
||||
"term.developer": "開発者",
|
||||
"term.socialTeam": "ソーシャル チーム",
|
||||
"term.contributors": "貢献者",
|
||||
"term.equalizer": "イコライザー",
|
||||
"term.reset": "リセット",
|
||||
"term.tracks": "曲", // Assume x amount of tracks. e.g. 50 tracks
|
||||
|
||||
// Home
|
||||
"home.title": "ホーム",
|
||||
|
@ -103,20 +123,30 @@
|
|||
"error.noResults": "見つかりませんでした",
|
||||
"error.noResults.description": "もう一度お試しください。",
|
||||
|
||||
//Podcasts
|
||||
"podcast.followOnCider": "Ciderでフォロー",
|
||||
"podcast.followedOnCider": "フォロー中",
|
||||
"podcast.subscribeOnItunes": "iTunesで購読",
|
||||
"podcast.subscribedOnItunes": "購読中",
|
||||
"podcast.itunesStore": "iTunes Store",
|
||||
"podcast.episodes": "番組",
|
||||
"podcast.playEpisode": "再生",
|
||||
"podcast.website": "Podcast ウェブ",
|
||||
|
||||
// Actions
|
||||
"action.addToLibrary": "ライブラリに追加",
|
||||
"action.addToLibrary.success": "ライブラリに追加されました",
|
||||
"action.addToLibrary.error": "ライブラリへの追加に失敗しました",
|
||||
"action.removeFromLibrary": "ライブラリから削除",
|
||||
"action.removeFromLibrary.success": "ライブラリから削除されました",
|
||||
"action.addToQueue": "キューに追加",
|
||||
"action.addToQueue.success": "キューに追加されました",
|
||||
"action.addToQueue": "「次はこちら」に項目を追加",
|
||||
"action.addToQueue.success": "「次はこちら」に項目を追加されました",
|
||||
"action.addToQueue.error": "操作を完了できませんでした",
|
||||
"action.addToPlaylist": "プレイリストに追加",
|
||||
"action.removeFromPlaylist": "プレイリストから削除",
|
||||
"action.addToFavorites": " ",
|
||||
"action.removeFromQueue": "キューから削除",
|
||||
"action.removeFromQueue.success": "キューから削除されました",
|
||||
"action.addToFavorites": "ラブに追加",
|
||||
"action.removeFromQueue": "「次はこちら」から項目を削除",
|
||||
"action.removeFromQueue.success": "「次はこちら」から項目を削除されました",
|
||||
"action.removeFromQueue.error": "操作を完了できませんでした",
|
||||
"action.follow": "フォロー",
|
||||
"action.follow.success": "フォロー中",
|
||||
|
@ -131,12 +161,16 @@
|
|||
"action.goToAlbum": "アルバムへ移動",
|
||||
"action.moveToTop": "上に戻る",
|
||||
"action.share": "曲を共有",
|
||||
"action.rename": "リネーム",
|
||||
"action.rename": "名前の変更",
|
||||
"action.love": "ラブ",
|
||||
"action.unlove": "ラブを解除",
|
||||
"action.dislike": "これに似たものをすすめない",
|
||||
"action.undoDislike": "「これと似た曲のおすすめを減らす」を取り消す",
|
||||
"action.showWebRemoteQR": "WEBリモコンQRコードを表示",
|
||||
"action.playTracksNext": "${app.selectedMediaItems.length}曲が次に再生",
|
||||
"action.playTracksLater": "${app.selectedMediaItems.length}曲が最後に再生",
|
||||
"action.removeTracks": "${self.selectedItems.length}曲が「次はこちら」から削除",
|
||||
|
||||
// Settings - Audio
|
||||
"settings.header.audio": "オーディオ",
|
||||
"settings.header.audio.description": "Ciderのオーディオ設定",
|
||||
|
@ -195,6 +229,9 @@
|
|||
"settings.header.connectivity.discordRPC.appleMusic": "'Apple Music' を表示する",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "一時停止時にDiscord Rich Presenceをクリアする", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Delay (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable LastFM Now Playing",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
|
@ -203,11 +240,34 @@
|
|||
"settings.option.experimental.compactUI": "コンパクトインターフェース", // Toggle
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
"spatial.spatialProperties" : "空間化のプロパティ",
|
||||
"spatial.width" : "幅",
|
||||
"spatial.height" : "高さ",
|
||||
"spatial.depth" : "奥行",
|
||||
"spatial.gain" : "ゲイン",
|
||||
"spatial.roomMaterials" : "部屋のマテリアル",
|
||||
"spatial.roomDimensions" : "部屋の大きさ",
|
||||
"spatial.roomPositions" : "部屋の位置",
|
||||
"spatial.setDimensions" : "大きさを設定",
|
||||
"spatial.setPositions" : "位置を設定",
|
||||
"spatial.up" : "上",
|
||||
"spatial.front" : "前",
|
||||
"spatial.left" : "左",
|
||||
"spatial.right" : "右",
|
||||
"spatial.back" : "後",
|
||||
"spatial.down" : "下",
|
||||
"spatial.listener" : "リスナー",
|
||||
"spatial.audioSource" : "音源",
|
||||
|
||||
// Settings - Unfinished
|
||||
"settings.header.unfinished": "未完成",
|
||||
|
||||
// Web Remote
|
||||
"remote.web.title": "Cider リモート",
|
||||
"remote.web.description": "QRコードを使用して、Ciderとスマートフォンをペアリングする"
|
||||
"remote.web.description": "QRコードを使用して、Ciderとスマートフォンをペアリングする",
|
||||
|
||||
//About
|
||||
"about.thanks": "Cider Collective とご協力いただいた貢献者様に感謝申し上げます。"
|
||||
|
||||
}
|
||||
|
|
|
@ -1,4 +1,11 @@
|
|||
{
|
||||
|
||||
// i18n Info
|
||||
"i18n.languageName": "Türkçe", // name of language in native language
|
||||
"i18n.languageNameEnglish": "Turkish", // name of language in English
|
||||
"i18n.category": "main", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "gms10ur", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
||||
// App info
|
||||
"app.name": "Cider",
|
||||
|
||||
|
@ -74,6 +81,7 @@
|
|||
"term.connect": "Bağlan",
|
||||
"term.connecting": "Bağlanıyor",
|
||||
"term.authed": "Bağlantı sağlandı",
|
||||
"term.disconnect": "Bağlantıyı Kes",
|
||||
"term.confirm": "Onayla?",
|
||||
"term.more": "Daha Fazla",
|
||||
"term.less": "Daha Az",
|
||||
|
@ -98,6 +106,9 @@
|
|||
"term.developer": "Geliştirici",
|
||||
"term.socialTeam": "Sosyal Ekip",
|
||||
"term.contributors": "Katkıda Bulunanlar",
|
||||
"term.equalizer": "Ekolayzer",
|
||||
"term.reset": "Sıfırla",
|
||||
"term.tracks": "adet şarkı", // Assume x amount of tracks. e.g. 50 tracks
|
||||
|
||||
// Home
|
||||
"home.title": "Ana Sayfa",
|
||||
|
@ -159,6 +170,10 @@
|
|||
"action.dislike": "Bunun Gibileri Daha Az Öner",
|
||||
"action.undoDislike": "Bunun Gibileri Daha Az Önermeyi Geri Al",
|
||||
"action.showWebRemoteQR": "Uzaktan Kumanda Bağla",
|
||||
"action.playTracksNext": "Sonrasında ${app.selectedMediaItems.length} şarkıları çal",
|
||||
"action.playTracksLater": "En Son ${app.selectedMediaItems.length} şarkıları çal",
|
||||
"action.removeTracks": "Sıradan ${self.selectedItems.length} şarkıları kaldır",
|
||||
|
||||
|
||||
// Settings - Audio
|
||||
"settings.header.audio": "Çalma / Oynatma",
|
||||
|
@ -220,12 +235,18 @@
|
|||
"settings.header.connectivity.discordRPC.appleMusic": "'Apple Music' Olarak",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "Duraklatıldığında Discord'da Gösterme", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "LastFM Bağlantısı", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Albüm sanatçısını Scrobbledan kaldır(LastFM)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Tekrar edilen şarkıyı filtrele (LastFM)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
"settings.header.experimental": "Deneysel",
|
||||
"settings.header.experimental.description": "Cider'deki deneysel özelliklere erişim sağlayın. (Not: Bazı özellikler düzgün çalışmayabilir.)",
|
||||
"settings.option.experimental.compactUI": "Kompakt Arayüz", // Toggle
|
||||
"settings.option.experimental.closeButtonBehaviour": "Kapat düğmesi davranışı",
|
||||
"settings.option.experimental.closeButtonBehaviour.quit": "Cider'den çık",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "Simge durumuna küçült",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "Görev çubuğuna küçült",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
|
@ -257,5 +278,4 @@
|
|||
//About
|
||||
"about.thanks": "Cider Collective Ekibine ve tüm katkıda bulunanlara çok teşekkür ederiz."
|
||||
|
||||
|
||||
}
|
|
@ -4,6 +4,12 @@
|
|||
|
||||
"date.format": "${y}年${m}月${d}日",
|
||||
|
||||
// i18n Info
|
||||
"i18n.languageName": "中文(中国)", // name of language in native language
|
||||
"i18n.languageNameEnglish": "Chinese (China)", // name of language in English
|
||||
"i18n.category": "main", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
||||
// Dialogs
|
||||
"dialog.cancel": "取消",
|
||||
"dialog.ok": "确定",
|
||||
|
@ -71,6 +77,9 @@
|
|||
"term.enabled": "已启用",
|
||||
"term.disabled": "已禁用",
|
||||
"term.connect": "连接",
|
||||
"term.connecting": "连接中",
|
||||
"term.disconnect": "断开",
|
||||
"term.authed": "已认证",
|
||||
"term.confirm": "确认?",
|
||||
"term.more": "更多",
|
||||
"term.less": "较少",
|
||||
|
@ -87,6 +96,17 @@
|
|||
"term.clearAll": "清空",
|
||||
"term.recentStations": "最近播放的频道",
|
||||
"term.language": "语言",
|
||||
"term.noLyrics": "加载中。。/ 搜索无结果 / 纯音乐",
|
||||
"term.copyright": "版权所有",
|
||||
"term.rightsReserved": "保留所有权利。",
|
||||
"term.sponsor": "赞助",
|
||||
"term.ciderTeam": "Cider 团队",
|
||||
"term.developer": "开发者",
|
||||
"term.socialTeam": "媒体团队",
|
||||
"term.contributors": "贡献者",
|
||||
"term.equalizer": "均衡器",
|
||||
"term.reset": "重置",
|
||||
"term.tracks": "首歌曲", // Assume x amount of tracks. e.g. 50 tracks
|
||||
|
||||
// Home
|
||||
"home.title": "主页",
|
||||
|
@ -104,6 +124,17 @@
|
|||
"error.noResults": "没有结果",
|
||||
"error.noResults.description": "尝试更改搜索条件。",
|
||||
|
||||
//Podcasts
|
||||
"podcast.followOnCider": "在 Cider 中追踪",
|
||||
"podcast.followedOnCider": "已追踪",
|
||||
"podcast.subscribeOnItunes": "在 iTunes 上订阅",
|
||||
"podcast.subscribedOnItunes": "已订阅",
|
||||
"podcast.itunesStore": "iTunes Store", // Follow brand term
|
||||
"podcast.episodes": "单集",
|
||||
"podcast.playEpisode": "播放单集",
|
||||
"podcast.website": "Podcast 网站",
|
||||
|
||||
|
||||
// Actions
|
||||
"action.addToLibrary": "加入资料库",
|
||||
"action.addToLibrary.success": "成功加入资料库",
|
||||
|
@ -138,6 +169,10 @@
|
|||
"action.dislike": "减少此类建议",
|
||||
"action.undoDislike": "增加此类建议",
|
||||
"action.showWebRemoteQR": "显示远程控制的二维码",
|
||||
"action.playTracksNext": "插播 ${app.selectedMediaItems.length} 首歌曲",
|
||||
"action.playTracksLater": "最后播放 ${app.selectedMediaItems.length} 首歌曲",
|
||||
"action.removeTracks": "从队列中移除 ${self.selectedItems.length} 首歌曲",
|
||||
|
||||
// Settings - Audio
|
||||
"settings.header.audio": "音频",
|
||||
"settings.header.audio.description": "调整 Cider 的音频设置",
|
||||
|
@ -196,6 +231,9 @@
|
|||
"settings.header.connectivity.discordRPC.appleMusic": "显示正在玩 'Apple Music'",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "暂停时清除Discord 动态", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling 记录", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble 延迟 (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "启用 LastFM 正在播放",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "从歌名里去除艺人推荐 (LastFM)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
|
@ -204,10 +242,33 @@
|
|||
"settings.option.experimental.compactUI": "紧凑型 UI", // Toggle
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
"spatial.spatialProperties" : "空间属性",
|
||||
"spatial.width" : "宽度",
|
||||
"spatial.height" : "高度",
|
||||
"spatial.depth" : "深度",
|
||||
"spatial.gain": "增益",
|
||||
"spatial.roomMaterials" : "空间材质",
|
||||
"spatial.roomDimensions" : "空间尺寸",
|
||||
"spatial.roomPositions" : "空间位置",
|
||||
"spatial.setDimensions" : "设置尺寸",
|
||||
"spatial.setPositions" : "设置位置",
|
||||
"spatial.up" : "上",
|
||||
"spatial.front" : "前",
|
||||
"spatial.left" : "左",
|
||||
"spatial.right" : "右",
|
||||
"spatial.back" : "后",
|
||||
"spatial.down" : "下",
|
||||
"spatial.listener" : "您",
|
||||
"spatial.audioSource" : "音源",
|
||||
|
||||
// Settings - Unfinished
|
||||
"settings.header.unfinished": "未完成",
|
||||
|
||||
// Web Remote
|
||||
"remote.web.title": "Cider 远程控制",
|
||||
"remote.web.description": "扫描以下的二维码以控制 Cider"
|
||||
"remote.web.description": "扫描以下的二维码以控制 Cider",
|
||||
|
||||
//About
|
||||
"about.thanks": "郑重感谢 Cider Collective 以及为这个项目提供支持的贡献者。"
|
||||
}
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
{
|
||||
// i18n Info
|
||||
"i18n.languageName": "繁體中文(香港)", // name of language in native language
|
||||
"i18n.languageNameEnglish": "Traditional Chinese (Hong Kong)", // name of language in English
|
||||
"i18n.category": "main", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "@kyw504100 @maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
||||
// App info
|
||||
"app.name": "Cider",
|
||||
|
||||
|
@ -98,6 +104,9 @@
|
|||
"term.developer": "開發者",
|
||||
"term.socialTeam": "社交團隊",
|
||||
"term.contributors": "貢獻者",
|
||||
"term.equalizer": "等化器",
|
||||
"term.reset": "重設",
|
||||
"term.tracks": "首歌曲", // Assume x amount of tracks. e.g. 50 tracks
|
||||
|
||||
// Home
|
||||
"home.title": "主頁",
|
||||
|
@ -219,13 +228,18 @@
|
|||
"settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling 記錄", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble 延遲 (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 LastFM 正在播放",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (LastFM)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (LastFM)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
"settings.header.experimental": "實驗性功能",
|
||||
"settings.header.experimental.description": "調整Cider的實驗性功能",
|
||||
"settings.option.experimental.compactUI": "緊凑型 UI", // Toggle
|
||||
"settings.option.experimental.closeButtonBehaviour": "關閉按鈕行為",
|
||||
"settings.option.experimental.closeButtonBehaviour.quit": "結束 Cider",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "縮小至工作列",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "縮小至系統托盤",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
|
@ -233,6 +247,7 @@
|
|||
"spatial.width" : "闊度",
|
||||
"spatial.height" : "高度",
|
||||
"spatial.depth" : "深度",
|
||||
"spatial.gain" : "增益",
|
||||
"spatial.roomMaterials" : "空間材質",
|
||||
"spatial.roomDimensions" : "空間大小",
|
||||
"spatial.roomPositions" : "空間位置",
|
||||
|
@ -255,5 +270,5 @@
|
|||
"remote.web.description": "掃描以下的二維碼以控制 Cider",
|
||||
|
||||
//About
|
||||
"about.thanks": "感謝Cider Collective團隊以及所有貢獻者所作出的貢獻。"
|
||||
"about.thanks": "感謝 Cider Collective 以及所有貢獻者所作出的貢獻。"
|
||||
}
|
|
@ -4,6 +4,13 @@
|
|||
|
||||
"date.format": "${y}年${m}月${d}日",
|
||||
|
||||
// i18n Info
|
||||
"i18n.languageName": "中文(台湾)", // name of language in native language
|
||||
"i18n.languageNameEnglish": "Chinese (Taiwan)", // name of language in English
|
||||
"i18n.category": "main", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
||||
|
||||
// Dialogs
|
||||
"dialog.cancel": "取消",
|
||||
"dialog.ok": "OK",
|
||||
|
@ -70,6 +77,9 @@
|
|||
"term.enabled": "已啟用",
|
||||
"term.disabled": "已停用",
|
||||
"term.connect": "連接",
|
||||
"term.connecting": "連接中",
|
||||
"term.disconnect": "斷開",
|
||||
"term.authed": "已授權",
|
||||
"term.confirm": "確定?",
|
||||
"term.more": "更多",
|
||||
"term.less": "更少",
|
||||
|
@ -86,6 +96,19 @@
|
|||
"term.clearAll": "清空",
|
||||
"term.recentStations": "最近收聽的廣播",
|
||||
"term.language": "語言",
|
||||
"term.noLyrics": "正在載入。。/ 無歌詞結果 / 純音樂",
|
||||
"term.copyright": "版權聲明",
|
||||
"term.rightsReserved": "保留所有權利。",
|
||||
"term.sponsor": "贊助",
|
||||
"term.ciderTeam": "Cider 團隊",
|
||||
"term.developer": "開發者",
|
||||
"term.socialTeam": "公關團隊",
|
||||
"term.contributors": "貢獻者",
|
||||
"term.equalizer": "等化器",
|
||||
"term.reset": "重置",
|
||||
"term.tracks": "首歌曲", // Assume x amount of tracks. e.g. 50 tracks
|
||||
|
||||
|
||||
// Home
|
||||
"home.title": "主頁",
|
||||
"home.recentlyPlayed": "最近播放",
|
||||
|
@ -101,6 +124,16 @@
|
|||
"error.noResults": "沒有結果",
|
||||
"error.noResults.description": "嘗試新的搜尋項目。",
|
||||
|
||||
//Podcasts
|
||||
"podcast.followOnCider": "在 Cider 上追蹤",
|
||||
"podcast.followedOnCider": "已追蹤",
|
||||
"podcast.subscribeOnItunes": "在 iTunes 上訂閱",
|
||||
"podcast.subscribedOnItunes": "已訂閱",
|
||||
"podcast.itunesStore": "iTunes Store", // Follows brand term
|
||||
"podcast.episodes": "單集",
|
||||
"podcast.playEpisode": "播放單集",
|
||||
"podcast.website": "Podcast 網站",
|
||||
|
||||
// Actions
|
||||
"action.addToLibrary": "加入資料庫",
|
||||
"action.addToLibrary.success": "成功加入資料庫",
|
||||
|
@ -129,12 +162,15 @@
|
|||
"action.goToAlbum": "前往專輯",
|
||||
"action.moveToTop": "移至頂端",
|
||||
"action.share": "分享歌曲",
|
||||
"action.rename": "Rename",
|
||||
"action.rename": "重新命名",
|
||||
"action.love": "喜愛",
|
||||
"action.unlove": "取消喜愛",
|
||||
"action.dislike": "減少此類建議",
|
||||
"action.undoDislike": "還原減小此類建議",
|
||||
"action.showWebRemoteQR": "顯示遠程遙控行動條碼",
|
||||
"action.playTracksNext": "插播 ${app.selectedMediaItems.length} 首歌曲",
|
||||
"action.playTracksLater": "最後播放 ${app.selectedMediaItems.length} 首歌曲",
|
||||
"action.removeTracks": "從待播清單刪除 ${self.selectedItems.length} 首歌曲",
|
||||
|
||||
// Settings - Audio
|
||||
"settings.header.audio": "音訊",
|
||||
|
@ -194,6 +230,9 @@
|
|||
"settings.header.connectivity.discordRPC.appleMusic": "顯示正在玩 'Apple Music'",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "暫停時清除 Discord 動態", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling 記錄", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble 延遲 (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 LastFM 目前聆聽", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (LastFM)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
|
@ -202,10 +241,33 @@
|
|||
"settings.option.experimental.compactUI": "緊凑型 UI", // Toggle
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
"spatial.spatialProperties" : "空間化屬性",
|
||||
"spatial.width" : "寬度",
|
||||
"spatial.height" : "高度",
|
||||
"spatial.depth" : "深度",
|
||||
"spatial.gain" : "增益",
|
||||
"spatial.roomMaterials" : "空間材質",
|
||||
"spatial.roomDimensions" : "空間尺寸",
|
||||
"spatial.roomPositions" : "空間位置",
|
||||
"spatial.setDimensions" : "設定尺寸",
|
||||
"spatial.setPositions" : "設定位置",
|
||||
"spatial.up" : "上",
|
||||
"spatial.front" : "前",
|
||||
"spatial.left" : "左",
|
||||
"spatial.right" : "右",
|
||||
"spatial.back" : "後",
|
||||
"spatial.down" : "下",
|
||||
"spatial.listener" : "聽衆",
|
||||
"spatial.audioSource" : "音訊來源",
|
||||
|
||||
// Settings - Unfinished
|
||||
"settings.header.unfinished": "未完成",
|
||||
|
||||
// Web Remote
|
||||
"remote.web.title": "Cider 遠控",
|
||||
"remote.web.description": "掃描以下的行動條碼以控制 Cider"
|
||||
"remote.web.description": "掃描以下的行動條碼以控制 Cider",
|
||||
|
||||
//About
|
||||
"about.thanks": "著重感謝 Cider Collective 的成員以及所有為項目付出的貢獻者。"
|
||||
}
|
|
@ -50,7 +50,7 @@ export class AppEvents {
|
|||
/***********************************************************************************************************************
|
||||
* Commandline arguments
|
||||
**********************************************************************************************************************/
|
||||
switch (store.get("visual.hw_acceleration")) {
|
||||
switch (store.visual.hw_acceleration) {
|
||||
default:
|
||||
case "default":
|
||||
electron.app.commandLine.appendSwitch('enable-accelerated-mjpeg-decode')
|
||||
|
@ -75,6 +75,10 @@ export class AppEvents {
|
|||
break;
|
||||
}
|
||||
|
||||
if (process.platform === "linux") {
|
||||
electron.app.commandLine.appendSwitch('disable-features', 'MediaSessionService');
|
||||
}
|
||||
|
||||
/***********************************************************************************************************************
|
||||
* Protocols
|
||||
**********************************************************************************************************************/
|
||||
|
|
|
@ -5,10 +5,11 @@ import * as electron from 'electron'
|
|||
export default class PluginHandler {
|
||||
private basePluginsPath = path.join(__dirname, '../plugins');
|
||||
private userPluginsPath = path.join(electron.app.getPath('userData'), 'plugins');
|
||||
private pluginsList: any = {};
|
||||
|
||||
constructor() {
|
||||
private readonly pluginsList: any = {};
|
||||
private readonly _store: any;
|
||||
|
||||
constructor(config: any) {
|
||||
this._store = config;
|
||||
this.pluginsList = this.getPlugins();
|
||||
}
|
||||
|
||||
|
@ -23,7 +24,7 @@ export default class PluginHandler {
|
|||
if (plugins[file] || plugin.name in plugins) {
|
||||
console.log(`[${plugin.name}] Plugin already loaded / Duplicate Class Name`);
|
||||
} else {
|
||||
plugins[file] = new plugin(electron.app);
|
||||
plugins[file] = new plugin(electron.app, this._store);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -38,7 +39,7 @@ export default class PluginHandler {
|
|||
if (plugins[file] || plugin in plugins) {
|
||||
console.log(`[${plugin.name}] Plugin already loaded / Duplicate Class Name`);
|
||||
} else {
|
||||
plugins[file] = new plugin(electron.app);
|
||||
plugins[file] = new plugin(electron.app, this._store);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -2,7 +2,7 @@ import * as Store from 'electron-store';
|
|||
import * as electron from "electron";
|
||||
|
||||
export class ConfigStore {
|
||||
public store: Store | undefined;
|
||||
private _store: Store;
|
||||
|
||||
private defaults: any = {
|
||||
"general": {
|
||||
|
@ -27,7 +27,7 @@ export class ConfigStore {
|
|||
"volume": 1,
|
||||
"lastVolume": 1,
|
||||
"muted": false,
|
||||
"quality": "990",
|
||||
"quality": "256",
|
||||
"seamless_audio": true,
|
||||
"normalization": false,
|
||||
"spatial": false,
|
||||
|
@ -49,6 +49,11 @@ export class ConfigStore {
|
|||
"down": 'acoustic-ceiling-tiles',
|
||||
"up": 'acoustic-ceiling-tiles',
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000],
|
||||
'gain': [0,0,0,0,0,0,0,0,0,0],
|
||||
'Q' : [1,1,1,1,1,1,1,1,1,1]
|
||||
}
|
||||
},
|
||||
"visual": {
|
||||
|
@ -74,6 +79,7 @@ export class ConfigStore {
|
|||
"scrobble_after": 30,
|
||||
"auth_token": "",
|
||||
"enabledRemoveFeaturingArtists": true,
|
||||
"filterLoop": true,
|
||||
"NowPlaying": "true"
|
||||
},
|
||||
"advanced": {
|
||||
|
@ -84,14 +90,26 @@ export class ConfigStore {
|
|||
private migrations: any = {}
|
||||
|
||||
constructor() {
|
||||
this.store = new Store({
|
||||
this._store = new Store({
|
||||
name: 'cider-config',
|
||||
defaults: this.defaults,
|
||||
migrations: this.migrations,
|
||||
});
|
||||
|
||||
this.store.set(this.mergeStore(this.defaults, this.store.store))
|
||||
this.ipcHandler(this.store);
|
||||
this._store.set(this.mergeStore(this.defaults, this._store.store))
|
||||
this.ipcHandler(this._store);
|
||||
}
|
||||
|
||||
get store() {
|
||||
return this._store.store;
|
||||
}
|
||||
|
||||
get(key: string) {
|
||||
return this._store.get(key);
|
||||
}
|
||||
|
||||
set(key: string, value: any) {
|
||||
this._store.set(key, value);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -15,10 +15,10 @@ import {wsapi} from "./wsapi";
|
|||
import * as jsonc from "jsonc";
|
||||
|
||||
export class Win {
|
||||
win: any | undefined = null;
|
||||
app: any | undefined = null;
|
||||
store: any | undefined = null;
|
||||
devMode: boolean = !electron.app.isPackaged;
|
||||
private win: any | undefined = null;
|
||||
private app: any | undefined = null;
|
||||
private store: any | undefined = null;
|
||||
private devMode: boolean = !electron.app.isPackaged;
|
||||
|
||||
constructor(app: electron.App, store: any) {
|
||||
this.app = app;
|
||||
|
|
|
@ -13,7 +13,7 @@ import PluginHandler from "./base/plugins";
|
|||
const config = new ConfigStore();
|
||||
const App = new AppEvents(config.store);
|
||||
const Cider = new Win(electron.app, config.store)
|
||||
const plug = new PluginHandler();
|
||||
const plug = new PluginHandler(config.store);
|
||||
|
||||
let win: Electron.BrowserWindow;
|
||||
|
||||
|
@ -34,7 +34,7 @@ electron.app.on('ready', () => {
|
|||
win = await Cider.createWindow()
|
||||
App.bwCreated(win);
|
||||
/// please dont change this for plugins to get proper and fully initialized Win objects
|
||||
plug.callPlugins('onReady', Cider);
|
||||
plug.callPlugins('onReady', win);
|
||||
win.on("ready-to-show", () => {
|
||||
win.show();
|
||||
});
|
||||
|
|
|
@ -5,6 +5,7 @@ export default class ExamplePlugin {
|
|||
*/
|
||||
private _win: any;
|
||||
private _app: any;
|
||||
private _store: any;
|
||||
|
||||
/**
|
||||
* Base Plugin Details (Eventually implemented into a GUI in settings)
|
||||
|
@ -17,8 +18,9 @@ export default class ExamplePlugin {
|
|||
/**
|
||||
* Runs on plugin load (Currently run on application start)
|
||||
*/
|
||||
constructor(app: any) {
|
||||
constructor(app: any, store: any) {
|
||||
this._app = app;
|
||||
this._store = store;
|
||||
console.log('Example plugin loaded');
|
||||
}
|
||||
|
||||
|
@ -42,7 +44,7 @@ export default class ExamplePlugin {
|
|||
* @param attributes Music Attributes (attributes.state = current state)
|
||||
*/
|
||||
onPlaybackStateDidChange(attributes: object): void {
|
||||
console.log('onPlaybackStateDidChange has been called ' + i +' times');
|
||||
console.log('onPlaybackStateDidChange has been called ' + i + ' times');
|
||||
i++
|
||||
}
|
||||
|
||||
|
@ -51,7 +53,7 @@ export default class ExamplePlugin {
|
|||
* @param attributes Music Attributes
|
||||
*/
|
||||
onNowPlayingItemDidChange(attributes: object): void {
|
||||
console.log('onNowPlayingDidChange has been called ' + k +' times');
|
||||
console.log('onNowPlayingDidChange has been called ' + k + ' times');
|
||||
k++
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ export default class sendSongToTitlebar {
|
|||
* @param attributes Music Attributes (attributes.state = current state)
|
||||
*/
|
||||
onPlaybackStateDidChange(attributes: any): void {
|
||||
this._win.win.setTitle(`${(attributes != null && attributes.name != null && attributes.name.length > 0) ? (attributes.name + " - ") : ''}Cider`)
|
||||
this._win.setTitle(`${(attributes != null && attributes.name != null && attributes.name.length > 0) ? (attributes.name + " - ") : ''}Cider`)
|
||||
}
|
||||
/**
|
||||
* Runs on song change
|
||||
|
|
|
@ -1,26 +1,28 @@
|
|||
import * as electron from 'electron';
|
||||
import * as DiscordRPC from 'discord-rpc'
|
||||
|
||||
export default class DiscordRPCPlugin {
|
||||
/**
|
||||
* Private variables for interaction in plugins
|
||||
*/
|
||||
private _win: any;
|
||||
private _win: Electron.BrowserWindow | undefined;
|
||||
private _app: any;
|
||||
private _store: any;
|
||||
private _discord: any;
|
||||
|
||||
private connect(clientId: any) {
|
||||
this._discord = { isConnected: false };
|
||||
if (this._win.store.store.general.discord_rpc == 0 || this._discord.isConnected) return;
|
||||
this._discord = {isConnected: false};
|
||||
if (this._store.general.discord_rpc == 0 || this._discord.isConnected) return;
|
||||
|
||||
DiscordRPC.register(clientId) // Apparently needed for ask to join, join, spectate etc.
|
||||
const client = new DiscordRPC.Client({ transport: "ipc" });
|
||||
this._discord = Object.assign(client, { error: false, activityCache: null, isConnected: false });
|
||||
const client = new DiscordRPC.Client({transport: "ipc"});
|
||||
this._discord = Object.assign(client, {error: false, activityCache: null, isConnected: false});
|
||||
|
||||
// Login to Discord
|
||||
this._discord.login({ clientId })
|
||||
this._discord.login({clientId})
|
||||
.then(() => {
|
||||
this._discord.isConnected = true;
|
||||
})
|
||||
.catch((e : any) => console.error(`[DiscordRPC][connect] ${e}`));
|
||||
.catch((e: any) => console.error(`[DiscordRPC][connect] ${e}`));
|
||||
|
||||
this._discord.on('ready', () => {
|
||||
console.log(`[DiscordRPC][connect] Successfully Connected to Discord. Authed for user: ${client.user.username} (${client.user.id})`);
|
||||
|
@ -38,13 +40,13 @@ export default class DiscordRPCPlugin {
|
|||
* Disconnects from Discord RPC
|
||||
*/
|
||||
private disconnect() {
|
||||
if (this._win.store.store.general.discord_rpc == 0 || !this._discord.isConnected) return;
|
||||
if (this._store.general.discord_rpc == 0 || !this._discord.isConnected) return;
|
||||
|
||||
try {
|
||||
this._discord.destroy().then(() => {
|
||||
this._discord.isConnected = false;
|
||||
console.log('[DiscordRPC][disconnect] Disconnected from discord.')
|
||||
}).catch((e : any) => console.error(`[DiscordRPC][disconnect] ${e}`));
|
||||
}).catch((e: any) => console.error(`[DiscordRPC][disconnect] ${e}`));
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
}
|
||||
|
@ -54,11 +56,11 @@ export default class DiscordRPCPlugin {
|
|||
* Sets the activity of the client
|
||||
* @param {object} attributes
|
||||
*/
|
||||
private updateActivity(attributes : any) {
|
||||
if (this._win.store.store.general.discord_rpc == 0) return;
|
||||
private updateActivity(attributes: any) {
|
||||
if (this._store.general.discord_rpc == 0) return;
|
||||
|
||||
if (!this._discord.isConnected) {
|
||||
this._discord.clearActivity().catch((e : any) => console.error(`[DiscordRPC][updateActivity] ${e}`));
|
||||
this._discord.clearActivity().catch((e: any) => console.error(`[DiscordRPC][updateActivity] ${e}`));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -67,41 +69,44 @@ export default class DiscordRPCPlugin {
|
|||
const listenURL = `https://cider.sh/p?s&id=${attributes.playParams.id}` // cider://play/s/[id] (for song)
|
||||
//console.log(attributes)
|
||||
|
||||
interface ActObject {
|
||||
interface ActObject extends DiscordRPC.Presence {
|
||||
details?: any,
|
||||
state?: any,
|
||||
startTimestamp?: any,
|
||||
endTimestamp?: any,
|
||||
largeImageKey? : any,
|
||||
largeImageKey?: any,
|
||||
largeImageText?: any,
|
||||
smallImageKey?: any,
|
||||
smallImageText?: any,
|
||||
instance: true,
|
||||
buttons?: [
|
||||
{ label: "Listen on Cider", url?: any },
|
||||
{
|
||||
label: string,
|
||||
url: string
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
let ActivityObject : ActObject | null = {
|
||||
let ActivityObject: ActObject | null = {
|
||||
details: attributes.name,
|
||||
state: `by ${attributes.artistName}`,
|
||||
startTimestamp: attributes.startTime,
|
||||
endTimestamp: attributes.endTime,
|
||||
largeImageKey : (attributes.artwork.url.replace('{w}', '1024').replace('{h}', '1024')) ?? 'cider',
|
||||
largeImageKey: (attributes.artwork.url.replace('{w}', '1024').replace('{h}', '1024')) ?? 'cider',
|
||||
largeImageText: attributes.albumName,
|
||||
smallImageKey: (attributes.status ? 'play' : 'pause'),
|
||||
smallImageText: (attributes.status ? 'Playing' : 'Paused'),
|
||||
instance: true,
|
||||
buttons: [
|
||||
{ label: "Listen on Cider", url: listenURL },
|
||||
{label: "Listen on Cider", url: listenURL},
|
||||
]
|
||||
};
|
||||
if (ActivityObject.largeImageKey == "" || ActivityObject.largeImageKey == null) {
|
||||
ActivityObject.largeImageKey = (this._win.store.store.general.discord_rpc == 1) ? "cider" : "logo"
|
||||
ActivityObject.largeImageKey = (this._store.general.discord_rpc == 1) ? "cider" : "logo"
|
||||
}
|
||||
|
||||
// Remove the pause/play icon and test for clear activity on pause
|
||||
if (this._win.store.store.general.discordClearActivityOnPause == 1) {
|
||||
if (this._store.general.discordClearActivityOnPause == 1) {
|
||||
delete ActivityObject.smallImageKey
|
||||
delete ActivityObject.smallImageText
|
||||
}
|
||||
|
@ -128,12 +133,10 @@ export default class DiscordRPCPlugin {
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Check if its pausing (false) or playing (true)
|
||||
if (!attributes.status) {
|
||||
if (this._win.store.store.general.discordClearActivityOnPause == 1) {
|
||||
this._discord.clearActivity().catch((e : any) => console.error(`[DiscordRPC][clearActivity] ${e}`));
|
||||
if (this._store.general.discordClearActivityOnPause == 1) {
|
||||
this._discord.clearActivity().catch((e: any) => console.error(`[DiscordRPC][clearActivity] ${e}`));
|
||||
ActivityObject = null
|
||||
} else {
|
||||
delete ActivityObject.startTimestamp
|
||||
|
@ -168,8 +171,9 @@ export default class DiscordRPCPlugin {
|
|||
/**
|
||||
* Runs on plugin load (Currently run on application start)
|
||||
*/
|
||||
constructor(app: any) {
|
||||
constructor(app: any, store: any) {
|
||||
this._app = app;
|
||||
this._store = store
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -177,7 +181,7 @@ export default class DiscordRPCPlugin {
|
|||
*/
|
||||
onReady(win: any): void {
|
||||
this._win = win;
|
||||
this.connect((this._win.store.store.general.discord_rpc == 1) ? '911790844204437504' : '886578863147192350');
|
||||
this.connect((this._store.general.discord_rpc == 1) ? '911790844204437504' : '886578863147192350');
|
||||
// electron.ipcMain.on("forceUpdateRPC", (event, attributes : object) => {
|
||||
// this.updateActivity(attributes)
|
||||
// });
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import * as electron from 'electron';
|
||||
import * as fs from 'fs';
|
||||
import {resolve} from 'path';
|
||||
//@ts-ignore
|
||||
|
||||
export default class LastFMPlugin {
|
||||
private sessionPath = resolve(electron.app.getPath('userData'), 'session.json');
|
||||
|
@ -15,6 +14,7 @@ export default class LastFMPlugin {
|
|||
private _win: any;
|
||||
private _app: any;
|
||||
private _lastfm: any;
|
||||
private _store: any;
|
||||
|
||||
private authenticateFromFile() {
|
||||
let sessionData = require(this.sessionPath)
|
||||
|
@ -26,12 +26,12 @@ export default class LastFMPlugin {
|
|||
|
||||
authenticate() {
|
||||
try {
|
||||
if (this._win.store.store.lastfm.auth_token) {
|
||||
this._win.store.store.lastfm.enabled = true;
|
||||
if (this._store.lastfm.auth_token) {
|
||||
this._store.lastfm.enabled = true;
|
||||
}
|
||||
|
||||
if (!this._win.store.store.lastfm.enabled || !this._win.store.store.lastfm.auth_token) {
|
||||
this._win.store.store.lastfm.enabled = false;
|
||||
if (!this._store.lastfm.enabled || !this._store.lastfm.auth_token) {
|
||||
this._store.lastfm.enabled = false;
|
||||
return
|
||||
}
|
||||
/// dont move this require to top , app wont load
|
||||
|
@ -47,8 +47,8 @@ export default class LastFMPlugin {
|
|||
if (err) {
|
||||
console.error("[LastFM][Session] Session file couldn't be opened or doesn't exist,", err)
|
||||
console.log("[LastFM][Auth] Beginning authentication from configuration")
|
||||
console.log("[LastFM][tk]", this._win.store.store.lastfm.auth_token)
|
||||
this._lastfm.authenticate(this._win.store.store.lastfm.auth_token, (err: any, session: any) => {
|
||||
console.log("[LastFM][tk]", this._store.lastfm.auth_token)
|
||||
this._lastfm.authenticate(this._store.lastfm.auth_token, (err: any, session: any) => {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ export default class LastFMPlugin {
|
|||
}
|
||||
|
||||
private async scrobbleSong(attributes: any) {
|
||||
await new Promise(resolve => setTimeout(resolve, Math.round(attributes.durationInMillis * (this._win.store.store.lastfm.scrobble_after / 100))));
|
||||
await new Promise(resolve => setTimeout(resolve, Math.round(attributes.durationInMillis * (this._store.lastfm.scrobble_after / 100))));
|
||||
const currentAttributes = attributes;
|
||||
|
||||
if (!this._lastfm || this._lastfm.cachedAttributes === attributes) {
|
||||
|
@ -117,7 +117,7 @@ export default class LastFMPlugin {
|
|||
}
|
||||
|
||||
private filterArtistName(artist: any) {
|
||||
if (!this._win.store.store.lastfm.enabledRemoveFeaturingArtists) return artist;
|
||||
if (!this._store.lastfm.enabledRemoveFeaturingArtists) return artist;
|
||||
|
||||
artist = artist.split(' ');
|
||||
if (artist.includes('&')) {
|
||||
|
@ -135,7 +135,7 @@ export default class LastFMPlugin {
|
|||
}
|
||||
|
||||
private updateNowPlayingSong(attributes: any) {
|
||||
if (!this._lastfm || this._lastfm.cachedNowPlayingAttributes === attributes || !this._win.store.store.lastfm.NowPlaying) {
|
||||
if (!this._lastfm || this._lastfm.cachedNowPlayingAttributes === attributes || !this._store.lastfm.NowPlaying) {
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -177,8 +177,9 @@ export default class LastFMPlugin {
|
|||
/**
|
||||
* Runs on plugin load (Currently run on application start)
|
||||
*/
|
||||
constructor(app: any) {
|
||||
constructor(app: any, store: any) {
|
||||
this._app = app;
|
||||
this._store = store
|
||||
electron.app.on('second-instance', (_e: any, argv: any) => {
|
||||
// Checks if first instance is authorized and if second instance has protocol args
|
||||
argv.forEach((value: any) => {
|
||||
|
@ -187,10 +188,10 @@ export default class LastFMPlugin {
|
|||
let authURI = String(argv).split('/auth/')[1];
|
||||
if (authURI.startsWith('lastfm')) { // If we wanted more auth options
|
||||
const authKey = authURI.split('lastfm?token=')[1];
|
||||
this._win.store.store.lastfm.enabled = true;
|
||||
this._win.store.store.lastfm.auth_token = authKey;
|
||||
this._store.lastfm.enabled = true;
|
||||
this._store.lastfm.auth_token = authKey;
|
||||
console.log(authKey);
|
||||
this._win.win.webContents.send('LastfmAuthenticated', authKey);
|
||||
this._win.webContents.send('LastfmAuthenticated', authKey);
|
||||
this.authenticate();
|
||||
}
|
||||
}
|
||||
|
@ -203,9 +204,9 @@ export default class LastFMPlugin {
|
|||
let authURI = String(arg).split('/auth/')[1];
|
||||
if (authURI.startsWith('lastfm')) { // If we wanted more auth options
|
||||
const authKey = authURI.split('lastfm?token=')[1];
|
||||
this._win.store.store.lastfm.enabled = true;
|
||||
this._win.store.store.lastfm.auth_token = authKey;
|
||||
this._win.win.webContents.send('LastfmAuthenticated', authKey);
|
||||
this._store.lastfm.enabled = true;
|
||||
this._store.lastfm.auth_token = authKey;
|
||||
this._win.webContents.send('LastfmAuthenticated', authKey);
|
||||
console.log(authKey);
|
||||
this.authenticate();
|
||||
}
|
||||
|
@ -242,6 +243,9 @@ export default class LastFMPlugin {
|
|||
* @param attributes Music Attributes
|
||||
*/
|
||||
onNowPlayingItemDidChange(attributes: object): void {
|
||||
if (!this._store.lastfm.filterLoop){
|
||||
this._lastfm.cachedNowPlayingAttributes = false;
|
||||
this._lastfm.cachedAttributes = false}
|
||||
this.scrobbleSong(attributes)
|
||||
this.updateNowPlayingSong(attributes)
|
||||
}
|
||||
|
|
149
src/main/plugins/minimizeToTray.ts
Normal file
149
src/main/plugins/minimizeToTray.ts
Normal file
|
@ -0,0 +1,149 @@
|
|||
import * as electron from 'electron';
|
||||
import * as path from 'path';
|
||||
|
||||
|
||||
export default class MinimizeToTray {
|
||||
/**
|
||||
* Private variables for interaction in plugins
|
||||
*/
|
||||
private _win: any;
|
||||
private _app: any;
|
||||
private _store: any;
|
||||
private _tray: any;
|
||||
|
||||
/**
|
||||
* Base Plugin Details (Eventually implemented into a GUI in settings)
|
||||
*/
|
||||
public name: string = 'Minimize to tray';
|
||||
public description: string = 'Allow Cider to minimize to tray';
|
||||
public version: string = '1.0.0';
|
||||
public author: string = 'vapormusic';
|
||||
|
||||
constructor(app: any, store: any) {
|
||||
this._app = app;
|
||||
this._store = store;
|
||||
}
|
||||
|
||||
private SetContextMenu(visibility : any) {
|
||||
let self = this
|
||||
if (visibility) {
|
||||
this._tray.setContextMenu(electron.Menu.buildFromTemplate([
|
||||
// {
|
||||
// label: 'Check for Updates',
|
||||
// click: function () {
|
||||
// app.ame.utils.checkForUpdates(true)
|
||||
// }
|
||||
// },
|
||||
{
|
||||
label: 'Minimize to Tray',
|
||||
click: function () {
|
||||
if (typeof self._win.hide === 'function') {
|
||||
self._win.hide();
|
||||
self.SetContextMenu(false);
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Quit',
|
||||
click: function () {
|
||||
self._app.quit();
|
||||
}
|
||||
}
|
||||
]));
|
||||
} else {
|
||||
this._tray.setContextMenu(electron.Menu.buildFromTemplate([
|
||||
// {
|
||||
// label: 'Check for Updates',
|
||||
// click: function () {
|
||||
// this._app.ame.utils.checkForUpdates(true)
|
||||
// }
|
||||
// },
|
||||
{
|
||||
label: `Show ${electron.app.getName()}`,
|
||||
click: function () {
|
||||
if (typeof self._win.show === 'function') {
|
||||
self._win.show();
|
||||
self.SetContextMenu(true);
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Quit',
|
||||
click: function () {
|
||||
self._app.quit();
|
||||
}
|
||||
}
|
||||
]));
|
||||
}
|
||||
return true
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on app ready
|
||||
*/
|
||||
onReady(win: any): void {
|
||||
this._win = win;
|
||||
const winTray = electron.nativeImage.createFromPath(path.join(__dirname, `../../resources/icons/icon.ico`)).resize({
|
||||
width: 32,
|
||||
height: 32
|
||||
})
|
||||
const macTray = electron.nativeImage.createFromPath(path.join(__dirname, `../../resources/icons/icon.png`)).resize({
|
||||
width: 20,
|
||||
height: 20
|
||||
})
|
||||
const linuxTray = electron.nativeImage.createFromPath(path.join(__dirname, `../../resources/icons/icon.png`)).resize({
|
||||
width: 32,
|
||||
height: 32
|
||||
})
|
||||
let trayIcon : any ;
|
||||
if (process.platform === "win32") {
|
||||
trayIcon = winTray
|
||||
} else if (process.platform === "linux") {
|
||||
trayIcon = linuxTray
|
||||
} else if (process.platform === "darwin") {
|
||||
trayIcon = macTray
|
||||
}
|
||||
|
||||
this._tray = new electron.Tray(trayIcon)
|
||||
this._tray.setToolTip(this._app.getName());
|
||||
this.SetContextMenu(true);
|
||||
|
||||
this._tray.on('double-click', () => {
|
||||
if (typeof this._win.show === 'function') {
|
||||
if (this._win.isVisible()) {
|
||||
this._win.focus()
|
||||
} else {
|
||||
this._win.show()
|
||||
}
|
||||
}
|
||||
})
|
||||
electron.ipcMain.on("minimizeTray", (event, value) => {
|
||||
// listen for close event
|
||||
this._win.hide();
|
||||
this.SetContextMenu(false);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on app stop
|
||||
*/
|
||||
onBeforeQuit(): void {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on playback State Change
|
||||
* @param attributes Music Attributes (attributes.state = current state)
|
||||
*/
|
||||
onPlaybackStateDidChange(attributes: object): void {
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on song change
|
||||
* @param attributes Music Attributes
|
||||
*/
|
||||
onNowPlayingItemDidChange(attributes: object): void {
|
||||
}
|
||||
|
||||
}
|
196
src/main/plugins/mpris.ts
Normal file
196
src/main/plugins/mpris.ts
Normal file
|
@ -0,0 +1,196 @@
|
|||
// @ts-ignore
|
||||
import * as Player from 'mpris-service';
|
||||
|
||||
export default class MPRIS {
|
||||
/**
|
||||
* Private variables for interaction in plugins
|
||||
*/
|
||||
private _win: any;
|
||||
private _app: any;
|
||||
|
||||
/**
|
||||
* Base Plugin Details (Eventually implemented into a GUI in settings)
|
||||
*/
|
||||
public name: string = 'MPRIS Service';
|
||||
public description: string = 'Handles MPRIS service calls for Linux systems.';
|
||||
public version: string = '1.0.0';
|
||||
public author: string = 'Core';
|
||||
|
||||
/**
|
||||
* MPRIS Service
|
||||
*/
|
||||
private mpris: any;
|
||||
private mprisEvents: Object = {
|
||||
"playpause": "pausePlay",
|
||||
"play": "pausePlay",
|
||||
"pause": "pausePlay",
|
||||
"next": "nextTrack",
|
||||
"previous": "previousTrack",
|
||||
}
|
||||
|
||||
/*******************************************************************************************
|
||||
* Private Methods
|
||||
* ****************************************************************************************/
|
||||
|
||||
/**
|
||||
* Runs a media event
|
||||
* @param type - pausePlay, nextTrack, PreviousTrack
|
||||
* @private
|
||||
*/
|
||||
private runMediaEvent(type: string) {
|
||||
if (this._win) {
|
||||
this._win.webContents.executeJavaScript(`MusicKitInterop.${type}()`).catch(console.error)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Blocks non-linux systems from running this plugin
|
||||
* @private
|
||||
*/
|
||||
private static linuxOnly(_target: any, _propertyKey: string, descriptor: PropertyDescriptor) {
|
||||
if (process.platform !== 'linux') {
|
||||
descriptor.value = function () {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Connects to MPRIS Service
|
||||
*/
|
||||
@MPRIS.linuxOnly
|
||||
private connect() {
|
||||
this.mpris = Player({
|
||||
name: 'Cider',
|
||||
identity: 'Cider',
|
||||
supportedUriSchemes: [],
|
||||
supportedMimeTypes: [],
|
||||
supportedInterfaces: ['player']
|
||||
});
|
||||
this.mpris = Object.assign(this.mpris, {
|
||||
canQuit: true,
|
||||
canControl: true,
|
||||
canPause: true,
|
||||
canPlay: true,
|
||||
canGoNext: true,
|
||||
active: true
|
||||
})
|
||||
|
||||
|
||||
const pos_atr = {durationInMillis: 0};
|
||||
this.mpris.getPosition = function () {
|
||||
const durationInMicro = pos_atr.durationInMillis * 1000;
|
||||
const percentage = parseFloat("0") || 0;
|
||||
return durationInMicro * percentage;
|
||||
}
|
||||
|
||||
for (const [key, value] of Object.entries(this.mprisEvents)) {
|
||||
this.mpris.on(key, () => {
|
||||
this.runMediaEvent(value)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update MPRIS Player Attributes
|
||||
*/
|
||||
@MPRIS.linuxOnly
|
||||
private updatePlayer(attributes: any) {
|
||||
|
||||
const MetaData = {
|
||||
'mpris:trackid': this.mpris.objectPath(`track/${attributes.playParams.id.replace(/[.]+/g, "")}`),
|
||||
'mpris:length': attributes.durationInMillis * 1000, // In microseconds
|
||||
'mpris:artUrl': (attributes.artwork.url.replace('/{w}x{h}bb', '/512x512bb')).replace('/2000x2000bb', '/35x35bb'),
|
||||
'xesam:title': `${attributes.name}`,
|
||||
'xesam:album': `${attributes.albumName}`,
|
||||
'xesam:artist': [`${attributes.artistName}`,],
|
||||
'xesam:genre': attributes.genreNames
|
||||
}
|
||||
|
||||
if (this.mpris.metadata["mpris:trackid"] === MetaData["mpris:trackid"]) {
|
||||
return
|
||||
}
|
||||
|
||||
this.mpris.metadata = MetaData
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Update MPRIS Player State
|
||||
* @private
|
||||
* @param attributes
|
||||
*/
|
||||
@MPRIS.linuxOnly
|
||||
private updatePlayerState(attributes: any) {
|
||||
|
||||
let status = 'Stopped';
|
||||
if (attributes.status) {
|
||||
status = 'Playing';
|
||||
} else if (attributes.status === false) {
|
||||
status = 'Paused';
|
||||
}
|
||||
|
||||
if (this.mpris.playbackStatus === status) {
|
||||
return
|
||||
}
|
||||
this.mpris.playbackStatus = status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear state
|
||||
* @private
|
||||
*/
|
||||
private clearState() {
|
||||
this.mpris.metadata = {'mpris:trackid': '/org/mpris/MediaPlayer2/TrackList/NoTrack'}
|
||||
this.mpris.playbackStatus = 'Stopped';
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************************
|
||||
* Public Methods
|
||||
* ****************************************************************************************/
|
||||
|
||||
/**
|
||||
* Runs on plugin load (Currently run on application start)
|
||||
*/
|
||||
constructor(app: any, _store: any) {
|
||||
this._app = app;
|
||||
console.log(`[${this.name}] plugin loaded`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on app ready
|
||||
*/
|
||||
onReady(win: any): void {
|
||||
this._win = win;
|
||||
console.log(`[${this.name}] plugin ready`);
|
||||
this.connect()
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on app stop
|
||||
*/
|
||||
onBeforeQuit(): void {
|
||||
console.log(`[${this.name}] plugin stopped`);
|
||||
this.clearState()
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on playback State Change
|
||||
* @param attributes Music Attributes (attributes.state = current state)
|
||||
*/
|
||||
onPlaybackStateDidChange(attributes: object): void {
|
||||
this.updatePlayerState(attributes)
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on song change
|
||||
* @param attributes Music Attributes
|
||||
*/
|
||||
onNowPlayingItemDidChange(attributes: object): void {
|
||||
this.updatePlayer(attributes);
|
||||
}
|
||||
|
||||
}
|
|
@ -24,7 +24,7 @@ const MusicKitInterop = {
|
|||
/** wsapi */
|
||||
|
||||
MusicKit.getInstance().addEventListener(MusicKit.Events.nowPlayingItemDidChange, () => {
|
||||
if (MusicKitInterop.filterTrack(MusicKitInterop.getAttributes(), false, true)) {
|
||||
if (MusicKitInterop.filterTrack(MusicKitInterop.getAttributes(), false, true) || !app.cfg.lastfm.filterLoop) {
|
||||
global.ipcRenderer.send('nowPlayingItemDidChange', MusicKitInterop.getAttributes());
|
||||
}
|
||||
});
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 12 KiB |
|
@ -5,6 +5,7 @@ var CiderAudio = {
|
|||
gainNode : null,
|
||||
spatialNode : null,
|
||||
spatialInput: null,
|
||||
audioBands : null,
|
||||
},
|
||||
init: function (cb = function () { }) {
|
||||
//AudioOutputs.fInit = true;
|
||||
|
@ -21,8 +22,13 @@ var CiderAudio = {
|
|||
},
|
||||
off: function(){
|
||||
try{
|
||||
CiderAudio.audioNodes.gainNode.disconnect();
|
||||
CiderAudio.audioNodes.spatialNode.disconnect();
|
||||
try{
|
||||
CiderAudio.audioNodes.gainNode.disconnect(); } catch(e){}
|
||||
try{ CiderAudio.audioNodes.spatialNode.disconnect();} catch(e){}
|
||||
try{
|
||||
CiderAudio.audioNodes.audioBands[0].disconnect();
|
||||
CiderAudio.audioNodes.audioBands[9].disconnect();
|
||||
} catch(e){}
|
||||
CiderAudio.source.connect(CiderAudio.context.destination);} catch(e){}
|
||||
},
|
||||
connectContext: function (mediaElem){
|
||||
|
@ -42,6 +48,7 @@ var CiderAudio = {
|
|||
if (app.cfg.audio.spatial){
|
||||
CiderAudio.spatialOn()
|
||||
}
|
||||
CiderAudio.equalizer()
|
||||
},
|
||||
normalizerOn: function (){},
|
||||
normalizerOff: function (){
|
||||
|
@ -49,7 +56,7 @@ var CiderAudio = {
|
|||
},
|
||||
spatialOn: function (){
|
||||
try{
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.context.destination);} catch(e){}
|
||||
CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){}
|
||||
CiderAudio.audioNodes.spatialNode = new ResonanceAudio(CiderAudio.context);
|
||||
CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.context.destination);
|
||||
let roomDimensions = {
|
||||
|
@ -90,6 +97,34 @@ var CiderAudio = {
|
|||
}
|
||||
);
|
||||
}
|
||||
},
|
||||
equalizer: function (){
|
||||
let BANDS = app.cfg.audio.equalizer.frequencies;
|
||||
let GAIN = app.cfg.audio.equalizer.gain;
|
||||
let Q = app.cfg.audio.equalizer.Q;
|
||||
CiderAudio.audioNodes.audioBands = [];
|
||||
|
||||
|
||||
for (i = 0; i < BANDS.length; i++) {
|
||||
CiderAudio.audioNodes.audioBands[i] = CiderAudio.context.createBiquadFilter();
|
||||
CiderAudio.audioNodes.audioBands[i].type = 'peaking'; // 'peaking';
|
||||
CiderAudio.audioNodes.audioBands[i].frequency.value = BANDS[i];
|
||||
CiderAudio.audioNodes.audioBands[i].Q.value = Q[i];
|
||||
CiderAudio.audioNodes.audioBands[i].gain.value = GAIN[i];
|
||||
}
|
||||
if (app.cfg.audio.spatial) {
|
||||
try{
|
||||
CiderAudio.audioNodes.spatialNode.output.disconnect(CiderAudio.context.destination); } catch(e){}
|
||||
CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
} else {
|
||||
try{
|
||||
CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){}
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
}
|
||||
for (i = 1; i < BANDS.length; i ++) {
|
||||
CiderAudio.audioNodes.audioBands[i-1].connect(CiderAudio.audioNodes.audioBands[i]);
|
||||
}
|
||||
CiderAudio.audioNodes.audioBands[BANDS.length-1].connect(CiderAudio.context.destination);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -297,7 +297,8 @@ const app = new Vue({
|
|||
modals: {
|
||||
addToPlaylist: false,
|
||||
spatialProperties: false,
|
||||
qrcode: false
|
||||
qrcode: false,
|
||||
equalizer: false,
|
||||
},
|
||||
socialBadges: {
|
||||
badgeMap: {},
|
||||
|
@ -3418,6 +3419,23 @@ const app = new Vue({
|
|||
document.getElementsByClassName('song-name')[0].classList.add('marquee');
|
||||
document.getElementsByClassName('song-name')[1].classList.add('marquee-after');
|
||||
}
|
||||
},
|
||||
closeWindow(){
|
||||
switch (app.cfg.general.close_behavior) {
|
||||
case 0:
|
||||
case '0':
|
||||
ipcRenderer.send('close');
|
||||
break;
|
||||
case 1:
|
||||
case '1':
|
||||
ipcRenderer.send('minimize');
|
||||
break;
|
||||
case 2:
|
||||
case '2':
|
||||
ipcRenderer.send('minimizeTray');
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -551,6 +551,8 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
|||
display: flex;
|
||||
font-size: 14px;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
margin-right: 35px ;
|
||||
}
|
||||
|
||||
.app-sidebar-button > .sidebar-user-text .fullname {
|
||||
|
@ -5699,4 +5701,86 @@ body.no-gpu {
|
|||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
.equalizer-panel {
|
||||
.modal-window {
|
||||
height: 330px;
|
||||
max-height: 330px;
|
||||
width: 630px;
|
||||
max-width: 630px;
|
||||
overflow: hidden;
|
||||
|
||||
.info-header {
|
||||
padding-left: 12px;
|
||||
}
|
||||
|
||||
.visual-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
.modal-header {
|
||||
padding: 16px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
.modal-title {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.close-btn {
|
||||
width: 50px;
|
||||
height: 100%;
|
||||
background-image: var(--gfx-closeBtn);
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
-webkit-app-region: no-drag;
|
||||
appearance: none;
|
||||
border: 0;
|
||||
background-color: transparent;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
|
||||
&:hover {
|
||||
background-color: rgb(196, 43, 28)
|
||||
}
|
||||
}
|
||||
}
|
||||
.modal-content{
|
||||
display: block;
|
||||
.input-container{
|
||||
display: inline-grid;
|
||||
width: 52px;
|
||||
justify-items: center;
|
||||
font-size: 0.7em;
|
||||
}
|
||||
.freq-header{
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.reset-button{
|
||||
width: 50%;
|
||||
margin-left: 25%;
|
||||
}
|
||||
input.eq-slider {
|
||||
-webkit-appearance: slider-vertical;
|
||||
width: 5%;
|
||||
}
|
||||
input[type="number"]{
|
||||
padding: unset;
|
||||
width: 55px;
|
||||
}
|
||||
.header input.eq-slider {
|
||||
-webkit-appearance: slider-vertical;
|
||||
width: 5%;
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@import url("less/compact.less");
|
||||
|
|
123
src/renderer/views/components/equalizer.ejs
Normal file
123
src/renderer/views/components/equalizer.ejs
Normal file
|
@ -0,0 +1,123 @@
|
|||
<script type="text/x-template" id="eq-view">
|
||||
<div class="modal-fullscreen equalizer-panel">
|
||||
<div class="modal-window" >
|
||||
<div class="modal-header">
|
||||
<div class="modal-title">{{$root.getLz('term.equalizer')}}</div>
|
||||
<button class="close-btn" @click="close()"></button>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<!-- BANDS = [60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000]; -->
|
||||
<div class="inputs-container">
|
||||
<div class="input-container header">
|
||||
Gain
|
||||
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" >
|
||||
<div class="freq-header">Freq</div>
|
||||
<div>Q</div>
|
||||
</div>
|
||||
<div class="input-container">
|
||||
{{app.cfg.audio.equalizer.gain[0]}}
|
||||
<input tabindex="0" type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer.gain[0]" @change="changeGain(0)">
|
||||
<input type="number" class="eq-freq" orient="vertical" min="22" max="44" step="2" v-model="app.cfg.audio.equalizer.frequencies[0]" @change="changeFreq(0)">
|
||||
<input type="number" class="eq-q" orient="vertical" min="0" max="5" step="0.1" v-model="app.cfg.audio.equalizer.Q[0]" @change="changeQ(0)">
|
||||
</div>
|
||||
<div class="input-container">
|
||||
{{app.cfg.audio.equalizer.gain[1]}}
|
||||
<input tabindex="0" type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer.gain[1]" @change="changeGain(1)">
|
||||
<input type="number" class="eq-freq" orient="vertical" min="44" max="88" step="4" v-model="app.cfg.audio.equalizer.frequencies[1]" @change="changeFreq(1)">
|
||||
<input type="number" class="eq-q" orient="vertical" min="0" max="5" step="0.1" v-model="app.cfg.audio.equalizer.Q[1]" @change="changeQ(1)">
|
||||
</div>
|
||||
<div class="input-container">
|
||||
{{app.cfg.audio.equalizer.gain[2]}}
|
||||
<input tabindex="0" type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer.gain[2]" @change="changeGain(2)">
|
||||
<input type="number" class="eq-freq" orient="vertical" min="88" max="177" step="8" v-model="app.cfg.audio.equalizer.frequencies[2]" @change="changeFreq(2)">
|
||||
<input type="number" class="eq-q" orient="vertical" min="0" max="5" step="0.1" v-model="app.cfg.audio.equalizer.Q[2]" @change="changeQ(2)">
|
||||
</div>
|
||||
<div class="input-container">
|
||||
{{app.cfg.audio.equalizer.gain[3]}}
|
||||
<input tabindex="0" type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer.gain[3]" @change="changeGain(3)">
|
||||
<input type="number" class="eq-freq" orient="vertical" min="177" max="355" step="16" v-model="app.cfg.audio.equalizer.frequencies[3]" @change="changeFreq(3)">
|
||||
<input type="number" class="eq-q" orient="vertical" min="0" max="5" step="0.1" v-model="app.cfg.audio.equalizer.Q[3]" @change="changeQ(3)">
|
||||
</div>
|
||||
<div class="input-container">
|
||||
{{app.cfg.audio.equalizer.gain[4]}}
|
||||
<input tabindex="0" type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer.gain[4]" @change="changeGain(4)">
|
||||
<input type="number" class="eq-freq" orient="vertical" min="355" max="710" step="32" v-model="app.cfg.audio.equalizer.frequencies[4]" @change="changeFreq(4)">
|
||||
<input type="number" class="eq-q" orient="vertical" min="0" max="5" step="0.1" v-model="app.cfg.audio.equalizer.Q[4]" @change="changeQ(4)">
|
||||
</div>
|
||||
<div class="input-container">
|
||||
{{app.cfg.audio.equalizer.gain[5]}}
|
||||
<input tabindex="0" type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer.gain[5]" @change="changeGain(5)">
|
||||
<input type="number" class="eq-freq" orient="vertical" min="710" max="1420" step="64" v-model="app.cfg.audio.equalizer.frequencies[5]" @change="changeFreq(5)">
|
||||
<input type="number" class="eq-q" orient="vertical" min="0" max="5" step="0.1" v-model="app.cfg.audio.equalizer.Q[5]" @change="changeQ(5)">
|
||||
</div>
|
||||
<div class="input-container">
|
||||
{{app.cfg.audio.equalizer.gain[6]}}
|
||||
<input tabindex="0" type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer.gain[6]" @change="changeGain(6)">
|
||||
<input type="number" class="eq-freq" orient="vertical" min="1420" max="2840" step="128" v-model="app.cfg.audio.equalizer.frequencies[6]" @change="changeFreq(6)">
|
||||
<input type="number" class="eq-q" orient="vertical" min="0" max="5" step="0.1" v-model="app.cfg.audio.equalizer.Q[6]" @change="changeQ(6)">
|
||||
</div>
|
||||
<div class="input-container">
|
||||
{{app.cfg.audio.equalizer.gain[7]}}
|
||||
<input tabindex="0" type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer.gain[7]" @change="changeGain(7)">
|
||||
<input type="number" class="eq-freq" orient="vertical" min="2840" max="5680" step="256" v-model="app.cfg.audio.equalizer.frequencies[7]" @change="changeFreq(7)">
|
||||
<input type="number" class="eq-q" orient="vertical" min="0" max="5" step="0.1" v-model="app.cfg.audio.equalizer.Q[7]" @change="changeQ(7)">
|
||||
</div>
|
||||
<div class="input-container">
|
||||
{{app.cfg.audio.equalizer.gain[8]}}
|
||||
<input tabindex="0" type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer.gain[8]" @change="changeGain(8)">
|
||||
<input type="number" class="eq-freq" orient="vertical" min="5680" max="11360" step="512" v-model="app.cfg.audio.equalizer.frequencies[8]" @change="changeFreq(8)">
|
||||
<input type="number" class="eq-q" orient="vertical" min="0" max="5" step="0.1" v-model="app.cfg.audio.equalizer.Q[8]" @change="changeQ(8)">
|
||||
</div>
|
||||
<div class="input-container">
|
||||
{{app.cfg.audio.equalizer.gain[9]}}
|
||||
<input tabindex="0" type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer.gain[9]" @change="changeGain(9)">
|
||||
<input type="number" class="eq-freq" orient="vertical" min="11360" max="22720" step="1024" v-model="app.cfg.audio.equalizer.frequencies[9]" @change="changeFreq(9)">
|
||||
<input type="number" class="eq-q" orient="vertical" min="0" max="5" step="0.1" v-model="app.cfg.audio.equalizer.Q[9]" @change="changeQ(9)">
|
||||
</div>
|
||||
</div>
|
||||
</br>
|
||||
<div class="reset-button md-btn" @click="resetGain()">{{$root.getLz('term.reset')}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script>
|
||||
Vue.component('eq-view', {
|
||||
template: '#eq-view',
|
||||
data: function () {
|
||||
return {
|
||||
app: this.$root,
|
||||
|
||||
}
|
||||
},
|
||||
props: ["src", "url"],
|
||||
mounted() {
|
||||
|
||||
},
|
||||
methods: {
|
||||
close() {
|
||||
app.resetState()
|
||||
},
|
||||
changeGain(i) {
|
||||
CiderAudio.audioNodes.audioBands[i].gain.value = app.cfg.audio.equalizer.gain[i]
|
||||
},
|
||||
changeFreq(i) {
|
||||
CiderAudio.audioNodes.audioBands[i].frequency.value = app.cfg.audio.equalizer.frequencies[i]
|
||||
},
|
||||
changeQ(i) {
|
||||
CiderAudio.audioNodes.audioBands[i].Q.value = app.cfg.audio.equalizer.Q[i]
|
||||
},
|
||||
resetGain(){
|
||||
this.app.cfg.audio.equalizer = {'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000],
|
||||
'gain': [0,0,0,0,0,0,0,0,0,0],
|
||||
'Q' : [1,1,1,1,1,1,1,1,1,1] }
|
||||
for (var i = 0; i < 10; i++){
|
||||
this.changeGain(i)
|
||||
this.changeFreq(i)
|
||||
this.changeQ(i)
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
|
@ -238,7 +238,7 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
name: `Play ${app.selectedMediaItems.length} tracks next`,
|
||||
name: app.getLz('action.playTracksNext'),
|
||||
"icon": "./assets/arrow-bend-up.svg",
|
||||
action: () => {
|
||||
let itemsToPlay = {}
|
||||
|
@ -260,7 +260,7 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
name: `Play ${app.selectedMediaItems.length} tracks later`,
|
||||
name: app.getLz('action.playTracksLater'),
|
||||
"icon": "./assets/arrow-bend-down.svg",
|
||||
action: () => {
|
||||
let itemsToPlay = {}
|
||||
|
|
|
@ -144,7 +144,7 @@
|
|||
multiple: {
|
||||
items: [
|
||||
{
|
||||
name: `Play ${app.selectedMediaItems.length} tracks next`,
|
||||
name: this.$root.getLz('action.playTracksNext'),
|
||||
action: () => {
|
||||
let itemsToPlay = {}
|
||||
app.selectedMediaItems.forEach(item => {
|
||||
|
@ -165,7 +165,7 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
name: `Play ${app.selectedMediaItems.length} tracks later`,
|
||||
name: app.getLz('action.playTracksLater'),
|
||||
action: () => {
|
||||
let itemsToPlay = {}
|
||||
app.selectedMediaItems.forEach(item => {
|
||||
|
|
|
@ -158,7 +158,7 @@
|
|||
multiple: {
|
||||
items: [
|
||||
{
|
||||
name: `Play ${app.selectedMediaItems.length} tracks next`,
|
||||
name: app.getLz('action.playTracksNext'),
|
||||
action: () => {
|
||||
let itemsToPlay = {}
|
||||
app.selectedMediaItems.forEach(item => {
|
||||
|
@ -179,7 +179,7 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
name: `Play ${app.selectedMediaItems.length} tracks later`,
|
||||
name: app.getLz('action.playTracksLater'),
|
||||
action: () => {
|
||||
let itemsToPlay = {}
|
||||
app.selectedMediaItems.forEach(item => {
|
||||
|
|
|
@ -250,7 +250,7 @@
|
|||
multiple: {
|
||||
items: [
|
||||
{
|
||||
name: `Play ${app.selectedMediaItems.length} tracks next`,
|
||||
name: app.getLz('action.playTracksNext'),
|
||||
"icon": "./assets/arrow-bend-up.svg",
|
||||
action: () => {
|
||||
let itemsToPlay = {}
|
||||
|
@ -272,7 +272,7 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
name: `Play ${app.selectedMediaItems.length} tracks later`,
|
||||
name: app.getLz('action.playTracksLater'),
|
||||
"icon": "./assets/arrow-bend-down.svg",
|
||||
action: () => {
|
||||
let itemsToPlay = {}
|
||||
|
|
|
@ -97,7 +97,7 @@
|
|||
},
|
||||
multiple: {
|
||||
items: [{
|
||||
"name": `Remove ${self.selectedItems.length} tracks from queue`,
|
||||
"name": app.getLz('action.removeTracks'),
|
||||
"action": function () {
|
||||
// add property to items to be removed
|
||||
self.selectedItems.forEach(function (item) {
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<label v-if="!app.cfg.audio.normalization">
|
||||
Gain
|
||||
{{$root.getLz('spatial.gain')}}
|
||||
<input type="number" min="0" @change="setRoom()" style="width: 100%;"
|
||||
v-model="app.cfg.audio.spatial_properties.gain" step="0.1"/>
|
||||
</label>
|
||||
|
@ -73,7 +73,7 @@
|
|||
</template>
|
||||
<template v-if="roomEditType == 'positions'">
|
||||
<div class="row">
|
||||
<div class="col"><h3>{{$root.getLz('spatial.roomPositons')}}</h3></div>
|
||||
<div class="col"><h3>{{$root.getLz('spatial.roomPositions')}}</h3></div>
|
||||
<div class="col-auto flex-center">
|
||||
<button class="md-btn" @click="roomEditType = 'dimensions'">{{$root.getLz('spatial.setDimensions')}}</button>
|
||||
</div>
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
<div class="app-chrome--left">
|
||||
<div class="app-chrome-item full-height" v-if="chrome.windowControlPosition == 'left'">
|
||||
<div class="window-controls">
|
||||
<div class="close" @click="ipcRenderer.send('close')"></div>
|
||||
<div class="close" @click="closeWindow()"></div>
|
||||
<div class="minimize" @click="ipcRenderer.send('minimize')"></div>
|
||||
<div class="minmax restore" v-if="chrome.maximized"
|
||||
@click="ipcRenderer.send('maximize')">
|
||||
|
@ -174,7 +174,7 @@
|
|||
@click="ipcRenderer.send('maximize')">
|
||||
</div>
|
||||
<div class="minmax" v-else @click="ipcRenderer.send('maximize')"></div>
|
||||
<div class="close" @click="ipcRenderer.send('close')"></div>
|
||||
<div class="close" @click="closeWindow()"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -264,6 +264,10 @@
|
|||
</div>
|
||||
</div>
|
||||
</button>
|
||||
<button class="usermenu-item" v-if="cfg.advanced.AudioContext"
|
||||
@click="modals.equalizer = true">
|
||||
{{$root.getLz('term.equalizer')}}
|
||||
</button>
|
||||
<button class="usermenu-item" v-if="cfg.advanced.AudioContext && cfg.audio.spatial"
|
||||
@click="modals.spatialProperties = true">
|
||||
{{$root.getLz('term.spacializedAudioSetting')}}
|
||||
|
@ -619,6 +623,9 @@
|
|||
<transition name="modal">
|
||||
<spatial-properties v-if="modals.spatialProperties"></spatial-properties>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<eq-view v-if="modals.equalizer"></eq-view>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<qrcode-modal v-if="modals.qrcode" :src="webremoteqr" :url="webremoteurl"></qrcode-modal>
|
||||
</transition>
|
||||
|
@ -730,6 +737,9 @@
|
|||
<!-- QRCode Modal -->
|
||||
<%- include('components/qrcode-modal')
|
||||
%>
|
||||
<!-- Equalizer -->
|
||||
<%- include('components/equalizer')
|
||||
%>
|
||||
<!-- Add to playlist -->
|
||||
<%- include('components/add-to-playlist')
|
||||
%>
|
||||
|
|
|
@ -444,8 +444,12 @@
|
|||
// month = new Intl.DateTimeFormat(this.app.cfg.general.language.replace('_','-'), {month: 'long'}).format(releaseDate);
|
||||
// date = releaseDate.getDate();
|
||||
// year = releaseDate.getFullYear();
|
||||
|
||||
return prefix + new Intl.DateTimeFormat(this.app.cfg.general.language?.replace('_','-') ?? 'en-US', {day:'numeric',month: 'long', year: 'numeric'}).format(releaseDate);
|
||||
let formatted = ''
|
||||
try {formatted = new Intl.DateTimeFormat(this.app.cfg.general.language?.replace('_','-') ?? 'en-US', {day:'numeric',month: 'long', year: 'numeric'}).format(releaseDate);}
|
||||
catch(e){
|
||||
formatted = new Intl.DateTimeFormat('en-US', {day:'numeric',month: 'long', year: 'numeric'}).format(releaseDate);
|
||||
}
|
||||
return prefix + formatted
|
||||
} catch (e) {
|
||||
return ""
|
||||
}
|
||||
|
|
|
@ -36,6 +36,15 @@
|
|||
<input type="checkbox" v-model="app.cfg.advanced.AudioContext" v-on:change="toggleAudioContext" switch/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz('term.equalizer')}}
|
||||
</div>
|
||||
<div class="md-option-segment md-btn md-option-segment_auto">
|
||||
<label class="list-button list-element"
|
||||
onclick="app.modals.equalizer = true">{{$root.getLz('term.equalizer')}}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext">
|
||||
<div class="md-option-segment" >
|
||||
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.audioNormalization')}}
|
||||
|
@ -494,6 +503,14 @@
|
|||
<input type="checkbox" v-model="app.cfg.lastfm.enabledRemoveFeaturingArtists" switch/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line" v-show ="app.cfg.lastfm.enabled">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz('settings.option.connectivity.lastfmScrobble.filterLoop')}}
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto" >
|
||||
<input type="checkbox" v-model="app.cfg.lastfm.filterLoop" switch/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-header">
|
||||
<span>{{$root.getLz('settings.header.experimental')}}</span>
|
||||
|
@ -524,6 +541,21 @@
|
|||
<option value="tr_TR">tr_TR</option>
|
||||
<option value="zh_CN">zh_CN</option>
|
||||
<option value="zh_TW">zh_TW</option>
|
||||
<option value="zh_HK">zh_HK</option>
|
||||
<option value="en_HODOR">HODOR?</option>
|
||||
<option value="en_SGA">Galactic</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz("settings.option.experimental.closeButtonBehaviour")}}
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<select class="md-select" v-model="app.cfg.general.close_behavior">
|
||||
<option value='0'>{{$root.getLz("settings.option.experimental.closeButtonBehaviour.quit")}}</option>
|
||||
<option value='1'>{{$root.getLz("settings.option.experimental.closeButtonBehaviour.minimizeTaskbar")}}</option>
|
||||
<option value='2'>{{$root.getLz("settings.option.experimental.closeButtonBehaviour.minimizeTray")}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -579,18 +611,6 @@
|
|||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
Close Button Behavior
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<select class="md-select">
|
||||
<option value='0'>Minimize to system tray</option>
|
||||
<option value='1'>Minimize to taskbar ? dock</option>
|
||||
<option value='2'>Quit Cider</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
Open Cider on Startup
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"experimentalDecorators": true,
|
||||
"target": "esnext",
|
||||
"module": "commonjs",
|
||||
"noImplicitAny": true,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue