add some shiz (#1313)

* Update ru_RU.json

keeping russian lang actual

* ok

* Add gradient to lyric-footer

* *Commit en español Ñ (#1304)

* i hate my life (#1307)

* world is now a better place

* meltdown avoided

* meltdown avoided

* stylize new listen now childs

* full scale artwork, finally

* dynamic width for search categories

* hd all album work

* Update afterPack.js

* force hq quality

* oops

* attempt to fix

* misc cleanup

* why what

* what was i thinking

* fix duplicated text in listen now childs

* Paginate/infinite scroll for  albums, playlists (#1234)

* Infinite scroll, pagination to album, playlists

* move pagination below tracks

* Make page size configurable

* remove renderer

* Mitigate songs / album slow app issue.

* add ratings, library change to web remote (#1285)

* Add compact artist header option (#1308)

* Support compact artist header (optional)

* Add required term

Co-authored-by: h0ckerman <35598335+h0ckerman@users.noreply.github.com>
Co-authored-by: vapormusic <vietanhfat@gmail.com>
Co-authored-by: Monochromish <chillygamer7@gmail.com>
Co-authored-by: Gabriel Davila <56521591+mefsaal@users.noreply.github.com>
Co-authored-by: Core <64542347+coredev-uk@users.noreply.github.com>
Co-authored-by: Maikiwi <stella@mai.kiwi>
Co-authored-by: yazninja <yazlesean@gmail.com>
Co-authored-by: booploops <49113086+booploops@users.noreply.github.com>
Co-authored-by: Kendall Garner <17521368+kgarner7@users.noreply.github.com>
Co-authored-by: Pedro Galhardo <pgalhardo@icloud.com>
This commit is contained in:
cryptofyre 2022-07-26 10:59:36 -05:00 committed by GitHub
parent 2fe4b65747
commit c0cea76913
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 1230 additions and 366 deletions

View file

@ -121,9 +121,9 @@
} }
], ],
"build": { "build": {
"electronVersion": "18.3.5", "electronVersion": "19.0.8",
"electronDownload": { "electronDownload": {
"version": "18.3.5+wvcus", "version": "20.0.0-beta.11+wvcus",
"mirror": "https://github.com/castlabs/electron-releases/releases/download/v" "mirror": "https://github.com/castlabs/electron-releases/releases/download/v"
}, },
"appId": "cider", "appId": "cider",

View file

@ -14,7 +14,7 @@ exports.default = function(context) {
// console.log('Castlabs-evs update complete') // console.log('Castlabs-evs update complete')
// xcode 13 // xcode 13
if (fs.existsSync('dist/mac-universal--x64') && fs.existsSync('dist/mac-universal--arm64')) if (fs.existsSync('dist/mac-universal--x64') && fs.existsSync('dist/mac-universal--arm64') && fs.existsSync('dist/mac-universal--x64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib/keyedobjects-101300.nib'))
execSync("cp 'dist/mac-universal--x64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib/keyedobjects-101300.nib' 'dist/mac-universal--arm64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib/keyedobjects-101300.nib'",{stdio: 'inherit'}) execSync("cp 'dist/mac-universal--x64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib/keyedobjects-101300.nib' 'dist/mac-universal--arm64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib/keyedobjects-101300.nib'",{stdio: 'inherit'})
// console.log('VMP signing start') // console.log('VMP signing start')

View file

@ -520,4 +520,8 @@ Update 23/06/2022 04:00 UTC
Update 03/07/2022 20:00 UTC Update 03/07/2022 20:00 UTC
* `term.plugins`: Added to `en_US` * `term.plugins`: Added to `en_US`
* `settings.header.visual.styles`: Added to `en_US` * `settings.header.visual.styles`: Added to `en_US`
Update 25/07/2022 00:22 UTC
* `settings.option.visual.compactArtistHeader`: Added to `en_US`

View file

@ -360,6 +360,8 @@
"settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider", "settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider",
"settings.option.general.themeUpdateNotification": "Automatically check for theme updates", "settings.option.general.themeUpdateNotification": "Automatically check for theme updates",
"settings.option.general.showLovedTracksInline": "Show loved tracks inline", "settings.option.general.showLovedTracksInline": "Show loved tracks inline",
"settings.option.general.pagination": "Items to show per page",
"settings.options.general.pagination.description": "This determines how many songs/albums to show initially for infinite scrolling, or how many songs/albums to show for a single page",
"settings.description.search": "Search", "settings.description.search": "Search",
"settings.description.albums": "Library Albums", "settings.description.albums": "Library Albums",
"settings.description.artists": "Library Artists", "settings.description.artists": "Library Artists",
@ -563,6 +565,7 @@
"settings.option.visual.customAccentColor": "Custom Accent Color", "settings.option.visual.customAccentColor": "Custom Accent Color",
"settings.option.visual.accentColor": "Accent Color", "settings.option.visual.accentColor": "Accent Color",
"settings.option.visual.purplePodcastPlaybackBar": "Purple Playback Bar for Podcasts", "settings.option.visual.purplePodcastPlaybackBar": "Purple Playback Bar for Podcasts",
"settings.option.visual.compactArtistHeader": "Compact Artist Header",
"settings.option.visual.windowColor": "Window Tint Color", "settings.option.visual.windowColor": "Window Tint Color",
"settings.header.visual.windowBackgroundStyle.color": "Color Tint", "settings.header.visual.windowBackgroundStyle.color": "Color Tint",
"settings.header.advanced": "Advanced", "settings.header.advanced": "Advanced",

View file

@ -102,7 +102,7 @@
"term.connecting": "Conectando", "term.connecting": "Conectando",
"term.disconnect": "Desconectar", "term.disconnect": "Desconectar",
"term.authed": "Autenticado", "term.authed": "Autenticado",
"term.confirm": "¿Confirma?", "term.confirm": "¿ Confirma ?",
"term.more": "Más", "term.more": "Más",
"term.less": "Menos", "term.less": "Menos",
"term.showMore": "Mostrar Más", "term.showMore": "Mostrar Más",
@ -160,7 +160,7 @@
}, },
"term.videos": "Videos", "term.videos": "Videos",
"term.menu": "Menú", "term.menu": "Menú",
"term.themeManaged": "Administrado por un tema", "term.themeManaged": "Administrado por un Tema",
"term.check": "Comprobar", "term.check": "Comprobar",
"term.aboutArtist": "Acerca de {{artistName}}", "term.aboutArtist": "Acerca de {{artistName}}",
"term.topResult": "Mejor Resultado", "term.topResult": "Mejor Resultado",
@ -188,7 +188,7 @@
"term.plugin": "Plugin", "term.plugin": "Plugin",
"term.pluginMenu": "Plugins Menú", "term.pluginMenu": "Plugins Menú",
"term.pluginMenu.none": "Sin Plugins Interactivos", "term.pluginMenu.none": "Sin Plugins Interactivos",
"term.replay": "Repetir", "term.replay": "Replay",
"term.uniqueAlbums": "Álbumes Únicos", "term.uniqueAlbums": "Álbumes Únicos",
"term.uniqueArtists": "Artistas Únicos", "term.uniqueArtists": "Artistas Únicos",
"term.uniqueSongs": "Canciones Únicas", "term.uniqueSongs": "Canciones Únicas",
@ -221,7 +221,7 @@
"home.recentlyPlayed": "Escuchado Recientemente", "home.recentlyPlayed": "Escuchado Recientemente",
"home.recentlyAdded": "Agregado Recientemente", "home.recentlyAdded": "Agregado Recientemente",
"home.artistsFeed": "Tu Feed de artistas", "home.artistsFeed": "Tu Feed de artistas",
"home.artistsFeed.noArtist": "Sigue a algunos Artistas para ver sus últimos Lanzamientos", "home.artistsFeed.noArtist": "Sigue a algunos Artistas para ver sus Últimos Lanzamientos",
"home.madeForYou": "Hecho para Ti", "home.madeForYou": "Hecho para Ti",
"home.friendsListeningTo": "Amigos Escuchando", "home.friendsListeningTo": "Amigos Escuchando",
"home.followedArtists": "Artistas Seguidos", "home.followedArtists": "Artistas Seguidos",
@ -252,12 +252,12 @@
"action.addToLibrary.error": "Error al agregar a la Biblioteca", "action.addToLibrary.error": "Error al agregar a la Biblioteca",
"action.removeFromLibrary": "Eliminar de la Biblioteca", "action.removeFromLibrary": "Eliminar de la Biblioteca",
"action.removeFromLibrary.success": "Eliminado de la Biblioteca", "action.removeFromLibrary.success": "Eliminado de la Biblioteca",
"action.addToQueue": "Añadir a la cola", "action.addToQueue": "Agregar a la Cola",
"action.addToQueue.success": "Agregado a la cola", "action.addToQueue.success": "Agregado a la Cola",
"action.addToQueue.error": "Error al agregar a la cola", "action.addToQueue.error": "Error al Agregar a la Cola",
"action.removeFromQueue": "Eliminar de la cola", "action.removeFromQueue": "Eliminar de la Cola",
"action.removeFromQueue.success": "Eliminado de la cola", "action.removeFromQueue.success": "Eliminado de la Cola",
"action.removeFromQueue.error": "Error al eliminar de la cola", "action.removeFromQueue.error": "Error al Eliminar de la Cola",
"action.createPlaylist": "Crear una nueva lista de reproducción", "action.createPlaylist": "Crear una nueva lista de reproducción",
"action.addToPlaylist": "Agregar a lista de reproducción", "action.addToPlaylist": "Agregar a lista de reproducción",
"action.removeFromPlaylist": "Eliminar de la lista de reproducción", "action.removeFromPlaylist": "Eliminar de la lista de reproducción",
@ -268,14 +268,14 @@
"action.unfollow": "Dejar de Seguir", "action.unfollow": "Dejar de Seguir",
"action.unfollow.success": "Dejando de Seguir", "action.unfollow.success": "Dejando de Seguir",
"action.unfollow.error": "Error al dejar de Seguir", "action.unfollow.error": "Error al dejar de Seguir",
"action.playNext": "Reproducir siguiente", "action.playNext": "Reproducir Siguiente",
"action.playLater": "Reproducir más tarde", "action.playLater": "Reproducir Más Tarde",
"action.startRadio": "Iniciar Radio", "action.startRadio": "Iniciar Radio",
"action.goToArtist": "Ir al artista", "action.goToArtist": "Ir al Artista",
"action.goToAlbum": "Ir al álbum", "action.goToAlbum": "Ir al Álbum",
"action.showInPlaylist": "Mostrar en lista de reproducción", "action.showInPlaylist": "Mostrar en Lista de Reproducción",
"action.showInAppleMusic": "Mostrar en Apple Music", "action.showInAppleMusic": "Mostrar en Apple Music",
"action.moveToTop": "Mover fuera de la carpeta", "action.moveToTop": "Mover fuera de la Carpeta",
"action.share": "Compartir", "action.share": "Compartir",
"action.rename": "Renombrar", "action.rename": "Renombrar",
"action.love": "Me Gusta", "action.love": "Me Gusta",
@ -283,9 +283,9 @@
"action.dislike": "Recomendar menos este contenido", "action.dislike": "Recomendar menos este contenido",
"action.undoDislike": "Recomendar mas este contenido", "action.undoDislike": "Recomendar mas este contenido",
"action.showWebRemoteQR": "Web Remoto", "action.showWebRemoteQR": "Web Remoto",
"action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} Pistas Siguientes", "action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} Canciones Siguientes",
"action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} Pistas mas tarde", "action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} Canciones mas tarde",
"action.removeTracks": "Eliminar ${self.selectedItems.length} Pistas de la Cola", "action.removeTracks": "Eliminar ${self.selectedItems.length} Canciones de la Cola",
"action.import": "Importar", "action.import": "Importar",
"action.export": "Exportar", "action.export": "Exportar",
"action.showAlbum": "Mostrar Álbum Completo", "action.showAlbum": "Mostrar Álbum Completo",
@ -299,7 +299,7 @@
"action.deletepreset": "Borrar Preset", "action.deletepreset": "Borrar Preset",
"action.open": "Abrir", "action.open": "Abrir",
"action.close": "Cerrar", "action.close": "Cerrar",
"action.relaunch.confirm": "¿Quieres reiniciar Cider?", "action.relaunch.confirm": "¿ Quieres reiniciar Cider ?",
"action.cast.chromecast": "Chromecast", "action.cast.chromecast": "Chromecast",
"action.cast.todevices": "Transmitir a los Dispositivos", "action.cast.todevices": "Transmitir a los Dispositivos",
"action.cast.stop": "Dejar de transmitir a todos los Dispositivos", "action.cast.stop": "Dejar de transmitir a todos los Dispositivos",
@ -308,7 +308,7 @@
"action.cast.scan": "Escanear", "action.cast.scan": "Escanear",
"action.cast.scanning": "Escaneando...", "action.cast.scanning": "Escaneando...",
"action.createNew": "Crear Nuevo...", "action.createNew": "Crear Nuevo...",
"action.openArtworkInBrowser": "Abrir Ilustración en el navegador", "action.openArtworkInBrowser": "Abrir Ilustración en el Navegador",
"action.scrollToTop": "Ir al inicio", "action.scrollToTop": "Ir al inicio",
"menubar.options.view": "Ver", "menubar.options.view": "Ver",
"menubar.options.reload": "Recargar", "menubar.options.reload": "Recargar",
@ -396,17 +396,17 @@
"settings.header.audio.quality.standard.description": "64 kbps", "settings.header.audio.quality.standard.description": "64 kbps",
"settings.option.audio.seamlessTransition": "Transición de audio sin interrupciones", "settings.option.audio.seamlessTransition": "Transición de audio sin interrupciones",
"settings.option.audio.enableAdvancedFunctionality": "Habilitar funcionalidad avanzada", "settings.option.audio.enableAdvancedFunctionality": "Habilitar funcionalidad avanzada",
"settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirá funciones de audio extendidas como normalización de audio, ecualizadores y visualizadores; sin embargo, en algunos sistemas esto puede causar interrupciones en las pistas de audio.", "settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirá funciones de audio extendidas como Normalización de Audio, Ecualizadores y Visualizadores. Sin embargo, en algunos sistemas esto puede causar interrupciones en las pistas de audio.",
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider cree que su PC no puede manejar estas funciones. ¿Estás seguro de que quieres continuar?", "settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider cree que su PC no puede manejar estas funciones. ¿ Estás seguro de que quieres continuar ?",
"settings.option.audio.audioLab": "Cider Audio Lab", "settings.option.audio.audioLab": "Cider Audio Lab",
"settings.option.audio.audioLab.description": "Una variedad de efectos de audio desarrollados internamente para Cider.", "settings.option.audio.audioLab.description": "Una variedad de efectos de Audio desarrollados internamente para Cider.",
"settings.option.audio.audioLab.subheader": "Designed by Cider Acoustic Technologies in California", "settings.option.audio.audioLab.subheader": "Designed by Cider Acoustic Technologies in California",
"settings.warn.audioLab.withoutAF": "Se requiere AudioContext (funcionalidad avanzada) para habilitar Laboratorio de audio de Cider.", "settings.warn.audioLab.withoutAF": "Se requiere AudioContext (funcionalidad avanzada) para habilitar Cider Audio Lab.",
"settings.warn.enableAdvancedFunctionality": "AudioContext (funcionalidad avanzada) es necesaria para habilitar esta característica.", "settings.warn.enableAdvancedFunctionality": "AudioContext (funcionalidad avanzada) es necesaria para Habilitar esta Característica.",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calidez analógica", "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calidez Analógica",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula la calidez analógica inspirada en el Korg Nutube 6P1", "settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula la Calidez Analógica inspirada en el Korg Nutube 6P1",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidad de calidez analógica", "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidad de Calidez Analógica",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Cambia la intensidad del procesamiento del módulo de Calidez analógica", "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Cambia la intensidad del procesamiento del módulo de Calidez Analógica",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Suave", "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Suave",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Calido", "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Calido",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™",
@ -470,7 +470,7 @@
"settings.header.visual.animatedArtworkQuality.high": "Alto", "settings.header.visual.animatedArtworkQuality.high": "Alto",
"settings.header.visual.animatedArtworkQuality.veryHigh": "Muy alto", "settings.header.visual.animatedArtworkQuality.veryHigh": "Muy alto",
"settings.header.visual.animatedArtworkQuality.extreme": "Extremo", "settings.header.visual.animatedArtworkQuality.extreme": "Extremo",
"settings.option.visual.animatedWindowBackground": "Fondo de ventana animado", "settings.option.visual.animatedWindowBackground": "Fondo de Ventana Animado",
"settings.option.visual.hardwareAcceleration": "Aceleración de Hardware", "settings.option.visual.hardwareAcceleration": "Aceleración de Hardware",
"settings.option.visual.hardwareAcceleration.description": "Requiere reinicio", "settings.option.visual.hardwareAcceleration.description": "Requiere reinicio",
"settings.header.visual.hardwareAcceleration.default": "Por defecto", "settings.header.visual.hardwareAcceleration.default": "Por defecto",
@ -481,9 +481,9 @@
"settings.option.visual.theme.github.openfolder": "Abrir Carpeta de Temas", "settings.option.visual.theme.github.openfolder": "Abrir Carpeta de Temas",
"settings.option.visual.theme.github.explore": "Explorar Temas de GitHub", "settings.option.visual.theme.github.explore": "Explorar Temas de GitHub",
"settings.header.visual.theme.github.page": "Temas de GitHub", "settings.header.visual.theme.github.page": "Temas de GitHub",
"settings.option.visual.theme.github.install.confirm": "¿Está seguro de que desea instalar {{ repo }}?", "settings.option.visual.theme.github.install.confirm": "¿ Está seguro de que desea instalar {{ repo }} ?",
"settings.prompt.visual.theme.github.URL": "Introduce la URL del tema que quieres instalar", "settings.prompt.visual.theme.github.URL": "Introduce la URL del tema que quieres instalar",
"settings.prompt.visual.theme.uninstallTheme": "¿Estas seguro que lo quieres desinstalar {{ theme }}?", "settings.prompt.visual.theme.uninstallTheme": "¿ Estas seguro que lo quieres desinstalar {{ theme }} ?",
"settings.option.visual.theme.checkForUpdates": "Buscar actualizaciones", "settings.option.visual.theme.checkForUpdates": "Buscar actualizaciones",
"settings.header.visual.styles": "Estilos", "settings.header.visual.styles": "Estilos",
"settings.option.visual.theme.manageStyles": "Gestionar Estilos", "settings.option.visual.theme.manageStyles": "Gestionar Estilos",
@ -608,7 +608,7 @@
"oobe.previous": "Anterior", "oobe.previous": "Anterior",
"oobe.done": "Hecho", "oobe.done": "Hecho",
"oobe.amupsell.title": "Antes de Empezar", "oobe.amupsell.title": "Antes de Empezar",
"oobe.amupsell.text": "Cider Requiere una Suscripción paga Activa a Apple Music\nCider NO funcionará con Apple Music Voice Plan ni con algunas suscripciones de prueba promocionales. Si ya tiene una suscripción calificada de Apple Music, haga clic en Siguiente para continuar.", "oobe.amupsell.text": "Cider Requiere una Suscripción paga Activa a Apple Music\nCider NO funcionará con Apple Music Voice Plan ni con algunas suscripciones de prueba promocionales. Si ya tiene una suscripción calificada de Apple Music, haga click en Siguiente para continuar.",
"oobe.amupsell.subscribeBtn": "Suscríbete a Apple Music", "oobe.amupsell.subscribeBtn": "Suscríbete a Apple Music",
"oobe.amupsell.explainBtn": "Explique", "oobe.amupsell.explainBtn": "Explique",
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ", "oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",

View file

@ -10,6 +10,7 @@
"notification.updatingLibrarySongs": "Actualizando Canciones de la Biblioteca...", "notification.updatingLibrarySongs": "Actualizando Canciones de la Biblioteca...",
"notification.updatingLibraryAlbums": "Actualizando Álbumes de la Biblioteca...", "notification.updatingLibraryAlbums": "Actualizando Álbumes de la Biblioteca...",
"notification.updatingLibraryArtists": "Actualizando Artistas de la Biblioteca...", "notification.updatingLibraryArtists": "Actualizando Artistas de la Biblioteca...",
"term.variables": "Variables",
"term.appleInc": "Apple Inc.", "term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music", "term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts", "term.applePodcasts": "Apple Podcasts",
@ -20,37 +21,54 @@
"term.accountSettings": "Configuración de la Cuenta", "term.accountSettings": "Configuración de la Cuenta",
"term.logout": "Cerrar Sesión", "term.logout": "Cerrar Sesión",
"term.login": "Iniciar Sesión", "term.login": "Iniciar Sesión",
"term.cast": "Transmitir", "term.quickNav": "Navegación rápida",
"term.about": "Acerca de", "term.about": "Acerca de",
"term.privateSession": "Sesión Privada", "term.privateSession": "Sesión Privada",
"term.disablePrivateSession": "deshabilitar Sesión Privada", "term.disablePrivateSession": "Deshabilitar Sesión Privada",
"term.queue": "Cola", "term.queue": "Cola",
"term.autoplay": "Reproducción Automática",
"term.lyrics": "Letras", "term.lyrics": "Letras",
"term.miniplayer": "Mini Reproductor", "term.miniplayer": "Mini-Reproductor",
"term.history": "Historial", "term.history": "Historial",
"term.search": "Buscar", "term.search": "Buscar",
"term.scroll": "Modo de Desplazamiento",
"term.scroll.infinite": "Infinito",
"term.scroll.paged": "${songsPerPage} por Página",
"term.live": "LIVE",
"term.showSearch": "Mostrar Barra de Búsqueda",
"term.hideSearch": "Ocultar Barra de Búsqueda",
"term.library": "Biblioteca", "term.library": "Biblioteca",
"term.listenNow": "Escuchar Ahora", "term.listenNow": "Escuchar Ahora",
"term.browse": "Explorar", "term.browse": "Explorar",
"term.radio": "Radio", "term.radio": "Radio",
"term.recentlyAdded": "Agregadas Recientemente", "term.recentlyAdded": "Agregado Recientemente",
"term.songs": "Canciones", "term.songs": "Canciones",
"term.albums": "Álbumes", "term.albums": "Álbumes",
"term.artists": "Artistas", "term.artists": "Artistas",
"term.podcasts": "Podcasts", "term.podcasts": "Podcasts",
"term.playlists": "Listas de Reproducción", "term.playlists": "Listas de Reproducción",
"term.charts": "Tarjetas",
"term.playlist": "Lista de Reproducción", "term.playlist": "Lista de Reproducción",
"term.newPlaylist": "Nueva Lista de Reproducción", "term.newPlaylist": "Nueva Lista de Reproducción",
"term.newPlaylistFolder": "Nueva Carpeta de Listas de Reproducción", "term.newPlaylistFolder": "Nueva Carpeta de Listas de Reproducción",
"term.createNewPlaylist": "Crear Nueva Lista de Reproducción", "term.createNewPlaylist": "Crear Nueva Lista de Reproducción",
"term.createNewPlaylistFolder": "Crear Nueva Carpeta de Listas de Reproducción", "term.createNewPlaylistFolder": "Crear Nueva Carpeta de Listas de Reproducción",
"term.deletePlaylist": "Estas Seguro de Querer Eliminar esta Lista de Reproducción", "term.deletePlaylist": "¿Estas Seguro de Querer Eliminar esta Lista de Reproducción?",
"term.navigateBack": "Navegar Hacia Atrás",
"term.navigateForward": "Navegar Hacia Adelante",
"term.play": "Reproducir", "term.play": "Reproducir",
"term.playpause": "Reproducir/Pausar",
"term.pause": "Pausar", "term.pause": "Pausar",
"term.stop": "Detener",
"term.previous": "Anterior", "term.previous": "Anterior",
"term.next": "Siguiente", "term.next": "Siguiente",
"term.shuffle": "Aleatorio", "term.shuffle": "Aleatorio",
"term.enableShuffle": "Habilitar Reproducción Aleatoria",
"term.disableShuffle": "Desactivar Reproducción Aleatoria",
"term.repeat": "Repetir", "term.repeat": "Repetir",
"term.enableRepeatOne": "Habilitar Repetir Uno",
"term.disableRepeatOne": "Deshabilitar Repetir Uno",
"term.disableRepeat": "Deshabilitar Repetir",
"term.volume": "Volumen", "term.volume": "Volumen",
"term.mute": "Silenciar", "term.mute": "Silenciar",
"term.unmute": "De-silenciar", "term.unmute": "De-silenciar",
@ -72,6 +90,7 @@
"term.viewAs": "Ver como", "term.viewAs": "Ver como",
"term.viewAs.coverArt": "Portada", "term.viewAs.coverArt": "Portada",
"term.viewAs.list": "Lista", "term.viewAs.list": "Lista",
"term.dynamic": "Dinámico",
"term.size": "Tamaño", "term.size": "Tamaño",
"term.size.normal": "Normal", "term.size.normal": "Normal",
"term.size.compact": "Compacto", "term.size.compact": "Compacto",
@ -88,7 +107,7 @@
"term.less": "Menos", "term.less": "Menos",
"term.showMore": "Mostrar Más", "term.showMore": "Mostrar Más",
"term.showLess": "Mostrar Menos", "term.showLess": "Mostrar Menos",
"term.topSongs": "Canciones Principales", "term.topSongs": "Mejores canciones",
"term.latestReleases": "Últimos Lanzamientos", "term.latestReleases": "Últimos Lanzamientos",
"term.time.added": "Agregado", "term.time.added": "Agregado",
"term.time.released": "Publicado", "term.time.released": "Publicado",
@ -113,12 +132,14 @@
"one": "Segundo", "one": "Segundo",
"other": "Segundos" "other": "Segundos"
}, },
"term.fullscreenView": "Vista de Pantalla Completa", "term.fullscreenView": "Pantalla Completa",
"term.defaultView": "Vista Predeterminada", "term.defaultView": "Vista Predeterminada",
"term.audioSettings": "Configuración de Audio", "term.audioSettings": "Configuración de Audio",
"term.audioControls": "Configuración volumen", "term.audioControls": "Configuración volumen",
"term.clearAll": "Borrar todo", "term.clearAll": "Borrar todo",
"term.recentStations": "Estaciones Recientes", "term.recentStations": "Estaciones Recientes",
"term.personalStations": "Estaciones Personales",
"term.amLive": "Apple Music Live",
"term.language": "Idioma", "term.language": "Idioma",
"term.funLanguages": "Idiomas Fun (Parodias)", "term.funLanguages": "Idiomas Fun (Parodias)",
"term.noLyrics": "Cargando... / Letras no encontradas./ Instrumental.", "term.noLyrics": "Cargando... / Letras no encontradas./ Instrumental.",
@ -130,7 +151,7 @@
"term.socialTeam": "Equipo Social", "term.socialTeam": "Equipo Social",
"term.socials": "Redes Sociales", "term.socials": "Redes Sociales",
"term.contributors": "Contribuidores", "term.contributors": "Contribuidores",
"term.equalizer": "Equalizador", "term.equalizer": "Ecualizador",
"term.reset": "Reiniciar", "term.reset": "Reiniciar",
"term.tracks": "Pistas", "term.tracks": "Pistas",
"term.track": { "term.track": {
@ -139,124 +160,176 @@
}, },
"term.videos": "Videos", "term.videos": "Videos",
"term.menu": "Menú", "term.menu": "Menú",
"term.themeManaged": "Administrado por un Tema",
"term.check": "Comprobar", "term.check": "Comprobar",
"term.aboutArtist": "Acerca de {{artistName}}", "term.aboutArtist": "Acerca de {{artistName}}",
"term.topResult": "Mejor resultado", "term.topResult": "Mejor Resultado",
"term.sharedPlaylists": "Listas de reproducción compartidas", "term.sharedPlaylists": "Listas de Reproducción Compartidas",
"term.people": "Personas", "term.people": "Personas",
"term.newpreset.name": "Nuevo nombre de preajuste de ecualizador", "term.newpreset.name": "Nuevo nombre de Preset de Ecualizador",
"term.addedpreset": "Preajuste agregado", "term.addedpreset": "Preset Agregado",
"term.deletepreset.warn": "¿Estas seguro de que quieres eliminar este preajuste?", "term.deletepreset.warn": "¿Estas seguro de que quieres eliminar este Preset?",
"term.deletedpreset": "Preajuste eliminado", "term.deletedpreset": "Preset Eliminado",
"term.defaultPresets": "Preajustes predeterminados", "term.defaultPresets": "Preset Predeterminados",
"term.userPresets": "Preajustes de usuario", "term.userPresets": "Preset de Usuario",
"term.requestError": "Hubo un problema con la solicitud.", "term.requestError": "Hubo un problema con la solicitud.",
"term.song.link.generate": "Obtener URL de la Canción compartida...", "term.song.link.generate": "Obtener URL de la Canción compartida...",
"term.musicVideos": "Videos de Música", "term.musicVideos": "Videos Musicales",
"term.stations": "Estaciones", "term.stations": "Estaciones",
"term.curators": "Curadores", "term.curators": "Curadores",
"term.appleCurators": "Curadores de Apple", "term.appleCurators": "Curadores de Apple",
"term.radioShows": "Programas de Radio", "term.radioShows": "Programas de Radio",
"term.recordLabels": "Etiquetas discográficas", "term.recordLabels": "Etiquetas Discográficas",
"term.videoExtras": "Extras de Video", "term.videoExtras": "Extras de Video",
"term.top": "Top", "term.top": "Top",
"term.version": "Version", "term.version": "Versión",
"term.noVideos": "No hay videos disponibles.", "term.noVideos": "No hay Videos Disponibles.",
"term.plugin": "Plug-in", "term.plugins": "Plugins",
"term.pluginMenu": "Plug-in Menu", "term.plugin": "Plugin",
"term.pluginMenu.none": "Sin plugins interactivos", "term.pluginMenu": "Plugins Menú",
"term.replay": "Repetir", "term.pluginMenu.none": "Sin Plugins Interactivos",
"term.uniqueAlbums": "Álbumes únicos", "term.replay": "Replay",
"term.uniqueArtists": "Artistas únicos", "term.uniqueAlbums": "Álbumes Únicos",
"term.uniqueSongs": "Canciones únicas", "term.uniqueArtists": "Artistas Únicos",
"term.topArtists": "Artistas Principales", "term.uniqueSongs": "Canciones Únicas",
"term.listenedTo": "Escuchado:", "term.topArtists": "Mejores Artistas",
"term.listenedTo": "Escuchando a:",
"term.times": "Veces", "term.times": "Veces",
"term.topAlbums": "Mejores álbumes", "term.topAlbums": "Mejores Álbumes",
"term.plays": "Reproducciones", "term.plays": "Reproducciones",
"term.topGenres": "Mejores Géneros", "term.topGenres": "Mejores Géneros",
"term.confirmLogout": "¿Estás seguro de que quieres cerrar sesión?", "term.confirmLogout": "¿Estás seguro de que quieres cerrar sesión?",
"term.creditDesignedBy": "Diseñado por ${authorUsername}", "term.creditDesignedBy": "Diseñado por ${authorUsername}",
"term.discNumber": "Disco ${discNumber}", "term.discNumber": "Disco ${discNumber}",
"home.title": "Hogar", "term.reload" : "¿ Recargar Cider ?",
"term.toggleprivate" : "Cambiar a Sesión Privada",
"term.webremote" : "Web Remoto",
"term.cast" : "Transmitir",
"term.cast2" : "Transmitir a los Dispositivos",
"term.quit" : "Salir",
"term.zoomin" : "Acercar",
"term.zoomout" : "Alejar",
"term.zoomreset" : "Restablecer",
"term.fullscreen" : "Pantalla Completa",
"term.nowPlaying": "Reproduciendo Ahora",
"home.syncFavorites": "Sincronizar Favoritos",
"home.syncFavorites.gettingArtists": "Consiguiendo Artistas Favoritos...",
"action.favorite": "Favorito",
"action.removeFavorite": "Eliminar Favorito",
"action.refresh": "Actualizar",
"home.title": "Inicio",
"home.recentlyPlayed": "Escuchado Recientemente", "home.recentlyPlayed": "Escuchado Recientemente",
"home.recentlyAdded": "Agregado Recientemente", "home.recentlyAdded": "Agregado Recientemente",
"home.artistsFeed": "Tu feed de artistas", "home.artistsFeed": "Tu Feed de artistas",
"home.artistsFeed.noArtist": "Sigue a algunos artistas para ver sus últimos lanzamientos", "home.artistsFeed.noArtist": "Sigue a algunos Artistas para ver sus Últimos Lanzamientos",
"home.madeForYou": "Hecho para ti", "home.madeForYou": "Hecho para Ti",
"home.friendsListeningTo": "Amigos escuchando", "home.friendsListeningTo": "Amigos Escuchando",
"home.followedArtists": "Artistas seguidos", "home.followedArtists": "Artistas Seguidos",
"error.appleMusicSubRequired": "Apple Music requiere una suscripción.", "error.appleMusicSubRequired": "Apple Music Requiere una Suscripción.",
"error.connectionError": "Hubo un problema al conectarse a Apple Music.", "error.connectionError": "Hubo un problema al conectarse a Apple Music.",
"error.noResults": "No hay resultados.", "error.noResults": "No hay Resultados.",
"error.noResults.description": "Prueba una nueva búsqueda", "error.noResults.description": "Prueba una Nueva Búsqueda",
"podcast.followOnCider": "Sigue en Cider", "podcast.followOnCider": "Sigue en Cider",
"podcast.followedOnCider": "Siguiendo en Cider", "podcast.followedOnCider": "Siguiendo en Cider",
"podcast.subscribeOnItunes": "Suscríbete en iTunes", "podcast.subscribeOnItunes": "Suscríbete en iTunes",
"podcast.subscribedOnItunes": "Suscrito en iTunes", "podcast.subscribedOnItunes": "Suscrito en iTunes",
"podcast.itunesStore": "Tienda de iTunes", "podcast.itunesStore": "Tienda de iTunes",
"podcast.episodes": "Episodios", "podcast.episodes": "Episodios",
"podcast.playEpisode": "Reproducir episodio", "podcast.playEpisode": "Reproducir Episodio",
"podcast.website": "Sitio web de podcasts", "podcast.website": "Sitio web de Podcasts",
"action.addToLibrary": "Agregar a la biblioteca", "action.hideLibrary": "Ocultar biblioteca",
"action.addToLibrary.success": "Agregado a la biblioteca", "action.showLibrary": "Mostrar biblioteca",
"action.addToLibrary.error": "Error al agregar a la biblioteca", "action.cut": "Cortar",
"action.removeFromLibrary": "Eliminar de la biblioteca", "action.paste": "Pegar",
"action.removeFromLibrary.success": "Eliminado de la biblioteca", "action.selectAll": "Seleccionar Todo",
"action.addToQueue": "Añadir a la cola", "action.delete": "Borrar",
"action.addToQueue.success": "Agregado a la cola", "action.edit": "Editar",
"action.addToQueue.error": "Error al agregar a la cola", "action.done": "Hecho",
"action.removeFromQueue": "Eliminar de la cola", "action.submit": "Enviar",
"action.removeFromQueue.success": "Eliminado de la cola", "action.editTracklist": "Editar Lista de Canciones",
"action.removeFromQueue.error": "Error al eliminar de la cola", "action.addToLibrary": "Agregar a la Biblioteca",
"action.addToLibrary.success": "Agregado a la Biblioteca",
"action.addToLibrary.error": "Error al agregar a la Biblioteca",
"action.removeFromLibrary": "Eliminar de la Biblioteca",
"action.removeFromLibrary.success": "Eliminado de la Biblioteca",
"action.addToQueue": "Agregar a la Cola",
"action.addToQueue.success": "Agregado a la Cola",
"action.addToQueue.error": "Error al Agregar a la Cola",
"action.removeFromQueue": "Eliminar de la Cola",
"action.removeFromQueue.success": "Eliminado de la Cola",
"action.removeFromQueue.error": "Error al Eliminar de la Cola",
"action.createPlaylist": "Crear una nueva lista de reproducción", "action.createPlaylist": "Crear una nueva lista de reproducción",
"action.addToPlaylist": "Agregar a lista de reproducción", "action.addToPlaylist": "Agregar a lista de reproducción",
"action.removeFromPlaylist": "Eliminar de la lista de reproducción", "action.removeFromPlaylist": "Eliminar de la lista de reproducción",
"action.addToFavorites": "Agregar a favoritos", "action.addToFavorites": "Agregar a Favoritos",
"action.follow": "Seguir", "action.follow": "Seguir",
"action.follow.success": "Siguiendo", "action.follow.success": "Siguiendo",
"action.follow.error": "Error al seguir", "action.follow.error": "Error al Seguir",
"action.unfollow": "Dejar de seguir", "action.unfollow": "Dejar de Seguir",
"action.unfollow.success": "Dejando de seguir", "action.unfollow.success": "Dejando de Seguir",
"action.unfollow.error": "Error al dejar de seguir", "action.unfollow.error": "Error al dejar de Seguir",
"action.playNext": "Reproducir siguiente", "action.playNext": "Reproducir Siguiente",
"action.playLater": "Reproducir más tarde", "action.playLater": "Reproducir Más Tarde",
"action.startRadio": "Iniciar Radio", "action.startRadio": "Iniciar Radio",
"action.goToArtist": "Ir al artista", "action.goToArtist": "Ir al Artista",
"action.goToAlbum": "Ir al álbum", "action.goToAlbum": "Ir al Álbum",
"action.showInPlaylist": "Mostrar en lista de reproducción", "action.showInPlaylist": "Mostrar en Lista de Reproducción",
"action.showInAppleMusic": "Mostrar en Apple Music", "action.showInAppleMusic": "Mostrar en Apple Music",
"action.moveToTop": "Mover fuera de la carpeta", "action.moveToTop": "Mover fuera de la Carpeta",
"action.share": "Compartir", "action.share": "Compartir",
"action.rename": "Renombrar", "action.rename": "Renombrar",
"action.love": "Love", "action.love": "Me Gusta",
"action.unlove": "Unlove", "action.unlove": "No Me Gusta",
"action.dislike": "Dislike", "action.dislike": "Recomendar menos este contenido",
"action.undoDislike": "Undo dislike", "action.undoDislike": "Recomendar mas este contenido",
"action.showWebRemoteQR": "Web Remota", "action.showWebRemoteQR": "Web Remoto",
"action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} pistas siguientes", "action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} Pistas Siguientes",
"action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} pistas mas tarde", "action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} Pistas mas tarde",
"action.removeTracks": "Eliminar ${self.selectedItems.length} pistas de la cola", "action.removeTracks": "Eliminar ${self.selectedItems.length} Pistas de la Cola",
"action.import": "Importar", "action.import": "Importar",
"action.export": "Exportar", "action.export": "Exportar",
"action.showAlbum": "Mostrar Album Completo", "action.showAlbum": "Mostrar Álbum Completo",
"action.tray.minimize": "Minimizar a la bandeja", "action.tray.minimize": "Minimizar a la bandeja",
"action.tray.quit": "Abandonar", "action.tray.show": "Mostrar Cider",
"action.tray.listento": "Escuchando a:",
"action.update": "Actualizar", "action.update": "Actualizar",
"action.install": "Instalar", "action.install": "Instalar",
"action.copy": "Copiar", "action.copy": "Copiar",
"action.newpreset": "Nuevo preset...", "action.newpreset": "Nuevo Preset...",
"action.deletepreset": "Borrar Preset", "action.deletepreset": "Borrar Preset",
"action.open": "Abrir", "action.open": "Abrir",
"action.relaunch.confirm": "¿Quieres reabrir Cider?", "action.close": "Cerrar",
"action.relaunch.confirm": "¿ Quieres reiniciar Cider ?",
"action.cast.chromecast": "Chromecast", "action.cast.chromecast": "Chromecast",
"action.cast.todevices": "Transmitir a los dispositivos", "action.cast.todevices": "Transmitir a los Dispositivos",
"action.cast.stop": "Dejar de transmitir a todos los dispositivos", "action.cast.stop": "Dejar de transmitir a todos los Dispositivos",
"action.cast.airplay": "AirPlay", "action.cast.airplay": "AirPlay",
"action.cast.airplay.underdevelopment": "AirPlay todavía está en desarrollo", "action.cast.airplay.underdevelopment": "AirPlay todavía está en desarrollo",
"action.cast.scan": "Escanear", "action.cast.scan": "Escanear",
"action.cast.scanning": "Escaneando...", "action.cast.scanning": "Escaneando...",
"action.createNew": "Crear Nuevo...", "action.createNew": "Crear Nuevo...",
"action.openArtworkInBrowser": "Abrir Ilustración en el Navegador",
"action.scrollToTop": "Ir al inicio",
"menubar.options.view": "Ver",
"menubar.options.reload": "Recargar",
"menubar.options.forcereload": "Forzar Recarga",
"menubar.options.toggledevtools": "Herramientas de Desarrollo",
"menubar.options.window": "Ventana",
"menubar.options.minimize": "Minimizar",
"menubar.options.plugins": "Menú de Plugins",
"menubar.options.controls": "Controles",
"menubar.options.volumeup": "Subir Volumen",
"menubar.options.volumedown": "Bajar Volumen",
"menubar.options.account": "Cuenta",
"menubar.options.signout": "Cerrar Sesión",
"menubar.options.support": "Soporte",
"menubar.options.report": "Reportar a...",
"menubar.options.bug": "Bug",
"menubar.options.feature": "Solicitud de características",
"menubar.options.trans": "Solicitud de Informe/Traducción",
"menubar.options.license": "Ver licencia",
"menubar.options.conf": "Abrir archivo de configuración en el editor",
"menubar.options.zoom": "Zoom",
"settings.header.general": "General", "settings.header.general": "General",
"settings.header.general.description": "Ajuste la configuración general de Cider.", "settings.header.general.description": "Ajuste la configuración general de Cider.",
"settings.option.general.language": "Idioma", "settings.option.general.language": "Idioma",
@ -266,18 +339,52 @@
"settings.option.general.resumebehavior.locally.description": "Cider reanudará su última sesión en esta PC.", "settings.option.general.resumebehavior.locally.description": "Cider reanudará su última sesión en esta PC.",
"settings.option.general.resumebehavior.history": "Histórico", "settings.option.general.resumebehavior.history": "Histórico",
"settings.option.general.resumebehavior.history.description": "Cider pondrá en cola la última canción de su historial general de Apple Music, en todos sus dispositivos.", "settings.option.general.resumebehavior.history.description": "Cider pondrá en cola la última canción de su historial general de Apple Music, en todos sus dispositivos.",
"settings.option.general.resumetabs": "Abrir pestaña al iniciar",
"settings.option.general.resumetabs.description": "Puede elegir qué pestaña desea abrir cuando inicie Cider.",
"settings.option.general.resumetabs.dynamic": "Dinámico",
"settings.option.general.resumetabs.dynamic.description": "Cider abrirá la pestaña que utilizó por última vez.",
"settings.option.general.language.main": "Idiomas", "settings.option.general.language.main": "Idiomas",
"settings.option.general.language.fun": "Idiomas Fun (Parodias)", "settings.option.general.language.fun": "Idiomas Fun (Parodias)",
"settings.option.general.language.unsorted": "Sin Clasificar", "settings.option.general.language.unsorted": "Sin Clasificar",
"settings.option.general.customizeSidebar": "Personalizar elementos de la barra lateral", "settings.option.general.customizeSidebar": "Personalizar elementos de la barra lateral",
"settings.option.general.customizeSidebar.customize": "Personalizar", "settings.option.general.customizeSidebar.customize": "Personalizar",
"settings.option.general.keybindings": "Combinaciones de Teclas",
"settings.option.general.keybindings.library": "Biblioteca",
"settings.option.general.keybindings.session": "Sesión",
"settings.option.general.keybindings.control": "Controles",
"settings.option.general.keybindings.interface": "Interfaz",
"settings.option.general.keybindings.advanced": "Avanzado",
"settings.option.general.keybindings.pressCombination": "Presione una combinación de dos teclas para actualizar la combinación de teclas.",
"settings.option.general.keybindings.pressEscape": "Pulse la tecla Escape para volver.",
"settings.notyf.general.keybindings.update.success": "Combinación de teclas actualizada correctamente",
"settings.prompt.general.keybindings.update.success": "La combinación de teclas se actualizó correctamente. Pulsa OK para reiniciar Cider",
"settings.option.general.themeUpdateNotification": "Buscar actualizaciones de temas automáticamente",
"settings.option.general.showLovedTracksInline": "Mostrar pistas favoritas en la línea",
"settings.description.search": "Buscar",
"settings.description.albums": "Álbumes de la biblioteca",
"settings.description.artists": "Artistas de la biblioteca",
"settings.description.browse": "Navegar",
"settings.description.private": "Cambiar a Sesión Privada",
"settings.description.remote": "Web Remoto",
"settings.description.audio": "Configuraciones de Audio",
"settings.description.plugins": "Menú de Plugins",
"settings.description.cast": "Transmitir a los Dispositivos",
"settings.description.settings": "Configuraciones",
"settings.description.developer": "Herramientas para Desarrolladores",
"settings.description.listnow": "Escuchar Ahora",
"settings.description.recentAdd": "Agregadas Recientemente",
"settings.description.songs": "Canciones",
"settings.notyf.updateCider.update-not-available": "No hay actualizaciones disponibles", "settings.notyf.updateCider.update-not-available": "No hay actualizaciones disponibles",
"settings.notyf.updateCider.update-downloaded": "La actualización se ha descargado, reinicie para aplicarla", "settings.notyf.updateCider.update-downloaded": "La actualización se ha descargado, Reinicie para aplicarla",
"settings.notyf.updateCider.update-timeout": "Tiempo de espera agotado para actualizar Cider", "settings.notyf.updateCider.update-timeout": "Tiempo de espera agotado para actualizar Cider",
"settings.header.audio": "Audio", "settings.header.audio": "Audio",
"settings.header.audio.description": "Ajuste la configuración de audio para Cider.", "settings.header.audio.description": "Ajuste la configuración de audio para Cider.",
"settings.option.audio.volumeStep": "Paso de Volumen", "settings.option.audio.volumeStep": "Pasos de Volumen",
"settings.option.audio.advanced": "Control de Volumen Avanzado",
"settings.option.audio.maxVolume": "Volumen Máximo", "settings.option.audio.maxVolume": "Volumen Máximo",
"settings.option.audio.changePlaybackRate": "Cambiar la Velocidad de Reproducción",
"settings.option.audio.playbackRate": "Velocidad de Reproducción",
"settings.option.audio.playbackRate.change": "Cambiar",
"settings.option.audio.quality": "Calidad de Audio", "settings.option.audio.quality": "Calidad de Audio",
"settings.header.audio.quality.hireslossless": "Hi-Res Lossless", "settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
"settings.header.audio.quality.hireslossless.description": "arriba de 24-bit/192 kHz", "settings.header.audio.quality.hireslossless.description": "arriba de 24-bit/192 kHz",
@ -289,40 +396,69 @@
"settings.header.audio.quality.standard.description": "64 kbps", "settings.header.audio.quality.standard.description": "64 kbps",
"settings.option.audio.seamlessTransition": "Transición de audio sin interrupciones", "settings.option.audio.seamlessTransition": "Transición de audio sin interrupciones",
"settings.option.audio.enableAdvancedFunctionality": "Habilitar funcionalidad avanzada", "settings.option.audio.enableAdvancedFunctionality": "Habilitar funcionalidad avanzada",
"settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirá funciones de audio extendidas como normalización de audio, ecualizadores y visualizadores; sin embargo, en algunos sistemas esto puede causar interrupciones en las pistas de audio.", "settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirá funciones de audio extendidas como Normalización de Audio, Ecualizadores y Visualizadores. Sin embargo, en algunos sistemas esto puede causar interrupciones en las pistas de audio.",
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider cree que su PC no puede manejar estas funciones. ¿Estás seguro de que quieres continuar?", "settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider cree que su PC no puede manejar estas funciones. ¿ Estás seguro de que quieres continuar ?",
"settings.option.audio.audioLab": "Cider Audio Lab", "settings.option.audio.audioLab": "Cider Audio Lab",
"settings.option.audio.audioLab.description": "Una variedad de efectos de audio desarrollados internamente para Cider.", "settings.option.audio.audioLab.description": "Una variedad de efectos de Audio desarrollados internamente para Cider.",
"settings.warn.audioLab.withoutAF": "Se requiere AudioContext (funcionalidad avanzada) para habilitar Laboratorio de audio de Cider.", "settings.option.audio.audioLab.subheader": "Designed by Cider Acoustic Technologies in California",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calidez analógica", "settings.warn.audioLab.withoutAF": "Se requiere AudioContext (funcionalidad avanzada) para habilitar Cider Audio Lab.",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula la calidez analógica inspirada en el Korg Nutube 6P1", "settings.warn.enableAdvancedFunctionality": "AudioContext (funcionalidad avanzada) es necesaria para Habilitar esta Característica.",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidad de calidez analógica", "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calidez Analógica",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Cambia la intensidad del procesamiento del módulo de Calidez analógica", "settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula la Calidez Analógica inspirada en el Korg Nutube 6P1",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidad de Calidez Analógica",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Cambia la intensidad del procesamiento del módulo de Calidez Analógica",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Suave", "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Suave",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Calido", "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Calido",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Realiza una Atmósfera musical diferente modelada a partir de las configuraciones de audio de última generación.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider Atmosphere Realizer™ Mode",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Cambia el modo de funcionamiento del módulo Atmosphere Realizer.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Té De Espuma de Queso Hōjicha",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Té con Leche de Tapioca Genmaicha",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Té De Espuma De Queso Con Sal de Roca",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Té con Leche Uji Matcha",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jazmín Macchiato",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Té de leche de Hokkaido",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Pastel Suave de Luz de Luna",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Leche Creme Brûlée de Azúcar Morena",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "Clafoutis de Cerezas",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Abrazo de Calidez",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Mejora la calidad de audio percibida del audio AAC de 256 kbps mediante el uso de un algoritmo en tiempo real que aprovecha los modelos psicoacústicos de la audición humana y las características de codificación AAC.", "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Mejora la calidad de audio percibida del codificador de audio en AAC mediante el uso de un algoritmo en 'Tiempo Real' que aprovecha los modelos psicoacústicos de la audición humana y las características de codificación de AAC.",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP no es compatible con la espacialización. Desactive la espacialización para continuar.", "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP no es compatible con la Espacialización. Desactive la Espacialización para continuar.",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Intensidad de CAP", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Fuerza de CAP",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Cambia la intensidad del procesamiento realizado en el audio. (Agresivo puede producir resultados no deseados)", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Cambia la intensidad del procesamiento realizado en el audio. (Agresivo puede producir resultados no deseados)",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Estándar", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Estándar",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptativo",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Legacy",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresivo", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresivo",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalización de audio", "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalización de audio",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza el volumen máximo de pistas individuales para crear una experiencia auditiva más uniforme. (No funciona en las pistas cargadas por el usuario)", "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza el volumen máximo de las Canciones individuales para crear una experiencia auditiva más uniforme. (No funciona en las Canciones cargadas por el usuario)",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Gestionado por AudioLab", "settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Gestionado por AudioLab",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider Tuned Spatialization", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Espacialización ajustada de Cider",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efecto de preajuste de espacialización, deshabilita la configuración personalizable de la espacialización de audio. La espacialización debe estar habilitada como requisito previo.", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efecto de Preajuste de espacialización, desactiva la configuración personalizable de espacialización de audio.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Perfil de espacialización de Cider", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Perfil de espacialización de Cider",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Cambia el Perfil de Ajuste de Espacialización.", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Cambia el Perfil de Ajuste de la Espacialización.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Estándar", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Estandar",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Estudio de Sonido",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separación",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Mínimo",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiófilo", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiófilo",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Difuso",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encore",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "La espacialización no es compatible con CAP. Deshabilite CAP para continuar.", "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "La espacialización no es compatible con CAP. Deshabilite CAP para continuar.",
"settings.option.audio.dbspl.display": "Visualización de dB SPL",
"settings.option.audio.dbspl.description": "(Solo para usuarios avanzados) Muestra dB SPL en lugar de dBFS en el control deslizante de Volumen.",
"settings.option.audio.dbfs.calibration": "Calibración de 0 dBFS",
"settings.option.audio.dbfs.description": "Ingrese el Pico de dB SPL con 'Ponderación Z' cuando Cider esté en 0 dBFS.",
"settings.header.visual": "Visual", "settings.header.visual": "Visual",
"settings.header.visual.description": "Ajuste la configuración visual de Cider.", "settings.header.visual.description": "Ajuste la configuración visual de Cider.",
"settings.option.visual.windowStyle": "Estilo de ventana", "settings.option.visual.windowStyle": "Estilo de Ventana",
"settings.option.visual.windowBackgroundStyle": "Estilo de fondo de ventana", "settings.option.visual.windowBackgroundStyle": "Estilo de Fondo de Ventana",
"settings.header.visual.windowBackgroundStyle.none": "Ninguno", "settings.header.visual.windowBackgroundStyle.none": "Ninguno",
"settings.header.visual.windowBackgroundStyle.artwork": "ilustracion", "settings.header.visual.windowBackgroundStyle.artwork": "ilustración",
"settings.header.visual.windowBackgroundStyle.image": "Imagen", "settings.header.visual.windowBackgroundStyle.image": "Imagen",
"settings.option.visual.animatedArtwork": "Ilustración Animada", "settings.option.visual.animatedArtwork": "Ilustración Animada",
"settings.header.visual.animatedArtwork.always": "Siempre", "settings.header.visual.animatedArtwork.always": "Siempre",
@ -334,19 +470,29 @@
"settings.header.visual.animatedArtworkQuality.high": "Alto", "settings.header.visual.animatedArtworkQuality.high": "Alto",
"settings.header.visual.animatedArtworkQuality.veryHigh": "Muy alto", "settings.header.visual.animatedArtworkQuality.veryHigh": "Muy alto",
"settings.header.visual.animatedArtworkQuality.extreme": "Extremo", "settings.header.visual.animatedArtworkQuality.extreme": "Extremo",
"settings.option.visual.animatedWindowBackground": "Fondo de ventana animado", "settings.option.visual.animatedWindowBackground": "Fondo de Ventana Animado",
"settings.option.visual.hardwareAcceleration": "Aceleracion de hardware", "settings.option.visual.hardwareAcceleration": "Aceleración de Hardware",
"settings.option.visual.hardwareAcceleration.description": "Requiere reinicio", "settings.option.visual.hardwareAcceleration.description": "Requiere reinicio",
"settings.header.visual.hardwareAcceleration.default": "Por defecto", "settings.header.visual.hardwareAcceleration.default": "Por defecto",
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
"settings.option.visual.uiscale": "Escalado de IU",
"settings.header.visual.theme": "Tema", "settings.header.visual.theme": "Tema",
"settings.option.visual.theme.github.download": "Instalar desde la URL de GitHub", "settings.option.visual.theme.github.download": "Instalar desde la URL de GitHub",
"settings.option.visual.theme.github.explore": "Explorar temas de GitHub", "settings.option.visual.theme.github.openfolder": "Abrir Carpeta de Temas",
"settings.option.visual.theme.github.explore": "Explorar Temas de GitHub",
"settings.header.visual.theme.github.page": "Temas de GitHub", "settings.header.visual.theme.github.page": "Temas de GitHub",
"settings.option.visual.theme.github.install.confirm": "¿Está seguro de que desea instalar {{ repo }}?", "settings.option.visual.theme.github.install.confirm": "¿ Está seguro de que desea instalar {{ repo }} ?",
"settings.prompt.visual.theme.github.URL": "Ingrese la URL del tema que desea instalar", "settings.prompt.visual.theme.github.URL": "Introduce la URL del tema que quieres instalar",
"settings.notyf.visual.theme.install.success": "Tema instalado correctamente", "settings.prompt.visual.theme.uninstallTheme": "¿ Estas seguro que lo quieres desinstalar {{ theme }} ?",
"settings.notyf.visual.theme.install.error": "La instalación del tema falló", "settings.option.visual.theme.checkForUpdates": "Buscar actualizaciones",
"settings.header.visual.styles": "Estilos",
"settings.option.visual.theme.manageStyles": "Gestionar Estilos",
"settings.option.visual.theme.uninstall": "Desinstalar",
"settings.option.visual.theme.viewInfo": "Ver Información",
"settings.option.visual.theme.github.available": "Disponible",
"settings.option.visual.theme.github.applied": "Aplicado",
"settings.notyf.visual.theme.install.success": "Tema Instalado Correctamente",
"settings.notyf.visual.theme.install.error": "La Instalación del Tema Falló",
"settings.header.visual.plugin": "Plugin", "settings.header.visual.plugin": "Plugin",
"settings.option.visual.plugin.github.download": "Instalar desde la URL de GitHub", "settings.option.visual.plugin.github.download": "Instalar desde la URL de GitHub",
"settings.option.visual.plugin.github.explore": "Explorar Plugins de GitHub", "settings.option.visual.plugin.github.explore": "Explorar Plugins de GitHub",
@ -355,7 +501,7 @@
"settings.prompt.visual.plugin.github.URL": "Ingrese la URL del tema que desea instalar", "settings.prompt.visual.plugin.github.URL": "Ingrese la URL del tema que desea instalar",
"settings.prompt.visual.plugin.github.success": "El Plugin instalado correctamente, Presione OK para reiniciar Cider", "settings.prompt.visual.plugin.github.success": "El Plugin instalado correctamente, Presione OK para reiniciar Cider",
"settings.notyf.visual.plugin.install.success": "El Plugin instalado correctamente", "settings.notyf.visual.plugin.install.success": "El Plugin instalado correctamente",
"settings.notyf.visual.plugin.install.error": "La instalación del Plugin falló", "settings.notyf.visual.plugin.install.error": "La instalación del Plugin Falló",
"settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.default": "Cider",
"settings.option.visual.theme.dark": "Oscuro", "settings.option.visual.theme.dark": "Oscuro",
"settings.option.visual.showPersonalInfo": "Mostrar información personal", "settings.option.visual.showPersonalInfo": "Mostrar información personal",
@ -364,7 +510,7 @@
"settings.option.window.openOnStartup": "Abrir Cider al Iniciar", "settings.option.window.openOnStartup": "Abrir Cider al Iniciar",
"settings.option.window.openOnStartup.hidden": "Abrir oculto", "settings.option.window.openOnStartup.hidden": "Abrir oculto",
"settings.option.window.useNativeTitleBar": "Usar barra de título nativa", "settings.option.window.useNativeTitleBar": "Usar barra de título nativa",
"settings.option.window.windowControlStyle": "Estilo de control de ventanaEstilo de control de ventana", "settings.option.window.windowControlStyle": "Estilo de control de ventana",
"settings.option.window.windowControlStyle.right": "Derecha", "settings.option.window.windowControlStyle.right": "Derecha",
"settings.option.window.windowControlStyle.left": "Izquierda", "settings.option.window.windowControlStyle.left": "Izquierda",
"settings.header.lyrics": "Letras", "settings.header.lyrics": "Letras",
@ -373,17 +519,30 @@
"settings.option.lyrics.enableMusixmatchKaraoke": "Habilitar el modo Karaoke (solo Musixmatch)", "settings.option.lyrics.enableMusixmatchKaraoke": "Habilitar el modo Karaoke (solo Musixmatch)",
"settings.option.lyrics.musixmatchPreferredLanguage": "Idioma preferido de traducción de Musixmatch", "settings.option.lyrics.musixmatchPreferredLanguage": "Idioma preferido de traducción de Musixmatch",
"settings.option.lyrics.enableYoutubeLyrics": "Habilitar letras de YouTube para videos musicales", "settings.option.lyrics.enableYoutubeLyrics": "Habilitar letras de YouTube para videos musicales",
"settings.option.lyrics.enableQQLyrics": "Habilitar letras de QQ",
"settings.header.connectivity": "Conectividad", "settings.header.connectivity": "Conectividad",
"settings.header.connectivity.description": "Ajuste la configuración de conectividad para Cider.", "settings.header.connectivity.description": "Ajuste la configuración de conectividad para Cider.",
"settings.option.connectivity.playbackNotifications": "Notificaciones de Reproducción",
"settings.option.connectivity.discordRPC": "Discord Rich Presence", "settings.option.connectivity.discordRPC": "Discord Rich Presence",
"settings.option.connectivity.playbackNotifications": "Notificaciones de reproducción", "settings.option.connectivity.discordRPC.clientName": "Nombre del Cliente",
"settings.option.connectivity.discordRPC.clearOnPause": "Borrar Discord Rich Presence en Pausa", "settings.option.connectivity.discordRPC.clearOnPause": "Borrar Discord Rich Presence en pausa",
"settings.option.connectivity.discordRPC.hideButtons": "Ocultar botones en Discord Rich Presence", "settings.option.connectivity.discordRPC.hideButtons": "Ocultar botones en Discord Rich Presence",
"settings.option.connectivity.discordRPC.hideTimestamp": "Ocultar Marca de Tiempo en Discord Rich Presence",
"settings.option.connectivity.discordRPC.detailsFormat": "Formato de los detalles",
"settings.option.connectivity.discordRPC.stateFormat": "Formato de Estado",
"settings.option.connectivity.discordRPC.reload": "Recargar Discord RPC",
"settings.option.connectivity.discordRPC.reconnectedToUser": "Discord RPC reconectando al usuario: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm Retraso de Scrobble (%)", "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Retraso de Scrobble (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Activar Last.fm Now Playing", "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activar Last.fm Now Playing",
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Eliminar artistas destacados del título de la canción (Last.fm)", "settings.option.connectivity.lastfmScrobble.removeFeatured": "Eliminar artistas destacados del título de la canción (Last.fm)",
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar pista en bucle (Last.fm)", "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar pista en bucle (Last.fm)",
"settings.option.connectivity.lastfmScrobble.filterLoop.description": "Evite que las pistas en bucle se scrobblen o se muestren en la lista Now Playing en Last.fm.",
"settings.option.connectivity.lastfmScrobble.filterTypes": "Tipos de Filtros de Medios (Last.fm)",
"settings.option.connectivity.lastfmScrobble.manualToken": "Ingrese el token de Last.fm Manualmente",
"settings.notyf.connectivity.lastfmScrobble.connectError": "Last.fm Tiempo de Conexión agotado",
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Last.fm Conexión exitosa",
"settings.notyf.connectivity.lastfmScrobble.connecting": "Conectando a Last.fm...",
"settings.header.debug": "Debug", "settings.header.debug": "Debug",
"settings.option.debug.copy_log": "Copiar Logs al portapapeles", "settings.option.debug.copy_log": "Copiar Logs al portapapeles",
"settings.option.debug.openAppData": "Abrir carpeta de Cider", "settings.option.debug.openAppData": "Abrir carpeta de Cider",
@ -393,16 +552,25 @@
"settings.option.experimental.reinstallwidevine.confirm": "¿Estás seguro de que quieres reinstalar Widevine?", "settings.option.experimental.reinstallwidevine.confirm": "¿Estás seguro de que quieres reinstalar Widevine?",
"settings.option.experimental.unknownPlugin": "Fuentes desconocidas", "settings.option.experimental.unknownPlugin": "Fuentes desconocidas",
"settings.option.experimental.unknownPlugin.description": "Permitir la instalación de Plugins desde otros repos que no sean el repositorio de Plugins de Cider", "settings.option.experimental.unknownPlugin.description": "Permitir la instalación de Plugins desde otros repos que no sean el repositorio de Plugins de Cider",
"settings.option.experimental.compactUI": "UI compacta", "settings.option.experimental.compactUI": "UI Compacto",
"settings.option.window.close_button_hide": "El botón Cerrar oculta la aplicación", "settings.option.window.close_button_hide": "El botón Cerrar oculta la aplicación",
"settings.option.window.maxElementScale": "Escala Máxima de Elementos",
"settings.option.experimental.inline_playlists": "Álbumes y listas de reproducción en línea", "settings.option.experimental.inline_playlists": "Álbumes y listas de reproducción en línea",
"settings.option.advanced.playlistTrackMapping": "Mapeo de pistas de listas de reproducción", "settings.option.advanced.playlistTrackMapping": "Mapeo de pistas de listas de reproducción",
"settings.option.advanced.playlistTrackMapping.description": "Habilita el escaneo profundo de las listas de reproducción para determinar qué pistas están en qué listas de reproducción. Los tiempos de creación de la caché de la lista de reproducción pueden aumentar significativamente.", "settings.option.advanced.playlistTrackMapping.description": "Habilita el escaneo profundo de las listas de reproducción para determinar qué pistas están en qué listas de reproducción. Los tiempos de creación de la caché de la lista de reproducción pueden aumentar significativamente.",
"settings.option.visual.transparent": "Marco transparente", "settings.option.visual.transparent": "Marco transparente",
"settings.option.visual.transparent.description": "Necesita compatibilidad con temas, requiere reiniciar", "settings.option.visual.transparent.description": "Necesita compatibilidad con temas, requiere reiniciar",
"settings.option.visual.customAccentColor": "Color de Acento Personalizado",
"settings.option.visual.accentColor": "Color de Acento",
"settings.option.visual.purplePodcastPlaybackBar": "Barra de Reproducción Morada para Podcasts",
"settings.option.visual.windowColor": "Color de Tinte de Ventana",
"settings.header.visual.windowBackgroundStyle.color": "Matiz de Color",
"settings.header.advanced": "Avanzado", "settings.header.advanced": "Avanzado",
"spatial.notTurnedOn": "La espacialización de audio está deshabilitada. Para usar, habilítelo primero.", "settings.header.connect": "Conectar",
"spatial.spatialProperties": "Propiedades de Espacializacion", "settings.option.connect.link_account": "Habilitar sincronización con Cider Connect",
"settings.option.connect.link_account.description": "Vincular su cuenta de Discord con Cider Connect le permite almacenar datos de usuario que incluyen configuraciones, ecualizadores y eventualmente más, una vez que haya terminado. (Trabajo en progreso)",
"spatial.notTurnedOn": "La Espacialización de audio está deshabilitada. Para usar, habilítelo primero.",
"spatial.spatialProperties": "Propiedades de Espacialización",
"spatial.width": "Ancho", "spatial.width": "Ancho",
"spatial.height": "Alto", "spatial.height": "Alto",
"spatial.depth": "Profundidad", "spatial.depth": "Profundidad",
@ -431,7 +599,46 @@
"share.platform.whatsapp": "WhatsApp", "share.platform.whatsapp": "WhatsApp",
"share.platform.messenger": "Messenger", "share.platform.messenger": "Messenger",
"share.platform.email": "Email", "share.platform.email": "Email",
"share.platform.songLink": "Copy with song.link", "share.platform.songLink": "Copiar con song.link",
"share.platform.clipboard": "Copiar link", "share.platform.clipboard": "Copiar link",
"about.thanks": "Muchas gracias al equipo de Cider Collective y a todos nuestros colaboradores." "about.thanks": "Muchas gracias al equipo de Cider Collective y a Todos nuestros colaboradores.",
"oobe.yes": "Sí",
"oobe.no": "No",
"oobe.next": "Siguiente",
"oobe.previous": "Anterior",
"oobe.done": "Hecho",
"oobe.amupsell.title": "Antes de Empezar",
"oobe.amupsell.text": "Cider Requiere una Suscripción paga Activa a Apple Music\nCider NO funcionará con Apple Music Voice Plan ni con algunas suscripciones de prueba promocionales. Si ya tiene una suscripción calificada de Apple Music, haga click en Siguiente para continuar.",
"oobe.amupsell.subscribeBtn": "Suscríbete a Apple Music",
"oobe.amupsell.explainBtn": "Explique",
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
"oobe.amupsell.promoExplained": "Algunas suscripciones de Apple Music promocionales y de prueba fuera de EE.UU. no tienen acceso a las API del reproductor web de Apple Music necesarias para que Cider funcione. Para verificar si su versión de prueba activa funcionará con Cider, vaya a <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a> inicie sesión e intente reproducir música. Si funciona, ¡genial! Está listo para usar Cider, sin embargo, si no considera suscribirse a Apple Music aquí: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
"oobe.intro.title": "Bienvenido a Cider",
"oobe.intro.subtitle": "",
"oobe.intro.text": "Configuremos algunas cosas para que puedas usar Cider como quieras. Siempre puede cambiar esta configuración más tarde.",
"oobe.general.title": "General",
"oobe.general.subtitle": "",
"oobe.general.text": "",
"oobe.audio.title": "Audio",
"oobe.audio.subtitle": "",
"oobe.audio.text": "Cider cuenta con una pila de audio diseñada y afinada a medida que brinda una experiencia de audio rica y de alta calidad.\nCon Cider Adrenaline, Atmosphere Realizer y Spatialized Audio.\nPara habilitar esta funcionalidad, \"Funcionalidad de audio avanzada\" debe estar habilitada.\nHabilitar audio avanzado La funcionalidad le dará acceso a estas mejoras en Cider Audio Labs, que se encuentra en la configuración de la aplicación.",
"oobe.audio.advancedFunctionality": "",
"oobe.visual.title": "Visual",
"oobe.visual.subtitle": "",
"oobe.visual.text": "",
"oobe.visual.layout.text": "Cider presenta dos diseños de ventana diferentes.\nMaverick es un diseño similar a iTunes con el reproductor en la parte superior de la ventana.\nMojave es un nuevo giro creado por Cider Collective.\n\nPuedes cambiar el diseño en cualquier momento en la configuración.",
"oobe.visual.suggestingThemes": "La tematización es una excelente forma de personalizar tu experiencia. Aquí hay algunos que sugerimos: ",
"oobe.visual.suggestingThemes.subtext": "(Estos temas se descargarán de GitHub)",
"oobe.visual.suggestingThemes.default": "Cider",
"oobe.visual.suggestingThemes.default.text": "El clásico tema de Cider.",
"oobe.visual.suggestingThemes.dark": "Oscuro",
"oobe.visual.suggestingThemes.dark.text": "Oscurisimo",
"oobe.visual.suggestingThemes.community1": "Groovy",
"oobe.visual.suggestingThemes.community1.text": "Un tema influenciado por WinUI",
"oobe.visual.suggestingThemes.community2": "iTheme",
"oobe.visual.suggestingThemes.community2.text": " El clásico diseño de frutas grandes.",
"oobe.visual.suggestingThemes.community3": "Dracula",
"oobe.visual.suggestingThemes.community3.text": "El icónico esquema de color de Drácula.",
"oobe.amsignin.title": ""
} }

View file

@ -10,6 +10,7 @@
"notification.updatingLibrarySongs": "Обновление медиатеки песен...", "notification.updatingLibrarySongs": "Обновление медиатеки песен...",
"notification.updatingLibraryAlbums": "Обновление медиатеки альбомов...", "notification.updatingLibraryAlbums": "Обновление медиатеки альбомов...",
"notification.updatingLibraryArtists": "Обновление медиатеки артистов...", "notification.updatingLibraryArtists": "Обновление медиатеки артистов...",
"term.variables": "Переменные",
"term.appleInc": "Apple Inc.", "term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music", "term.appleMusic": "Apple Music",
"term.applePodcasts": "Подкасты Apple", "term.applePodcasts": "Подкасты Apple",
@ -18,17 +19,24 @@
"term.discord": "Discord", "term.discord": "Discord",
"term.learnMore": "Узнать больше", "term.learnMore": "Узнать больше",
"term.accountSettings": "Настройки аккаунта", "term.accountSettings": "Настройки аккаунта",
"term.logout": "Выйти", "term.logout": "Выйти из аккаунта",
"term.login": "Войти", "term.login": "Войти",
"term.cast": "Транслировать", "term.quickNav": "Быстрая навигация",
"term.about": "О Cider", "term.about": "О Cider",
"term.privateSession": "Частная сессия", "term.privateSession": "Частная сессия",
"term.disablePrivateSession": "Выключить частную сессию", "term.disablePrivateSession": "Выключить частную сессию",
"term.queue": "Очередь", "term.queue": "Очередь",
"term.autoplay": "Автовоспроизведение",
"term.lyrics": "Текст", "term.lyrics": "Текст",
"term.miniplayer": "Мини-проигрыватель", "term.miniplayer": "Мини-проигрыватель",
"term.history": "История", "term.history": "История",
"term.search": "Поиск", "term.search": "Поиск",
"term.scroll": "Прокрутка",
"term.scroll.infinite": "Бесконечная",
"term.scroll.paged": "${songsPerPage} на страницу",
"term.live": "LIVE",
"term.showSearch": "Показать панель поиска",
"term.hideSearch": "Скрыть панель поиска",
"term.library": "Медиатека", "term.library": "Медиатека",
"term.listenNow": "Слушайте сейчас", "term.listenNow": "Слушайте сейчас",
"term.browse": "Обзор", "term.browse": "Обзор",
@ -39,18 +47,28 @@
"term.artists": "Артисты", "term.artists": "Артисты",
"term.podcasts": "Подкасты", "term.podcasts": "Подкасты",
"term.playlists": "Плейлисты", "term.playlists": "Плейлисты",
"term.charts": "Чарты",
"term.playlist": "Плейлист", "term.playlist": "Плейлист",
"term.newPlaylist": "Новый Плейлист", "term.newPlaylist": "Новый Плейлист",
"term.newPlaylistFolder": "Новая Папка Плейлиста", "term.newPlaylistFolder": "Новая Папка Плейлиста",
"term.createNewPlaylist": "Создать новый плейлист", "term.createNewPlaylist": "Создать новый плейлист",
"term.createNewPlaylistFolder": "Создать новую папку", "term.createNewPlaylistFolder": "Создать новую папку",
"term.deletePlaylist": "Вы уверены, что хотите удалить этот плейлист?", "term.deletePlaylist": "Вы уверены, что хотите удалить этот плейлист?",
"term.navigateBack": "Назад",
"term.navigateForward": "Вперед",
"term.play": "Воспроизвести", "term.play": "Воспроизвести",
"term.playpause": "Воспроизвести/Пауза",
"term.pause": "Пауза", "term.pause": "Пауза",
"term.stop": "Остановить",
"term.previous": "Предыдущий", "term.previous": "Предыдущий",
"term.next": "Следующий", "term.next": "Следующий",
"term.shuffle": "Перемешать", "term.shuffle": "Перемешать",
"term.enableShuffle": "Перемешать",
"term.disableShuffle": "Перемешать",
"term.repeat": "Повторять", "term.repeat": "Повторять",
"term.enableRepeatOne": "Включить повтор одной композиции",
"term.disableRepeatOne": "Выключить повтор одной композиции",
"term.disableRepeat": "Выключить повторение",
"term.volume": "Громкость", "term.volume": "Громкость",
"term.mute": "Заглушить", "term.mute": "Заглушить",
"term.unmute": "Включить звук", "term.unmute": "Включить звук",
@ -72,6 +90,7 @@
"term.viewAs": "Показывать", "term.viewAs": "Показывать",
"term.viewAs.coverArt": "Обложки", "term.viewAs.coverArt": "Обложки",
"term.viewAs.list": "Список", "term.viewAs.list": "Список",
"term.dynamic": "Динамический",
"term.size": "Размер", "term.size": "Размер",
"term.size.normal": "Обычный", "term.size.normal": "Обычный",
"term.size.compact": "Компактный", "term.size.compact": "Компактный",
@ -113,12 +132,14 @@
"few": "секунды", "few": "секунды",
"other": "секунд" "other": "секунд"
}, },
"term.fullscreenView": "Полноэкранное отображение", "term.fullscreenView": "Полноэкранный режим",
"term.defaultView": "Стандартное отображение", "term.defaultView": "Стандартное отображение",
"term.audioSettings": "Настройки звука", "term.audioSettings": "Настройки звука",
"term.audioControls": "Настройка громкости", "term.audioControls": "Настройка громкости",
"term.clearAll": "Очистить", "term.clearAll": "Очистить",
"term.recentStations": "Вы недавно слушали", "term.recentStations": "Вы недавно слушали",
"term.personalStations": "Персональные станции",
"term.amLive": "Apple Music Live",
"term.language": "Язык", "term.language": "Язык",
"term.funLanguages": "Забавные", "term.funLanguages": "Забавные",
"term.noLyrics": "Текст песни не найден.", "term.noLyrics": "Текст песни не найден.",
@ -139,6 +160,7 @@
}, },
"term.videos": "Видео", "term.videos": "Видео",
"term.menu": "Меню", "term.menu": "Меню",
"term.themeManaged": "Управляется темой",
"term.check": "Проверить", "term.check": "Проверить",
"term.aboutArtist": "О {{artistName}}", "term.aboutArtist": "О {{artistName}}",
"term.topResult": "Топ результатов", "term.topResult": "Топ результатов",
@ -162,7 +184,8 @@
"term.top": "Top", "term.top": "Top",
"term.version": "Версия", "term.version": "Версия",
"term.noVideos": "Видео не найдено.", "term.noVideos": "Видео не найдено.",
"term.plugin": "Плагины", "term.plugins": "Плагины",
"term.plugin": "Плагин",
"term.pluginMenu": "Меню плагинов", "term.pluginMenu": "Меню плагинов",
"term.pluginMenu.none": "Нет плагинов", "term.pluginMenu.none": "Нет плагинов",
"term.replay": "Мой год", "term.replay": "Мой год",
@ -186,6 +209,22 @@
"term.confirmLogout": "Вы уверены, что хотите выйти?", "term.confirmLogout": "Вы уверены, что хотите выйти?",
"term.creditDesignedBy": "Разработано ${authorUsername}", "term.creditDesignedBy": "Разработано ${authorUsername}",
"term.discNumber": "Диск ${discNumber}", "term.discNumber": "Диск ${discNumber}",
"term.reload" : "Перезагрузить Cider?",
"term.toggleprivate" : "Переключить частную сессию",
"term.webremote" : "Web Remote",
"term.cast" : "Транслировать",
"term.cast2" : "Трансляция на устройства",
"term.quit" : "Выход",
"term.zoomin" : "Приблизить",
"term.zoomout" : "Отдалить",
"term.zoomreset" : "Сбросить масштаб",
"term.fullscreen" : "Полный экран",
"term.nowPlaying": "Сейчас играет",
"home.syncFavorites": "Синхронизировать",
"home.syncFavorites.gettingArtists": "Получение отслеживаемых исполнителей...",
"action.favorite": "Отслеживать",
"action.removeFavorite": "Перестать отслеживать",
"action.refresh": "Обновить",
"home.title": "Главная", "home.title": "Главная",
"home.recentlyPlayed": "Недавно прослушанные", "home.recentlyPlayed": "Недавно прослушанные",
"home.recentlyAdded": "Недавно добавленные", "home.recentlyAdded": "Недавно добавленные",
@ -206,6 +245,16 @@
"podcast.episodes": "Выпуски радиошоу", "podcast.episodes": "Выпуски радиошоу",
"podcast.playEpisode": "Воспроизвести", "podcast.playEpisode": "Воспроизвести",
"podcast.website": "Веб-сайт", "podcast.website": "Веб-сайт",
"action.hideLibrary": "Скрыть библиотеку",
"action.showLibrary": "Показать библиотеку",
"action.cut": "Вырезать",
"action.paste": "Вставить",
"action.selectAll": "Выбрать всё",
"action.delete": "Удалить",
"action.edit": "Изменить",
"action.done": "Готово",
"action.submit": "Подтвердить",
"action.editTracklist": "Редактировать треклист",
"action.addToLibrary": "Добавить в медиатеку", "action.addToLibrary": "Добавить в медиатеку",
"action.addToLibrary.success": "Добавлено в медиатеку", "action.addToLibrary.success": "Добавлено в медиатеку",
"action.addToLibrary.error": "Ошибка Добавления в медиатику", "action.addToLibrary.error": "Ошибка Добавления в медиатику",
@ -241,7 +290,7 @@
"action.unlove": "Больше не нравится", "action.unlove": "Больше не нравится",
"action.dislike": "Меньше подобных рекомендаций", "action.dislike": "Меньше подобных рекомендаций",
"action.undoDislike": "Вернуть подобные рекомендации", "action.undoDislike": "Вернуть подобные рекомендации",
"action.showWebRemoteQR": "Веб-интерфейс", "action.showWebRemoteQR": "Web Remote",
"action.playTracksNext": "Воспроизвести ${app.selectedMediaItems.length} песен следующими", "action.playTracksNext": "Воспроизвести ${app.selectedMediaItems.length} песен следующими",
"action.playTracksLater": "Воспроизвести ${app.selectedMediaItems.length} песен позже", "action.playTracksLater": "Воспроизвести ${app.selectedMediaItems.length} песен позже",
"action.removeTracks": "Удалить ${self.selectedItems.length} песен из очереди", "action.removeTracks": "Удалить ${self.selectedItems.length} песен из очереди",
@ -249,13 +298,15 @@
"action.export": "Экспорт", "action.export": "Экспорт",
"action.showAlbum": "Показать весь альбом", "action.showAlbum": "Показать весь альбом",
"action.tray.minimize": "Свернуть в трей", "action.tray.minimize": "Свернуть в трей",
"action.tray.quit": "Выйти", "action.tray.show": "Показать Cider",
"action.tray.listento": "Listen To:",
"action.update": "Обновить", "action.update": "Обновить",
"action.install": "Установить", "action.install": "Установить",
"action.copy": "Скопировать", "action.copy": "Скопировать",
"action.newpreset": "Новый пресет...", "action.newpreset": "Новый пресет...",
"action.deletepreset": "Удалить пресет", "action.deletepreset": "Удалить пресет",
"action.open": "Открыть", "action.open": "Открыть",
"action.close": "Закрыть",
"action.relaunch.confirm": "Вы хотите перезапустить Cider?", "action.relaunch.confirm": "Вы хотите перезапустить Cider?",
"action.cast.chromecast": "Chromecast", "action.cast.chromecast": "Chromecast",
"action.cast.todevices": "Транслировать на устройства", "action.cast.todevices": "Транслировать на устройства",
@ -266,6 +317,27 @@
"action.cast.scanning": "Поиск...", "action.cast.scanning": "Поиск...",
"action.createNew": "Создать новый...", "action.createNew": "Создать новый...",
"action.openArtworkInBrowser": "Открыть обложку в браузере", "action.openArtworkInBrowser": "Открыть обложку в браузере",
"action.scrollToTop": "Scroll to top",
"menubar.options.view": "View",
"menubar.options.reload": "Перезагрузить",
"menubar.options.forcereload": "Жесткая перезагрузка",
"menubar.options.toggledevtools": "Toggle Developer Tools",
"menubar.options.window": "Window",
"menubar.options.minimize": "Minimize",
"menubar.options.plugins": "Меню плагинов",
"menubar.options.controls": "Управление",
"menubar.options.volumeup": "Громче",
"menubar.options.volumedown": "Тише",
"menubar.options.account": "Аккаунт",
"menubar.options.signout": "Выйти из аккаунта",
"menubar.options.support": "Поддержать",
"menubar.options.report": "Сообщить о...",
"menubar.options.bug": "Баг",
"menubar.options.feature": "Feature Request",
"menubar.options.trans": "Translation Report/Request",
"menubar.options.license": "Просмотреть лицензию",
"menubar.options.conf": "Открыть файл конфигурации в редакторе",
"menubar.options.zoom": "Zoom",
"settings.header.general": "Общие", "settings.header.general": "Общие",
"settings.header.general.description": "Настройка общих параметров Cider.", "settings.header.general.description": "Настройка общих параметров Cider.",
"settings.option.general.language": "Язык", "settings.option.general.language": "Язык",
@ -275,18 +347,52 @@
"settings.option.general.resumebehavior.locally.description": "Cider возобновит ваш последний сеанс на этом компьютере.", "settings.option.general.resumebehavior.locally.description": "Cider возобновит ваш последний сеанс на этом компьютере.",
"settings.option.general.resumebehavior.history": "История", "settings.option.general.resumebehavior.history": "История",
"settings.option.general.resumebehavior.history.description": "Cider поставит в очередь последнюю песню из вашей общей истории Apple Music на разных устройствах.", "settings.option.general.resumebehavior.history.description": "Cider поставит в очередь последнюю песню из вашей общей истории Apple Music на разных устройствах.",
"settings.option.general.resumetabs" : "Раздел при запуске",
"settings.option.general.resumetabs.description" : "Вы можете выбрать, какой раздел будет открыться при запуске Cider.",
"settings.option.general.resumetabs.dynamic" : "Динамически",
"settings.option.general.resumetabs.dynamic.description" : "Cider откроет последний использованный раздел.",
"settings.option.general.language.main": "Языки", "settings.option.general.language.main": "Языки",
"settings.option.general.language.fun": "Забавные языки", "settings.option.general.language.fun": "Забавные языки",
"settings.option.general.language.unsorted": "Неотсортированные", "settings.option.general.language.unsorted": "Неотсортированные",
"settings.option.general.customizeSidebar": "Настроить элементы боковой панели", "settings.option.general.customizeSidebar": "Настроить элементы боковой панели",
"settings.option.general.customizeSidebar.customize": "Настроить", "settings.option.general.customizeSidebar.customize": "Настроить",
"settings.option.general.keybindings": "Сочетания клавиш",
"settings.option.general.keybindings.library": "Библиотека",
"settings.option.general.keybindings.session": "Сессия",
"settings.option.general.keybindings.control": "Элементы управления",
"settings.option.general.keybindings.interface": "Интерфейс",
"settings.option.general.keybindings.advanced": "Расширенные",
"settings.option.general.keybindings.pressCombination": "Нажмите комбинацию двух клавиш, чтобы обновить привязку клавиш.",
"settings.option.general.keybindings.pressEscape": "Нажмите клавишу Escape, чтобы вернуться.",
"settings.notyf.general.keybindings.update.success": "Комбинация клавиш успешно обновлена",
"settings.prompt.general.keybindings.update.success": "Комбинация клавиш успешно обновлена. Нажмите OK, чтобы перезапустить Cider",
"settings.option.general.themeUpdateNotification": "Автоматически проверять наличие обновлений темы",
"settings.option.general.showLovedTracksInline": "Показывать любимые треки в строке",
"settings.description.search": "Поиск",
"settings.description.albums": "Альбомы медиатеки",
"settings.description.artists": "Артисты",
"settings.description.browse": "Обзор",
"settings.description.private": "Переключить частную сессию",
"settings.description.remote": "Web Remote",
"settings.description.audio": "Настройки аудио",
"settings.description.plugins": "Меню плагинов",
"settings.description.cast": "Трансляция на устройства",
"settings.description.settings": "Настройки",
"settings.description.developer": "Инструменты разработчика",
"settings.description.listnow": "Сейчас играет",
"settings.description.recentAdd": "Недавно добавлено",
"settings.description.songs": "Песни",
"settings.notyf.updateCider.update-not-available": "Нет доступных обновлений", "settings.notyf.updateCider.update-not-available": "Нет доступных обновлений",
"settings.notyf.updateCider.update-downloaded": "Обновление загружено, перезапустите, чтобы обновить", "settings.notyf.updateCider.update-downloaded": "Обновление загружено, перезапустите, чтобы обновить",
"settings.notyf.updateCider.update-timeout": "Время ожидания обновления истекло", "settings.notyf.updateCider.update-timeout": "Время ожидания обновления истекло",
"settings.header.audio": "Звук", "settings.header.audio": "Звук",
"settings.header.audio.description": "Настройка звука Cider.", "settings.header.audio.description": "Настройка звука Cider.",
"settings.option.audio.volumeStep": "Шаг громкости", "settings.option.audio.volumeStep": "Шаг громкости",
"settings.option.audio.advanced": "Расширенные настройки громкости",
"settings.option.audio.maxVolume": "Максимальная громкость", "settings.option.audio.maxVolume": "Максимальная громкость",
"settings.option.audio.changePlaybackRate": "Изменить скорость воспроизведения",
"settings.option.audio.playbackRate": "Скорость воспроизведения",
"settings.option.audio.playbackRate.change": "Изменить",
"settings.option.audio.quality": "Качество звука", "settings.option.audio.quality": "Качество звука",
"settings.header.audio.quality.hireslossless": "Высокое разрешение, без потерь", "settings.header.audio.quality.hireslossless": "Высокое разрешение, без потерь",
"settings.header.audio.quality.hireslossless.description": "ALAC до 24 бит/192 кГц", "settings.header.audio.quality.hireslossless.description": "ALAC до 24 бит/192 кГц",
@ -295,27 +401,46 @@
"settings.header.audio.quality.high": "Высокое качество", "settings.header.audio.quality.high": "Высокое качество",
"settings.header.audio.quality.high.description": "AAC 256 кб/с", "settings.header.audio.quality.high.description": "AAC 256 кб/с",
"settings.header.audio.quality.standard": "Высокая эффективность", "settings.header.audio.quality.standard": "Высокая эффективность",
"settings.header.audio.quality.standard.description": "НЕ-ААС для экономии трафика(64 кб/с)", "settings.header.audio.quality.standard.description": "64 кб/с",
"settings.option.audio.seamlessTransition": "Плавный переход между песнями", "settings.option.audio.seamlessTransition": "Плавный переход между песнями",
"settings.option.audio.enableAdvancedFunctionality": "Включить расширенный функционал", "settings.option.audio.enableAdvancedFunctionality": "Включить расширенный функционал",
"settings.option.audio.enableAdvancedFunctionality.description": "Включение функции AudioContext позволит использовать расширенные функции звука, такие как нормализация звука, эквалайзеры и визуализаторы, однако в некоторых системах это может вызвать заикание звука.", "settings.option.audio.enableAdvancedFunctionality.description": "Включение функции AudioContext позволит использовать расширенные функции звука, такие как нормализация звука, эквалайзеры и визуализаторы, однако в некоторых системах это может вызвать заикание звука.",
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider считает, что ваш компьютер не справится с этими функциями. Вы уверены что хотите продолжить?", "settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider считает, что ваш компьютер не справится с этими функциями. Вы уверены что хотите продолжить?",
"settings.option.audio.audioLab": "Cider Audio Lab", "settings.option.audio.audioLab": "Cider Audio Lab",
"settings.option.audio.audioLab.description": "Ассортимент звуковых обработок собственной разработки для Cider.", "settings.option.audio.audioLab.description": "Ассортимент звуковых обработок собственной разработки для Cider.",
"settings.option.audio.audioLab.subheader": "Разработано Cider Acoustic Technologies в Калифорнии",
"settings.warn.audioLab.withoutAF": "AudioContext (Расширенный функционал) требуется для включения Cider Audio Laboratory.", "settings.warn.audioLab.withoutAF": "AudioContext (Расширенный функционал) требуется для включения Cider Audio Laboratory.",
"settings.warn.enableAdvancedFunctionality": "Для включения этой функции требуется AudioContext (расширенный функционал).",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Аналоговое звучание", "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Аналоговое звучание",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Имитирует аналоговое звучание по образцу Korg Nutube 6P1", "settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Имитирует аналоговое звучание по образцу Korg Nutube 6P1",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Интенсивность аналогового звучания", "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Интенсивность аналогового звучания",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Изменяет интенсивность Аналогового звучания.", "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Изменяет интенсивность Аналогового звучания.",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Обычная", "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Обычная",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Сильнее", "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Сильнее",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Реализует другую музыкальную атмосферу, созданную по образцу современных аудиосистем.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Режим работы Cider Atmosphere Realizer™",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Изменяет режим работы Atmosphere Realizer.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Hōjicha Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Genmaicha Tapioca Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Rock Salt Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Uji Matcha Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jasmine Macchiato",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Hokkaido Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Moonlight Softcake",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Brown Sugar Creme Brûlée Milk",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "Clafoutis aux Cerises",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Cuddle Warmth",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Улучшает воспринимаемое качество звука AAC 256 кбит/с за счет использования алгоритма реального времени, использующего как психоакустические модели человеческого слуха, так и характеристики кодирования AAC.", "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Улучшает воспринимаемое качество звука AAC 256 кбит/с за счет использования алгоритма реального времени, использующего как психоакустические модели человеческого слуха, так и характеристики кодирования AAC.",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP не совместим с пространственным звучанием. Пожалуйста, отключите пространственное звучание, чтобы продолжить.", "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP не совместим с пространственным звучанием. Пожалуйста, отключите пространственное звучание, чтобы продолжить.",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Режим CAP", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Режим CAP",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Изменяет режим обработки звука. (Режим агрессии может привести к нежелаемым результатам)", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Изменяет режим обработки звука. (Режим агрессии может привести к нежелаемым результатам)",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Стандартный", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Стандартный",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Агрессивный", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Адаптивный",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Legacy",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Агрессивный",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Нормализация звука", "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Нормализация звука",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Нормализует пиковую громкость для отдельных треков, чтобы создать более однородное впечатление от прослушивания.", "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Нормализует пиковую громкость для отдельных треков, чтобы создать более однородное впечатление от прослушивания.",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Управляется Audio Lab", "settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Управляется Audio Lab",
@ -324,8 +449,18 @@
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Профиль пространственного звучания Cider", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Профиль пространственного звучания Cider",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Изменяет профиль пространственного звучания.", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Изменяет профиль пространственного звучания.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Стандарт", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Стандарт",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Звуковая сцена",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separation",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Минимальный",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Аудиофил", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Аудиофил",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Рассеянный",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encore",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Пространственная обработка несовместима с CAP. Пожалуйста, отключите CAP, чтобы продолжить.", "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Пространственная обработка несовместима с CAP. Пожалуйста, отключите CAP, чтобы продолжить.",
"settings.option.audio.dbspl.display": "Отображение dB SPL",
"settings.option.audio.dbspl.description": "(Только для опытных пользователей) Отображение dB SPL вместо dBFS на ползунке громкости.",
"settings.option.audio.dbfs.calibration": "0 dBFS Калибровка",
"settings.option.audio.dbfs.description": "Введите пиковый Z-взвешенный уровень звукового давления в дБ, когда Cider находится на уровне 0 дБ полной шкалы.",
"settings.header.visual": "Внешний вид", "settings.header.visual": "Внешний вид",
"settings.header.visual.description": "Настройка внешнего вида Cider.", "settings.header.visual.description": "Настройка внешнего вида Cider.",
"settings.option.visual.windowStyle": "Стиль окна", "settings.option.visual.windowStyle": "Стиль окна",
@ -351,10 +486,19 @@
"settings.option.visual.uiscale": "Размер интерфейса", "settings.option.visual.uiscale": "Размер интерфейса",
"settings.header.visual.theme": "Тема", "settings.header.visual.theme": "Тема",
"settings.option.visual.theme.github.download": "Установить с GitHub", "settings.option.visual.theme.github.download": "Установить с GitHub",
"settings.option.visual.theme.github.openfolder": "Открыть папку с темами",
"settings.option.visual.theme.github.explore": "Исследовать темы с GitHub", "settings.option.visual.theme.github.explore": "Исследовать темы с GitHub",
"settings.header.visual.theme.github.page": "Темы с GitHub", "settings.header.visual.theme.github.page": "Темы с GitHub",
"settings.option.visual.theme.github.install.confirm": "Вы уверены, что хотите установить {{ repo }}?", "settings.option.visual.theme.github.install.confirm": "Вы уверены, что хотите установить {{ repo }}?",
"settings.prompt.visual.theme.github.URL": "Введите URL темы, которую хотите установить", "settings.prompt.visual.theme.github.URL": "Введите URL темы, которую хотите установить",
"settings.prompt.visual.theme.uninstallTheme": "Вы уверены, что хотите удалить {{ theme }}?",
"settings.option.visual.theme.checkForUpdates": "Проверить наличие обновлений",
"settings.header.visual.styles": "Стили",
"settings.option.visual.theme.manageStyles": "Управление стилями",
"settings.option.visual.theme.uninstall": "Удалить",
"settings.option.visual.theme.viewInfo": "Просмотреть информацию",
"settings.option.visual.theme.github.available": "Доступные",
"settings.option.visual.theme.github.applied": "Применённые",
"settings.notyf.visual.theme.install.success": "Тема успешно установлена", "settings.notyf.visual.theme.install.success": "Тема успешно установлена",
"settings.notyf.visual.theme.install.error": "Не удалось установить тему", "settings.notyf.visual.theme.install.error": "Не удалось установить тему",
"settings.header.visual.plugin": "Плагин", "settings.header.visual.plugin": "Плагин",
@ -383,17 +527,30 @@
"settings.option.lyrics.enableMusixmatchKaraoke": "Включить режим караоке (только с Musixmatch)", "settings.option.lyrics.enableMusixmatchKaraoke": "Включить режим караоке (только с Musixmatch)",
"settings.option.lyrics.musixmatchPreferredLanguage": "Предпочтительный язык перевода Musixmatch", "settings.option.lyrics.musixmatchPreferredLanguage": "Предпочтительный язык перевода Musixmatch",
"settings.option.lyrics.enableYoutubeLyrics": "Включить Youtube Lyrics для музыкальных клипов", "settings.option.lyrics.enableYoutubeLyrics": "Включить Youtube Lyrics для музыкальных клипов",
"settings.option.lyrics.enableQQLyrics": "Получать текст песен из QQ Lyrics",
"settings.header.connectivity": "Прочее", "settings.header.connectivity": "Прочее",
"settings.header.connectivity.description": "Настройка прочих параметров Cider.", "settings.header.connectivity.description": "Настройка прочих параметров Cider.",
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
"settings.option.connectivity.playbackNotifications": "Уведомления о воспроизведении", "settings.option.connectivity.playbackNotifications": "Уведомления о воспроизведении",
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
"settings.option.connectivity.discordRPC.clientName": "Название клиента",
"settings.option.connectivity.discordRPC.clearOnPause": "Отключать Discord Rich Presence на паузе", "settings.option.connectivity.discordRPC.clearOnPause": "Отключать Discord Rich Presence на паузе",
"settings.option.connectivity.discordRPC.hideButtons": "Скрыть кнопки в Discord Rich Presence", "settings.option.connectivity.discordRPC.hideButtons": "Скрыть кнопки в Discord Rich Presence",
"settings.option.connectivity.discordRPC.hideTimestamp": "Скрыть отметку времени в Discord Rich Presence",
"settings.option.connectivity.discordRPC.detailsFormat": "Формат деталей",
"settings.option.connectivity.discordRPC.stateFormat": "Формат состояния",
"settings.option.connectivity.discordRPC.reload": "Перезагрузить DiscordRPC",
"settings.option.connectivity.discordRPC.reconnectedToUser": "DiscordRPC переподключен к пользователю: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.fm cкробблинг", "settings.option.connectivity.lastfmScrobble": "Last.fm cкробблинг",
"settings.option.connectivity.lastfmScrobble.delay": "Частота скробблинга Last.fm (%)", "settings.option.connectivity.lastfmScrobble.delay": "Частота скробблинга Last.fm (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Включить Last.fm Сейчас играет", "settings.option.connectivity.lastfmScrobble.nowPlaying": "Включить Last.fm Сейчас играет",
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Удалять фит-исполнителей из названия песни (Last.fm)", "settings.option.connectivity.lastfmScrobble.removeFeatured": "Удалять фит-исполнителей из названия песни (Last.fm)",
"settings.option.connectivity.lastfmScrobble.filterLoop": "Фильтровать зацикленный трек (Last.fm)", "settings.option.connectivity.lastfmScrobble.filterLoop": "Фильтровать зацикленный трек (Last.fm)",
"settings.option.connectivity.lastfmScrobble.filterLoop.description": "Предотвращение скробблинга или отображения зацикленных треков в списке «Сейчас исполняется» на Last.fm.",
"settings.option.connectivity.lastfmScrobble.filterTypes": "Фильтровать медиа типы (Last.fm)",
"settings.option.connectivity.lastfmScrobble.manualToken": "Ввести токен Last.fm вручную",
"settings.notyf.connectivity.lastfmScrobble.connectError": "Last.fm Время соединения истекло",
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Last.fm Соединение успешно",
"settings.notyf.connectivity.lastfmScrobble.connecting": "Подключение к Last.fm...",
"settings.header.debug": "Debug", "settings.header.debug": "Debug",
"settings.option.debug.copy_log": "Копировать логи в буфер обмена", "settings.option.debug.copy_log": "Копировать логи в буфер обмена",
"settings.option.debug.openAppData": "Открыть папку Cider", "settings.option.debug.openAppData": "Открыть папку Cider",
@ -405,12 +562,21 @@
"settings.option.experimental.unknownPlugin.description": "Разрешить установку плагинов из репозиториев, отличных от репозитория плагинов Cider", "settings.option.experimental.unknownPlugin.description": "Разрешить установку плагинов из репозиториев, отличных от репозитория плагинов Cider",
"settings.option.experimental.compactUI": "Компактный интерфейс", "settings.option.experimental.compactUI": "Компактный интерфейс",
"settings.option.window.close_button_hide": "Кнопка «Закрыть» скрывает приложение", "settings.option.window.close_button_hide": "Кнопка «Закрыть» скрывает приложение",
"settings.option.window.maxElementScale": "Максимальный масштаб элемента",
"settings.option.experimental.inline_playlists": "Встроенные плейлисты и альбомы", "settings.option.experimental.inline_playlists": "Встроенные плейлисты и альбомы",
"settings.option.advanced.playlistTrackMapping": "Сканирование песен в плейлистах", "settings.option.advanced.playlistTrackMapping": "Сканирование песен в плейлистах",
"settings.option.advanced.playlistTrackMapping.description": "Включает глубокое сканирование плейлистов, чтобы определить, какие треки находятся в каких плейлистах. Время сборки кеша плейлиста может значительно увеличиться.", "settings.option.advanced.playlistTrackMapping.description": "Включает глубокое сканирование плейлистов, чтобы определить, какие треки находятся в каких плейлистах. Время сборки кеша плейлиста может значительно увеличиться.",
"settings.option.visual.transparent": "Прозрачность", "settings.option.visual.transparent": "Прозрачность",
"settings.option.visual.transparent.description": "Прозрачность окна (требуется поддержка Тем, требуется перезапуск)", "settings.option.visual.transparent.description": "Прозрачность окна (требуется поддержка Тем, требуется перезапуск)",
"settings.option.visual.customAccentColor": "Пользовательский основной цвет",
"settings.option.visual.accentColor": "Основной цвет",
"settings.option.visual.purplePodcastPlaybackBar": "Фиолетовая полоса воспроизведения для подкастов",
"settings.option.visual.windowColor": "Цветовой оттенок",
"settings.header.visual.windowBackgroundStyle.color": "Цвет",
"settings.header.advanced": "Расширенные", "settings.header.advanced": "Расширенные",
"settings.header.connect": "Sync",
"settings.option.connect.link_account": "Enable Sync with Cider Connect",
"settings.option.connect.link_account.description": "Linking your Discord account with Cider Connect allows you to store userdata including Settings, EQ's, and eventually more once finished. (Work In Progress)",
"spatial.notTurnedOn": "Пространственное аудио отключено. Чтобы использовать, сначала включите его.", "spatial.notTurnedOn": "Пространственное аудио отключено. Чтобы использовать, сначала включите его.",
"spatial.spatialProperties": "Настройка пространственного аудио", "spatial.spatialProperties": "Настройка пространственного аудио",
"spatial.width": "Ширина", "spatial.width": "Ширина",
@ -443,5 +609,44 @@
"share.platform.email": "Email", "share.platform.email": "Email",
"share.platform.songLink": "Скопировать с song.link", "share.platform.songLink": "Скопировать с song.link",
"share.platform.clipboard": "Скопировать ссылку", "share.platform.clipboard": "Скопировать ссылку",
"about.thanks": "Большое спасибо команде Cider Collective и всем нашим вкладчикам." "about.thanks": "Большое спасибо команде Cider Collective и всем нашим вкладчикам.",
"oobe.yes": "Да",
"oobe.no": "Нет",
"oobe.next": "Следующий",
"oobe.previous": "Предыдущий",
"oobe.done": "Готово",
"oobe.amupsell.title": "Прежде чем мы начнем",
"oobe.amupsell.text": "Для Cider требуется действующая платная подписка на Apple Music\nCider не будет работать с тарифным планом Apple Music Voice или некоторыми рекламными пробными подписками. Если у вас уже есть соответствующая подписка Apple Music, нажмите «Далее», чтобы продолжить.",
"oobe.amupsell.subscribeBtn": "Подпишитесь на Apple Music",
"oobe.amupsell.explainBtn": "Объяснять",
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
"oobe.amupsell.promoExplained": "Некоторые рекламные и пробные подписки на Apple Music за пределами США не имеют доступа к необходимым API-интерфейсам Apple Music Web Player, необходимым для работы Cider. Чтобы проверить, будет ли ваша действующая пробная версия работать с Cider, перейдите на страницу <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a>, войдите в систему и попробуйте включить музыку. Если это работает, отлично! Однако вы готовы использовать Cider, если он не рассматривает возможность подписки на Apple Music здесь: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
"oobe.intro.title": "Добро пожаловать в Cider",
"oobe.intro.subtitle": "",
"oobe.intro.text": "Давайте настроим кое-что, чтобы вы могли использовать Cider, как хотите. Вы всегда можете изменить эти настройки позже.",
"oobe.general.title": "Основные",
"oobe.general.subtitle": "",
"oobe.general.text": "",
"oobe.audio.title": "Аудио",
"oobe.audio.subtitle": "",
"oobe.audio.text": "В Cider используется специально настроенный и разработанный звуковой стек, который обеспечивает богатое высококачественное звучание.\nВключая Cider Adrenaline, Atmosphere Realizer и Spatialized Audio.\nДля включения этой функции необходимо включить \"Расширенные функции звука\".\nВключение расширенного звука Функциональность даст вам доступ к этим улучшениям в Cider Audio Labs, которые можно найти в настройках приложения.",
"oobe.audio.advancedFunctionality": "",
"oobe.visual.title": "Visual",
"oobe.visual.subtitle": "",
"oobe.visual.text": "",
"oobe.visual.layout.text": "В Cider есть два разных макета окна.\nMaverick  это макет, похожий на iTunes, с проигрывателем в верхней части окна.\nMojave  это новый вариант, созданный Cider Collective.\n\nВы можете изменить макет в любое время в настройках.",
"oobe.visual.suggestingThemes": "Темы — отличный способ персонализировать ваш опыт. Вот некоторые из них, которые мы предлагаем: ",
"oobe.visual.suggestingThemes.subtext": "(Эти темы будут загружены с GitHub)",
"oobe.visual.suggestingThemes.default": "Cider",
"oobe.visual.suggestingThemes.default.text": "Классическая тема Cider.",
"oobe.visual.suggestingThemes.dark": "Dark",
"oobe.visual.suggestingThemes.dark.text": "Darkness.",
"oobe.visual.suggestingThemes.community1": "Groovy",
"oobe.visual.suggestingThemes.community1.text": "Тема под влиянием WinUI",
"oobe.visual.suggestingThemes.community2": "iTheme",
"oobe.visual.suggestingThemes.community2.text": "The classic big fruit layout.",
"oobe.visual.suggestingThemes.community3": "Dracula",
"oobe.visual.suggestingThemes.community3.text": "Культовая цветовая гамма Дракулы.",
"oobe.amsignin.title": ""
} }

View file

@ -563,6 +563,7 @@
"settings.option.visual.customAccentColor": "Custom Accent Color", "settings.option.visual.customAccentColor": "Custom Accent Color",
"settings.option.visual.accentColor": "Accent Color", "settings.option.visual.accentColor": "Accent Color",
"settings.option.visual.purplePodcastPlaybackBar": "Purple Playback Bar for Podcasts", "settings.option.visual.purplePodcastPlaybackBar": "Purple Playback Bar for Podcasts",
"settings.option.visual.compactArtistHeader": "Compact Artist Header",
"settings.option.visual.windowColor": "Window Tint Color", "settings.option.visual.windowColor": "Window Tint Color",
"settings.header.visual.windowBackgroundStyle.color": "Color Tint", "settings.header.visual.windowBackgroundStyle.color": "Color Tint",
"settings.header.advanced": "Advanced", "settings.header.advanced": "Advanced",

View file

@ -125,6 +125,7 @@ export class BrowserWindow {
"components/hello-world", "components/hello-world",
"components/inline-collection-list", "components/inline-collection-list",
"components/settings-window", "components/settings-window",
"components/pagination",
"components/settings-keybinds", "components/settings-keybinds",
"components/settings-themes", "components/settings-themes",
"components/settings-themes-github", "components/settings-themes-github",

View file

@ -147,17 +147,22 @@ export class Store {
}, },
"libraryPrefs": { "libraryPrefs": {
"songs": { "songs": {
"scroll": "infinite", "scroll": "paged",
"sort": "name", "sort": "name",
"sortOrder": "asc", "sortOrder": "asc",
"size": "normal" "size": "normal"
}, },
"albums": { "albums": {
"scroll": "paged",
"sort": "name", "sort": "name",
"sortOrder": "asc", "sortOrder": "asc",
"viewAs": "covers" "viewAs": "covers"
}, },
"localPaths": [] "playlists": {
"scroll": "infinite"
},
"localPaths": [],
"pageSize": 250
}, },
"audio": { "audio": {
"volume": 1, "volume": 1,

View file

@ -64,6 +64,15 @@ export class wsapi {
electron.ipcMain.on('wsapi-returnvolumeMax', (_event: any, arg: any) => { electron.ipcMain.on('wsapi-returnvolumeMax', (_event: any, arg: any) => {
this.returnmaxVolume(JSON.parse(arg)); this.returnmaxVolume(JSON.parse(arg));
}); });
electron.ipcMain.on('wsapi-libraryStatus', (_event: any, inLibrary: boolean, rating: number) => {
this.returnLibraryStatus(inLibrary, rating);
});
electron.ipcMain.on('wsapi-rate', (_event: any, kind: string, id: string, rating: number) => {
this.returnRatingStatus(kind, id, rating);
});
electron.ipcMain.on('wsapi-change-library', (_event: any, kind: string, id: string, shouldAdd: boolean) => {
this.returnLibraryChange(kind, id, shouldAdd);
});
this.wss = new WebSocketServer({ this.wss = new WebSocketServer({
port: this.port, port: this.port,
perMessageDeflate: { perMessageDeflate: {
@ -242,6 +251,15 @@ export class wsapi {
case "get-currentmediaitem": case "get-currentmediaitem":
this._win.webContents.executeJavaScript(`wsapi.getPlaybackState()`); this._win.webContents.executeJavaScript(`wsapi.getPlaybackState()`);
break; break;
case "library-status":
this._win.webContents.executeJavaScript(`wsapi.getLibraryStatus("${data.type}", "${data.id}")`);
break;
case "rating":
this._win.webContents.executeJavaScript(`wsapi.rate("${data.type}", "${data.id}", ${data.rating})`);
break;
case "change-library":
this._win.webContents.executeJavaScript(`wsapi.changeLibrary("${data.type}", "${data.id}", ${data.add})`);
break;
case "quit": case "quit":
electron.app.quit(); electron.app.quit();
break; break;
@ -317,4 +335,35 @@ export class wsapi {
client.send(JSON.stringify(response)); client.send(JSON.stringify(response));
}); });
} }
returnLibraryStatus(inLibrary: boolean, rating: number) {
const response: standardResponse = {
status: 0, data: {
inLibrary, rating
}, message: "OK", type: "libraryStatus"
}
this.clients.forEach(function each(client: any) {
client.send(JSON.stringify(response));
});
}
returnRatingStatus(kind: string, id: string, rating: number) {
const response: standardResponse = {
status: 0, data: { kind, id, rating },
message: "OK", type: "rate"
};
this.clients.forEach(function each(client: any) {
client.send(JSON.stringify(response));
});
}
returnLibraryChange(kind: string, id: string, shouldAdd: boolean) {
const response: standardResponse = {
status: 0, data: { kind, id, add: shouldAdd },
message: "OK", type: "change-library"
};
this.clients.forEach(function each(client: any) {
client.send(JSON.stringify(response));
});
}
} }

View file

@ -50,7 +50,7 @@ const CiderAudio = {
connectContext: function (mediaElem) { connectContext: function (mediaElem) {
if (!CiderAudio.context) { if (!CiderAudio.context) {
CiderAudio.context = new window.AudioContext({ sampleRate: 96000, latencyHint: "playback"}); // Don't ever remove the sample rate arg. Ask Maikiwi. CiderAudio.context = new window.AudioContext({ sampleRate: 96000, latencyHint: "playback"}); // Don't ever remove the sample rate arg. Ask Maikiwi.
app.lyricOffset = CiderAudio.context.baseLatency app.lyricOffset = CiderAudio.context.baseLatency + CiderAudio.context.outputLatency
} }
if (!CiderAudio.source) { if (!CiderAudio.source) {
CiderAudio.source = CiderAudio.context.createMediaElementSource(mediaElem); CiderAudio.source = CiderAudio.context.createMediaElementSource(mediaElem);

View file

@ -2380,4 +2380,14 @@ input[type=checkbox][switch]:checked:active::before {
} }
} }
} }
}
.listennow-chip.circle {
border-radius: 50%;
div {
border-radius: 50%;
}
img {
border-radius: 50%;
}
} }

View file

@ -109,7 +109,7 @@
background: var(--color2); background: var(--color2);
padding: 0px; padding: 0px;
overflow-y: overlay; overflow-y: overlay;
.list-group-item { .list-group-item {
border-radius: 0px; border-radius: 0px;
} }
@ -193,11 +193,11 @@
.list-group-item { .list-group-item {
padding: 12px 6px; padding: 12px 6px;
&:hover { &:hover {
filter: brightness(1.2); filter: brightness(1.2);
} }
&:active { &:active {
filter: brightness(0.8); filter: brightness(0.8);
} }
@ -210,7 +210,7 @@
padding: 0px; padding: 0px;
width: 100%; width: 100%;
overflow: hidden; overflow: hidden;
.stylestack-editor { .stylestack-editor {
padding-bottom: 16px; padding-bottom: 16px;
} }
@ -302,16 +302,23 @@
min-width: 120px; min-width: 120px;
} }
} }
.categories{
display: grid;
grid-template-columns: repeat(3, minmax(200px, 1fr));
gap: 1rem;
}
.cd-mediaitem-square.mediaitem-brick { .cd-mediaitem-square.mediaitem-brick {
width: 530px !important; width: 100% !important;
height: 168px;
padding-block: 0.5rem;
.artwork-container .artwork { .artwork-container .artwork {
height: 168px !important; height: 168px !important;
width: 507px !important; width: 100% !important;
z-index: 1; z-index: 1;
} }
.info-rect{
height: max-content;
}
.title { .title {
font-weight: bold; font-weight: bold;
justify-content: left; justify-content: left;
@ -1233,6 +1240,10 @@
min-height: 80vh; min-height: 80vh;
} }
&.animated .artist-header-compact {
min-height: 40vh;
}
.artist-header { .artist-header {
//background: linear-gradient(45deg, var(--keyColor), #0e0e0e); //background: linear-gradient(45deg, var(--keyColor), #0e0e0e);
color: white; color: white;
@ -2248,7 +2259,7 @@
.settings-tab-content { .settings-tab-content {
height:100%; height:100%;
} }
&.no-sidebar { &.no-sidebar {
.gh-header { .gh-header {
>.row { >.row {

View file

@ -16,7 +16,6 @@ const app = new Vue({
drawertest: false, drawertest: false,
platform: "", platform: "",
mk: {}, mk: {},
quickPlayQuery: "",
pluginInstalled: false, pluginInstalled: false,
pluginMenuEntries: [], pluginMenuEntries: [],
lz: ipcRenderer.sendSync("get-i18n", "en_US"), lz: ipcRenderer.sendSync("get-i18n", "en_US"),
@ -131,16 +130,13 @@ const app = new Vue({
webremoteqr: "", webremoteqr: "",
mxmtoken: "", mxmtoken: "",
mkIsReady: false, mkIsReady: false,
playerReady: false,
animateBackground: false, animateBackground: false,
currentArtUrl: '', currentArtUrl: '',
currentArtUrlRaw: '', currentArtUrlRaw: '',
lyricon: false, lyricon: false,
currentTrackID: '', currentTrackID: '',
currentTrackIDBG: '',
lyrics: [], lyrics: [],
currentLyricsLine: 0, currentLyricsLine: 0,
lyriccurrenttime: 0,
richlyrics: [], richlyrics: [],
lyricsMediaItem: {}, lyricsMediaItem: {},
lyricsDebug: { lyricsDebug: {
@ -280,12 +276,6 @@ const app = new Vue({
}, false) }, false)
}, },
methods: { methods: {
hotReload() {
this.appVisible = false
setTimeout(() => {
this.appVisible = true
}, 1000)
},
setWindowHash(route = "") { setWindowHash(route = "") {
window.location.hash = `#${route}`; window.location.hash = `#${route}`;
}, },
@ -1023,7 +1013,7 @@ const app = new Vue({
try {localStorage.setItem("playingBitrate", app.mk.nowPlayingItem.flavor)} try {localStorage.setItem("playingBitrate", app.mk.nowPlayingItem.flavor)}
catch(e) {} catch(e) {}
} }
if (!app.cfg.audio.normalization || app.cfg.advanced.AudioContext === true) { CiderAudio.hierarchical_loading(); } if (!app.cfg.audio.normalization && app.cfg.advanced.AudioContext === false) { CiderAudio.hierarchical_loading(); }
else { else {
// get unencrypted audio previews to get SoundCheck's normalization tag // get unencrypted audio previews to get SoundCheck's normalization tag
@ -3945,7 +3935,7 @@ const app = new Vue({
if (width) { if (width) {
width = parseInt(width * window.devicePixelRatio) width = parseInt(width * window.devicePixelRatio)
} }
let newurl = `${url.replace('{w}', width ?? height).replace('{h}', height).replace('{f}', "webp").replace('{c}', ((width === 900) ? "sr" : "cc"))}`; let newurl = `${url.replace('{w}', width ?? height).replace('{h}', height).replace('{f}', "webp").replace('{c}', ((width === 900 || width === 380 || width === 600 ) ? "sr" : "cc"))}`;
if (newurl.includes("900x516")) { if (newurl.includes("900x516")) {
newurl = newurl.replace("900x516cc", "900x516sr").replace("900x516bb", "900x516sr"); newurl = newurl.replace("900x516cc", "900x516sr").replace("900x516bb", "900x516sr");

View file

@ -118,6 +118,76 @@ const wsapi = {
}, },
getmaxVolume() { getmaxVolume() {
ipcRenderer.send('wsapi-returnvolumeMax',JSON.stringify(app.cfg.audio.maxVolume)); ipcRenderer.send('wsapi-returnvolumeMax',JSON.stringify(app.cfg.audio.maxVolume));
},
getLibraryStatus(kind, id) {
if (kind === undefined || id === "no-id-found") return;
let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/?ids[${truekind}]=${id}`, {
relate: "library",
fields: "inLibrary"
}).then(data => {
const res = data.data.data[0];
const inLibrary = res && res.attributes && res.attributes.inLibrary;
app.getRating({ type: truekind, id: id }).then(rating => {
ipcRenderer.send('wsapi-libraryStatus', inLibrary, rating);
})
})
},
rate(kind, id, rating) {
if (kind === undefined || id === "no-id-found") return;
let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
if (rating === 0) {
app.mk.api.v3.music(`/v1/me/ratings/${truekind}/${id}`, {}, {
fetchOptions: {
method: "DELETE",
}
}).then(function () {
ipcRenderer.send('wsapi-rate', kind, id, rating);
})
} else {
app.mk.api.v3.music(`/v1/me/ratings/${truekind}/${id}`, {}, {
fetchOptions: {
method: "PUT",
body: JSON.stringify({
"type": "rating",
"attributes": {
"value": rating
}
})
}
}).then(function () {
ipcRenderer.send('wsapi-rate', kind, id, rating);
})
}
},
changeLibrary(kind, id, shouldAdd) {
if (shouldAdd) {
app.addToLibrary(id);
ipcRenderer.send('wsapi-change-library', kind, id, shouldAdd);
} else {
let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/?ids[${truekind}]=${id}`, {
relate: "library",
fields: "inLibrary"
})
.then(res => {
res = res.data.data[0]
if (res && res.relationships && res.relationships.library && res.relationships.library.data) {
const item = res.relationships.library.data[0];
if (item) {
app.removeFromLibrary(kind, item.id)
}
ipcRenderer.send('wsapi-change-library', kind, id, shouldAdd);
}
});
}
} }
} }

View file

@ -1815,7 +1815,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
position : absolute; position : absolute;
z-index : 1000; z-index : 1000;
opacity : 1; opacity : 1;
background : rgba(30, 30, 30, 0.8); background-image: linear-gradient(180deg, transparent, rgba(30, 30, 30, 0.8));
justify-content: center; justify-content: center;
align-items : center; align-items : center;
display : none; display : none;

View file

@ -2,8 +2,18 @@
<div v-observe-visibility="{callback: visibilityChanged}"> <div v-observe-visibility="{callback: visibilityChanged}">
<template v-if="isVisible && recom.attributes.display.kind != 'MusicSuperHeroShelf'"> <template v-if="isVisible && recom.attributes.display.kind != 'MusicSuperHeroShelf'">
<div class="row"> <div class="row">
<div class="col"> <div class="col" v-if="recom?.relationships['primary-content']?.data?.length > 0" style="display: flex; margin-block:1rem;">
<h3 @click="navigateContent(recom?.relationships['primary-content']?.data[0] ?? recom?.attributes?.title?.contentIds[0] ?? '')" style="width: fit-content;" :class="{'item-navigate' : (recom?.attributes?.title?.contentIds?.length ?? 0) > 0 | recom?.relationships['primary-content']?.data?.length > 0}"> <div @click="navigateContent(recom?.relationships['primary-content']?.data[0] ?? recom?.attributes?.title?.contentIds[0] ?? '')" class="listennow-chip" style="height: 40px;width: 40px;align-self: center;margin-right: 10px;" :class="{ 'circle': recom?.relationships['primary-content']?.data[0]?.type == 'artists' }">
<mediaitem-artwork v-if="recom?.relationships['primary-content']?.data[0]?.attributes?.artwork != null" :url="recom?.relationships['primary-content']?.data[0]?.attributes?.artwork?.url" :size="100"></mediaitem-artwork>
</div>
<div @click="navigateContent(recom?.relationships['primary-content']?.data[0] ?? recom?.attributes?.title?.contentIds[0] ?? '')" style="width: fit-content;" :class="{'item-navigate' : (recom?.attributes?.title?.contentIds?.length ?? 0) > 0 | recom?.relationships['primary-content']?.data?.length > 0}">
<span style="opacity: 0.5; font-weight: bold;"> {{ recom.attributes.titleWithoutName.stringForDisplay }} </span>
<h3 style="margin-block: 0"> {{ recom?.relationships['primary-content']?.data[0].attributes?.name ?? recom.attributes.title.stringForDisplay.replace(recom.attributes.titleWithoutName.stringForDisplay, '') }}</h3>
</div>
</div>
<div class="col" v-else style="display: flex; margin-block:1rem;">
<h3 @click="navigateContent(recom?.relationships['primary-content']?.data[0] ?? recom?.attributes?.title?.contentIds[0] ?? '')" style="width: fit-content; margin-block:0;" :class="{'item-navigate' : (recom?.attributes?.title?.contentIds?.length ?? 0) > 0 | recom?.relationships['primary-content']?.data?.length > 0}">
{{ recom.attributes.title ? recom.attributes.title.stringForDisplay : " "}}</h3> {{ recom.attributes.title ? recom.attributes.title.stringForDisplay : " "}}</h3>
</div> </div>
<div class="col-auto cider-flex-center" v-if="recom.relationships.contents.data.length >= 10"> <div class="col-auto cider-flex-center" v-if="recom.relationships.contents.data.length >= 10">

View file

@ -92,6 +92,11 @@
type: Boolean, type: Boolean,
default: false, default: false,
required: false required: false
},
imageformat: {
type: String,
default: 'cc',
required: false
}, },
'contextExt': { type: Object, required: false }, 'contextExt': { type: Object, required: false },
}, },
@ -242,11 +247,11 @@
getArtworkUrl(size = -1, includeUrl = false) { getArtworkUrl(size = -1, includeUrl = false) {
let artwork = this.item?.attributes?.artwork ? this.item?.attributes?.artwork?.url : (this.item?.attributes?.editorialArtwork?.subscriptionCover?.url ?? '') let artwork = this.item?.attributes?.artwork ? this.item?.attributes?.artwork?.url : (this.item?.attributes?.editorialArtwork?.subscriptionCover?.url ?? '')
if (size != -1) { if (size != -1) {
artwork = artwork.replace('{w}', size).replace('{h}', size).replace('{f}', "webp").replace('{c}', ((size === 900) ? "sr" : "cc")) artwork = artwork.replace('{w}', size).replace('{h}', size).replace('{f}', "webp").replace('{c}', (size === 900 || size === 380 || size === 600 ) ? "sr" : this.imageformat);
} }
switch (this.kind) { switch (this.kind) {
case "385": case "385":
artwork = this.item.attributes.editorialArtwork?.subscriptionHero?.url ?? (this.item.attributes.artwork?.url ?? (this.item.relationships?.contents?.data[0]?.attributes?.editorialArtwork?.subscriptionHero?.url ?? '')) artwork = (this.item.attributes.editorialArtwork?.subscriptionHero?.url ?? (this.item.attributes.artwork?.url ?? (this.item.relationships?.contents?.data[0]?.attributes?.editorialArtwork?.subscriptionHero?.url ?? ''))).replace('{c}', (size === 900 || size === 380 || size === 600 ) ? "sr" : this.imageformat);
break; break;
} }
if (!includeUrl) { if (!includeUrl) {

View file

@ -0,0 +1,175 @@
<script type="text/x-template" id="pagination">
<div class="row" style="margin-bottom: 16px" v-if="!isInfinite">
<button
class="col md-btn page-btn"
:disabled="effectivePage === 1"
@click="goToPage(1)"
>
<img class="md-ico-first"/>
</button>
<button
class="col md-btn page-btn prev"
:disabled="effectivePage === 1"
@click="goToPrevious()"
>
<img class="md-ico-prev"/>
</button>
<button
:class="`col md-btn page-btn${ isCurrentPage(page) ? ' md-btn-primary': ''}`"
@click="goToPage(page)"
v-for="page in pagesToShow"
>{{ page }}</button>
<button
class="col md-btn page-btn next"
:disabled="effectivePage === numPages"
@click="goToNext()"
>
<img class="md-ico-next"/>
</button>
<button
class="col md-btn page-btn last"
:disabled="effectivePage === numPages"
@click="goToEnd()"
>
<img class="md-ico-last"/>
</button>
<div class="col page-btn" style="min-width: 12em;">
<input type="number" min="1" :max="numPages" :value="effectivePage" @change="changePage" />
<span>/ {{ numPages }}</span>
</div>
</div>
</script>
<script>
Vue.component('pagination', {
template: "#pagination",
props: {
'length': { type: Number, required: true },
'pageSize': { type: Number, required: true },
'scroll': { type: String, required: true },
'scrollSelector': { type: String, required: true }
},
data: function () {
return { currentPage: 1 }
},
mounted() {
document.querySelector(this.scrollSelector)
.addEventListener("scroll", this.handleScroll)
},
destroyed() {
document.querySelector(this.scrollSelector)
.removeEventListener("scroll", this.handleScroll)
},
watch: {
'length': function () {
if (this.isInfinite) {
// If a search reduces the number of things to show, we want to limit
// the number of songs shown as well. This is to prevent you scrolling
// to load your entire library, searching for one song, and then having
// th re-render the entire library
if (this.currentPage > this.numPages) {
this.currentPage = this.numPages;
this.$emit("onRangeChange", this.currentRange);
}
} else {
this.$emit("onRangeChange", this.currentRange);
}
},
'scroll': function () {
// When changing modes, set the page to 1. This is primarily to
// prevent going to a high page (e.g., 50) and then switching to infinite
// and showing 12.5k songs
this.currentPage = 1;
this.$emit("onRangeChange", this.currentRange);
}
},
computed: {
isInfinite: function () {
return this.scroll === "infinite"
},
currentRange: function () {
if (this.isInfinite) {
return [0, this.currentPage * this.pageSize];
} else {
const startingPage = Math.min(this.numPages, this.currentPage);
return [
(startingPage - 1) * this.pageSize,
startingPage * this.pageSize
];
}
},
effectivePage: function () {
return Math.min(this.currentPage, this.numPages)
},
numPages: function () {
return Math.ceil(this.length / this.pageSize) || 1;
},
pagesToShow: function () {
let start = this.currentPage - 2;
let end = this.currentPage + 2;
if (start < 1) {
end += (1 - start);
start = 1;
}
const endDifference = end - this.numPages;
if (endDifference > 0) {
end = this.numPages;
start = Math.max(1, start - endDifference);
}
const array = [];
for (let idx = start; idx <= end; idx++) {
array.push(idx);
}
return array;
}
},
methods: {
// Infinite Scrolling
handleScroll: function (event) {
if (this.isInfinite &&
this.currentPage < this.numPages &&
event.target.scrollTop >= event.target.scrollHeight - event.target.clientHeight) {
this.currentPage += 1;
this.$emit("onRangeChange", this.currentRange);
}
},
// Pagination
isCurrentPage: function (idx) {
return idx === this.currentPage ||
(idx === this.numPages && this.currentPage > this.numPages);
},
changePage: function (event) {
const value = event.target.valueAsNumber;
if (!isNaN(value) && value >= 1 && value <= this.numPages) {
this.currentPage = value;
this.$emit("onRangeChange", this.currentRange);
}
},
goToPage: function (page) {
this.currentPage = page;
this.$emit("onRangeChange", this.currentRange);
},
goToPrevious: function () {
if (this.currentPage > 1) {
this.currentPage -= 1;
this.$emit("onRangeChange", this.currentRange);
}
},
goToNext: function () {
if (this.currentPage < this.numPages) {
this.currentPage += 1;
this.$emit("onRangeChange", this.currentRange);
}
},
goToEnd: function () {
this.currentPage = this.numPages;
this.$emit("onRangeChange", this.currentRange);
}
}
})
</script>

View file

@ -547,6 +547,14 @@
:disabled="app.cfg.visual.customAccentColor" switch/> :disabled="app.cfg.visual.customAccentColor" switch/>
</div> </div>
</div> </div>
<div class="md-option-line">
<div class="md-option-segment">
{{$root.getLz('settings.option.visual.compactArtistHeader')}}
</div>
<div class="md-option-segment_auto">
<input type="checkbox" v-model="app.cfg.visual.compactArtistHeader" switch/>
</div>
</div>
<div class="md-option-line"> <div class="md-option-line">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.option.visual.hardwareAcceleration')}}<br> {{$root.getLz('settings.option.visual.hardwareAcceleration')}}<br>
@ -771,19 +779,19 @@
<option value='afrikaans'>Afrikaans</option> <option value='afrikaans'>Afrikaans</option>
<option value='albanian'>Albanian</option> <option value='albanian'>Albanian</option>
<option value='arab'>Arabic</option> <option value='arab'>Arabic</option>
<option value='armenian'>Armenian</option> <option value='armenian'>Armenian</option>
<option value='azerbaijani'>Azerbaijani</option> <option value='azerbaijani'>Azerbaijani</option>
<option value='bengali'>Bengali</option> <option value='bengali'>Bengali</option>
<option value='bosnian'>Bosnian</option> <option value='bosnian'>Bosnian</option>
<option value='brazilian'>Brazilian</option> <option value='brazilian'>Brazilian</option>
<option value='bulgarian'>Bulgarian</option> <option value='bulgarian'>Bulgarian</option>
<option value='chinese'>Chinese (Simplified)</option> <option value='chinese'>Chinese (Simplified)</option>
<option value='chinese-trad'>Chinese (Traditional)</option> <option value='chinese-trad'>Chinese (Traditional)</option>
<option value='chinese-romaji'>Romanized Chinese</option> <option value='chinese-romaji'>Romanized Chinese</option>
<option value='croatian'>Croatian</option> <option value='croatian'>Croatian</option>
<option value='czech'>Czech</option> <option value='czech'>Czech</option>
<option value='danish'>Danish</option> <option value='danish'>Danish</option>
<option value='dutch'>Dutch</option> <option value='dutch'>Dutch</option>
<option value='estonian'>Estonian</option> <option value='estonian'>Estonian</option>
<option value='english'>English</option> <option value='english'>English</option>
<option value='farsi'>Farsi</option> <option value='farsi'>Farsi</option>
@ -1247,6 +1255,27 @@
</label> </label>
</div> </div>
</div> </div>
<div class="md-option-line">
<div class="md-option-segment">
{{$root.getLz('settings.option.general.pagination')}}<br>
<small>
{{$root.getLz('settings.options.general.pagination.description')}}<br>
</small>
</div>
<div class="md-option-segment md-option-segment_auto">
<label>
<select class="md-select" style="width:180px;"
v-model.number="$root.cfg.libraryPrefs.pageSize" type="number">
<option value="50">50</option>
<option value="100">100</option>
<option value="250">250</option>
<option value="500">500</option>
<option value="1000">1000</option>
</select>
</label>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,7 +1,7 @@
<script type="text/x-template" id="cider-artist"> <script type="text/x-template" id="cider-artist">
<div class="content-inner artist-page" <div class="content-inner artist-page"
:class="[(data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9) || hasHero()) ? 'animated' : '']"> :class="[(data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9) || hasHero()) ? 'animated' : '']">
<div class="artist-header" :key="data.id" v-observe-visibility="{callback: isHeaderVisible}"> <div :class="['artist-header', { 'artist-header-compact': app.cfg.visual.compactArtistHeader }]" :key="data.id" v-observe-visibility="{callback: isHeaderVisible}">
<animatedartwork-view <animatedartwork-view
:priority="true" :priority="true"
v-if="hasAnimated()" v-if="hasAnimated()"

View file

@ -107,6 +107,12 @@
<img :class="(!inLibrary) ? 'md-ico-add' : 'md-ico-remove'"> <img :class="(!inLibrary) ? 'md-ico-add' : 'md-ico-remove'">
{{app.getLz('term.confirm')}} {{app.getLz('term.confirm')}}
</button> </button>
<select v-if="shouldPaginate" class="md-select" v-model="prefs.scroll">
<optgroup :label="app.getLz('term.scroll')">
<option value="infinite">{{app.getLz('term.scroll.infinite')}}</option>
<option value="paged">{{app.getLz('term.scroll.paged').replace("${songsPerPage}", pageSize)}}</option>
</optgroup>
</select>
<div style="display: flex; float: right;"> <div style="display: flex; float: right;">
<button :style="{ 'background': '#' + hasHeroObject()?.textColor4 ?? '' }" :class="['search-btn', showSearch ? 'active' : '']" @click="toggleSearch()" :aria-label="showSearch ? app.getLz('term.hideSearch') : app.getLz('term.showSearch')"> <button :style="{ 'background': '#' + hasHeroObject()?.textColor4 ?? '' }" :class="['search-btn', showSearch ? 'active' : '']" @click="toggleSearch()" :aria-label="showSearch ? app.getLz('term.hideSearch') : app.getLz('term.showSearch')">
<svg-icon :style="{ 'width': '15px', 'background-color': '#' + hasHeroObject()?.bgColor ?? '' }" :url="showSearch ? './assets/search-alt.svg' : './assets/search.svg'"> <svg-icon :style="{ 'width': '15px', 'background-color': '#' + hasHeroObject()?.bgColor ?? '' }" :url="showSearch ? './assets/search-alt.svg' : './assets/search.svg'">
@ -161,6 +167,12 @@
<img :class="(!inLibrary) ? 'md-ico-add' : 'md-ico-remove'"> <img :class="(!inLibrary) ? 'md-ico-add' : 'md-ico-remove'">
{{app.getLz('term.confirm')}} {{app.getLz('term.confirm')}}
</button> </button>
<select v-if="shouldPaginate" class="md-select" v-model="prefs.scroll">
<optgroup :label="app.getLz('term.scroll')">
<option value="infinite">{{app.getLz('term.scroll.infinite')}}</option>
<option value="paged">{{app.getLz('term.scroll.paged').replace("${songsPerPage}", pageSize)}}</option>
</optgroup>
</select>
</div> </div>
</div> </div>
<div class="col-auto cider-flex-center"> <div class="col-auto cider-flex-center">
@ -172,7 +184,7 @@
</div> </div>
<div class="playlist-body scrollbody"> <div class="playlist-body scrollbody">
<b-tabs pills class="track-pills pilldim fancy-pills" align="center" content-class="mt-3" :nav-wrapper-class="navClass(data)"> <b-tabs pills class="track-pills pilldim fancy-pills" align="center" content-class="mt-3" :nav-wrapper-class="navClass(data)">
<b-tab :title="$root.getLz('term.tracks')"> <b-tab :title="$root.getLz('term.tracks')" id="songList">
<div @wheel="minClass(true)" @scroll="minClass(true)"> <div @wheel="minClass(true)" @scroll="minClass(true)">
<div class=""> <div class="">
<div style="width:100%" @click="minClass(true)"> <div style="width:100%" @click="minClass(true)">
@ -186,18 +198,27 @@
class="search-input" class="search-input"
ref="search-bar"> ref="search-bar">
</div> </div>
<pagination
v-if="shouldPaginate"
style="margin-top: 10px"
:length="hasNestedPlaylist ? nestedDisplayLength: displayListing.length"
:pageSize="pageSize"
:scroll="prefs.scroll"
scrollSelector="#songList"
@onRangeChange="onRangeChange"
/>
<draggable :options="{disabled: !editing}" <draggable :options="{disabled: !editing}"
v-model="data.relationships.tracks.data" @start="drag=true" v-model="data.relationships.tracks.data" @start="drag=true"
@end="drag=false;put()"> @end="drag=false;put()">
<template v-if="!hasNestedPlaylist"> <template v-if="!hasNestedPlaylist">
<mediaitem-list-item :item="item" :parent="getItemParent(data)" :index="index" <mediaitem-list-item :item="item" :parent="getItemParent(data)" :index="index + start"
:showIndex="true" :showIndex="true"
:showIndexPlaylist="(data.attributes.playParams?.kind ?? data.type ?? '').includes('playlist')" :showIndexPlaylist="(data.attributes.playParams?.kind ?? data.type ?? '').includes('playlist')"
:context-ext="buildContextMenu()" :context-ext="buildContextMenu()"
v-for="(item,index) in displayListing"></mediaitem-list-item> v-for="(item,index) in currentSlice"></mediaitem-list-item>
</template> </template>
<template v-else> <template v-else>
<div v-for="disc in nestedPlaylist"> <div v-for="disc in nestedSlices">
<div class="playlist-time">{{($root.getLz("term.discNumber") ?? <div class="playlist-time">{{($root.getLz("term.discNumber") ??
"").replace("${discNumber}",disc.disc)}} "").replace("${discNumber}",disc.disc)}}
</div> </div>
@ -278,6 +299,7 @@
props: ["data"], props: ["data"],
data: function () { data: function () {
const pageSize = this.$root.cfg.libraryPrefs.pageSize;
return { return {
editorialNotesExpanded: false, editorialNotesExpanded: false,
drag: false, drag: false,
@ -291,6 +313,7 @@
headerVisible: true, headerVisible: true,
useArtistChip: false, useArtistChip: false,
nestedPlaylist: [], nestedPlaylist: [],
nestedDisplayLength: 0,
classes: [], classes: [],
editing: false, editing: false,
inPlaylist: false, inPlaylist: false,
@ -298,6 +321,10 @@
displayListing: [], displayListing: [],
hasNestedPlaylist: false, hasNestedPlaylist: false,
showSearch: false, showSearch: false,
pageSize: pageSize,
start: 0,
end: pageSize,
prefs: this.$root.cfg.libraryPrefs.playlists
} }
}, },
mounted: function () { mounted: function () {
@ -346,7 +373,48 @@
deep: true deep: true
} }
}, },
computed: {
currentSlice() {
return this.displayListing.slice(this.start, this.end);
},
nestedSlices() {
if (this.shouldPaginate) {
let songsSeen = 0;
const discs = [];
for (const disc of this.nestedPlaylist) {
songsSeen += disc.tracks.length;
if (songsSeen >= this.end) {
discs.push({
disc: disc.disc,
tracks: disc.tracks.slice(0, this.end + disc.tracks.length - songsSeen)
})
break;
} else if (songsSeen > this.start) {
discs.push({
disc: disc.disc,
tracks: disc.tracks.slice(this.start - songsSeen)
})
}
}
return discs;
} else {
return this.nestedPlaylist
}
},
shouldPaginate() {
const result = this.data.relationships.tracks.data.length > this.pageSize
console.log(result)
return result
}
},
methods: { methods: {
onRangeChange(newRange) {
this.start = newRange[0];
this.end = newRange[1];
},
isAlbum() { isAlbum() {
return (this.data.attributes?.playParams?.kind ?? this.data.type ?? '').includes('album') return (this.data.attributes?.playParams?.kind ?? this.data.type ?? '').includes('album')
}, },
@ -372,6 +440,8 @@
}, },
generateNestedPlaylist(songlists) { generateNestedPlaylist(songlists) {
this.nestedPlaylist = []; this.nestedPlaylist = [];
this.nestedDisplayLength = songlists.length;
if (this.data?.type?.includes("album")) { if (this.data?.type?.includes("album")) {
let discs = songlists.map(x => { let discs = songlists.map(x => {
return x.attributes.discNumber return x.attributes.discNumber

View file

@ -46,17 +46,33 @@
</optgroup> </optgroup>
</select> </select>
</div> </div>
<div class="col">
<select class="md-select" v-model="prefs.scroll">
<optgroup :label="app.getLz('term.scroll')">
<option value="infinite">{{app.getLz('term.scroll.infinite')}}</option>
<option value="paged">{{app.getLz('term.scroll.paged').replace("${songsPerPage}", pageSize)}}</option>
</optgroup>
</select>
</div>
</div> </div>
</div> </div>
</div> </div>
<pagination
:length="app.library.albums.displayListing.length
"
:pageSize="pageSize"
:scroll="prefs.scroll"
scrollSelector="#app-content"
@onRangeChange="onRangeChange"
/>
<div class="well"> <div class="well">
<div class="albums-square-container"> <div class="albums-square-container">
<div> <div>
<mediaitem-square v-if="prefs.viewAs == 'covers'" :size="'300'" :item="item" v-for="item in library.albums.displayListing"> <mediaitem-square v-if="prefs.viewAs == 'covers'" :size="'300'" :item="item" v-for="item in currentSlice">
</mediaitem-square> </mediaitem-square>
</div> </div>
</div> </div>
<mediaitem-list-item v-if="prefs.viewAs == 'list'" :show-duration="false" :show-meta-data="true" :show-library-status="false" :item="item" v-for="item in library.albums.displayListing"> <mediaitem-list-item v-if="prefs.viewAs == 'list'" :show-duration="false" :show-meta-data="true" :show-library-status="false" :item="item" v-for="item in currentSlice">
</mediaitem-list-item> </mediaitem-list-item>
</div> </div>
</div> </div>
@ -65,21 +81,34 @@
Vue.component('cider-library-albums', { Vue.component('cider-library-albums', {
template: '#cider-library-albums', template: '#cider-library-albums',
data: function () { data: function () {
const pageSize = this.$root.cfg.libraryPrefs.pageSize;
return { return {
library: this.$root.library, library: this.$root.library,
mediaItemSize: "compact", mediaItemSize: "compact",
prefs: this.$root.cfg.libraryPrefs.albums, prefs: this.$root.cfg.libraryPrefs.albums,
app : this.$root app: this.$root,
pageSize: pageSize,
start: 0,
end: pageSize
} }
}, },
mounted() { mounted() {
this.$root.getLibraryAlbumsFull(null, 1); this.$root.getLibraryAlbumsFull(null, 1);
this.$root.getAlbumSort(); this.$root.getAlbumSort();
this.$root.searchLibraryAlbums(1); this.$root.searchLibraryAlbums(1);
this.$root.getLibrarySongsFull() ; this.$root.getLibrarySongsFull();
this.$root.searchLibraryAlbums(1); this.$root.searchLibraryAlbums(1);
}, },
computed: {
currentSlice: function () {
return this.library.albums.displayListing.slice(this.start, this.end);
}
},
methods: { methods: {
onRangeChange: function (newRange) {
this.start = newRange[0];
this.end = newRange[1];
}
} }
}); });
</script> </script>

View file

@ -64,45 +64,13 @@
</button> </button>
</div> </div>
</div> </div>
<div class="row" style="margin-bottom: 16px" v-if="!isInfinite"> <pagination
<button :length="library.songs.displayListing.length"
class="col md-btn page-btn" :pageSize="pageSize"
:disabled="currentPage === 1" :scroll="prefs.scroll"
@click="goToPage(1)" scrollSelector="#app-content"
> @onRangeChange="onRangeChange"
<img class="md-ico-first"/> />
</button>
<button
class="col md-btn page-btn prev"
:disabled="currentPage === 1"
@click="goToPrevious()"
>
<img class="md-ico-prev"/>
</button>
<button
:class="`col md-btn page-btn${ isCurrentPage(page) ? ' md-btn-primary': ''}`"
@click="goToPage(page)"
v-for="page in pagesToShow"
>{{ page }}</button>
<button
class="col md-btn page-btn next"
:disabled="currentPage === numPages"
@click="goToNext()"
>
<img class="md-ico-next"/>
</button>
<button
class="col md-btn page-btn last"
:disabled="currentPage === numPages"
@click="goToEnd()"
>
<img class="md-ico-last"/>
</button>
<div class="col page-btn" style="min-width: 12em;">
<input type="number" min="1" :max="numPages" :value="currentPage" @change="changePage" />
<span>/ {{ numPages }}</span>
</div>
</div>
</div> </div>
<div v-if="library.songs.downloadState == 3">Library contains no songs.</div> <div v-if="library.songs.downloadState == 3">Library contains no songs.</div>
@ -119,125 +87,31 @@
Vue.component('cider-library-songs', { Vue.component('cider-library-songs', {
template: '#cider-library-songs', template: '#cider-library-songs',
data: function () { data: function () {
const pageSize = this.$root.cfg.libraryPrefs.pageSize;
return { return {
// currentPage is oneIndexed // currentPage is oneIndexed
currentPage: 1,
library: this.$root.library, library: this.$root.library,
mediaItemSize: "compact", mediaItemSize: "compact",
pageSize: 250,
prefs: this.$root.cfg.libraryPrefs.songs, prefs: this.$root.cfg.libraryPrefs.songs,
app: this.$root app: this.$root,
pageSize: pageSize,
start: 0,
end: pageSize
} }
}, },
mounted() { mounted() {
document.querySelector("#app-content")
.addEventListener("scroll", this.handleScroll)
this.$root.getLibrarySongsFull() this.$root.getLibrarySongsFull()
}, },
destroyed() {
document.querySelector("#app-content")
.removeEventListener("scroll", this.handleScroll)
},
watch: {
'library.songs.displayListing.length': function () {
if (this.isInfinite) {
// If a search reduces the number of things to show, we want to limit
// the number of songs shown as well. This is to prevent you scrolling
// to load your entire library, searching for one song, and then having
// th re-render the entire library
if (this.currentPage > this.numPages) {
this.currentPage = this.numPages;
}
}
},
'prefs.scroll': function () {
// When changing modes, set the page to 1. This is primarily to
// prevent going to a high page (e.g., 50) and then switching to infinite
// and showing 12.5k songs
this.currentPage = 1;
}
},
computed: { computed: {
isInfinite: function () {
return this.prefs.scroll === "infinite"
},
currentSlice: function () { currentSlice: function () {
if (this.isInfinite) { return this.library.songs.displayListing.slice(this.start, this.end);
return this.library.songs.displayListing.slice(
0, this.currentPage * this.pageSize
);
} else {
const startingPage = Math.min(this.numPages, this.currentPage);
return this.library.songs.displayListing.slice(
(startingPage - 1) * this.pageSize,
startingPage * this.pageSize
);
}
},
numPages: function () {
return Math.ceil(this.library.songs.displayListing.length / this.pageSize) || 1;
},
pagesToShow: function () {
let start = this.currentPage - 2;
let end = this.currentPage + 2;
if (start < 1) {
end += (1 - start);
start = 1;
}
const endDifference = end - this.numPages;
if (endDifference > 0) {
end = this.numPages;
start = Math.max(1, start - endDifference);
}
const array = [];
for (let idx = start; idx <= end; idx++) {
array.push(idx);
}
return array;
} }
}, },
methods: { methods: {
// Infinite Scrolling onRangeChange: function (newRange) {
handleScroll: function (event) { this.start = newRange[0];
if (this.isInfinite && this.end = newRange[1];
this.currentPage < this.numPages &&
event.target.scrollTop >= event.target.scrollHeight - event.target.clientHeight) {
this.currentPage += 1;
}
}, },
// Pagination
isCurrentPage: function (idx) {
return idx === this.currentPage ||
(idx === this.numPages && this.currentPage > this.numPages);
},
changePage: function (event) {
const value = event.target.valueAsNumber;
if (!isNaN(value) && value >= 1 && value <= this.numPages) {
this.currentPage = value;
}
},
goToPage: function (page) {
this.currentPage = page;
},
goToPrevious: function () {
if (this.currentPage > 1) {
this.currentPage -= 1;
}
},
goToNext: function () {
if (this.currentPage < this.numPages) {
this.currentPage += 1;
}
},
goToEnd: function () {
this.currentPage = this.numPages;
},
// Miscellaneous
play: function () { play: function () {
function shuffleArray(array) { function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) { for (var i = array.length - 1; i > 0; i--) {

View file

@ -119,7 +119,7 @@
</div> </div>
</template> </template>
</div> </div>
<div v-else> <div v-else >
<div v-if="categoriesReady || getCategories()"> <div v-if="categoriesReady || getCategories()">
<div> <div>
<div class="col" v-if="categoriesView != null && categoriesView != [] && categoriesView[0].attributes != null && categoriesView[0].attributes.title != null"> <div class="col" v-if="categoriesView != null && categoriesView != [] && categoriesView[0].attributes != null && categoriesView[0].attributes.title != null">
@ -131,7 +131,9 @@
<!-- <mediaitem-square :kind="'385'" size="600" v-for="item in recentlyPlayed.limit(10)" :item="item" :imagesize="800"></mediaitem-square>--> <!-- <mediaitem-square :kind="'385'" size="600" v-for="item in recentlyPlayed.limit(10)" :item="item" :imagesize="800"></mediaitem-square>-->
<h3>{{categoriesView[0].attributes.title.stringForDisplay ?? ""}}</h3> <h3>{{categoriesView[0].attributes.title.stringForDisplay ?? ""}}</h3>
</div> </div>
<mediaitem-square :kind="'385'" size="600" </div>
<div class="categories">
<mediaitem-square :kind="'385'" :imageformat="'bb'" size="600"
:item="item ? (item.attributes.kind ? item : ((item.relationships && item.relationships.contents ) ? item.relationships.contents.data[0] : item)) : []" :item="item ? (item.attributes.kind ? item : ((item.relationships && item.relationships.contents ) ? item.relationships.contents.data[0] : item)) : []"
:imagesize="800" :imagesize="800"
v-for="item of getFlattenedCategories()"> v-for="item of getFlattenedCategories()">

View file

@ -24,7 +24,11 @@ var app = new Vue({
lyricsScrollingBlocked: false, lyricsScrollingBlocked: false,
queue: {}, queue: {},
lowerPanelState: "controls", lowerPanelState: "controls",
userInteraction: false userInteraction: false,
status: {
inLibrary: false,
rating: 0
}
}, },
queue: { queue: {
temp: [] temp: []
@ -246,6 +250,17 @@ var app = new Vue({
id: id id: id
})) }))
}, },
getLibraryStatus(type, id) {
if (type !== undefined && id !== "no-id-found") {
socket.send(JSON.stringify({
action: "library-status",
type: type,
id: id
}))
} else {
this.player.status = {};
}
},
searchQuery() { searchQuery() {
if (this.search.query.length == 0) { if (this.search.query.length == 0) {
this.search.state = 0; this.search.state = 0;
@ -412,8 +427,8 @@ var app = new Vue({
this.getQueue() this.getQueue()
}, },
queueMove(evt) { queueMove(evt) {
console.log(evt) // console.log(evt)
console.log(`new: ${evt.moved.newIndex} old: ${evt.moved.oldIndex}`) // console.log(`new: ${evt.moved.newIndex} old: ${evt.moved.oldIndex}`)
this.queue.temp.splice(evt.moved.newIndex, 0, this.queue.temp.splice(evt.moved.oldIndex, 1)[0]) this.queue.temp.splice(evt.moved.newIndex, 0, this.queue.temp.splice(evt.moved.oldIndex, 1)[0])
socket.send(JSON.stringify({ socket.send(JSON.stringify({
action: "queue-move", action: "queue-move",
@ -557,11 +572,9 @@ var app = new Vue({
} }
socket.onmessage = (e) => { socket.onmessage = (e) => {
console.log(e.data)
const response = JSON.parse(e.data); const response = JSON.parse(e.data);
switch (response.type) { switch (response.type) {
default: console.log(response); default: break;
break;
case "musickitapi.search": case "musickitapi.search":
self.showArtist(response.data["artists"][0]["id"]); self.showArtist(response.data["artists"][0]["id"]);
break; break;
@ -577,7 +590,8 @@ var app = new Vue({
} }
break; break;
case "queue": case "queue":
self.player.queue = response.data; // console.log(response.data);
self.player.queue = response.data;
self.queue.temp = response.data["_queueItems"]; self.queue.temp = response.data["_queueItems"];
self.$forceUpdate() self.$forceUpdate()
break; break;
@ -601,6 +615,27 @@ var app = new Vue({
case "maxVolume": case "maxVolume":
this.player.maxVolume = response.data; this.player.maxVolume = response.data;
break; break;
case "libraryStatus":
this.player.status = response.data;
break;
case "rate":
var params = this.player.currentMediaItem.playParams;
if (params && params.id === response.data.id && params.kind === response.data.kind) {
this.player.status = {
rating: response.data.rating,
inLibrary: this.player.status.inLibrary
}
}
break;
case "change-library":
var params = this.player.currentMediaItem.playParams;
if (params && params.id === response.data.id && params.kind === response.data.kind) {
this.player.status = {
rating: this.player.status.rating,
inLibrary: response.data.add
}
}
break;
} }
// console.log(e.data); // console.log(e.data);
} }
@ -608,6 +643,8 @@ var app = new Vue({
updatePlaybackState(mediaitem) { updatePlaybackState(mediaitem) {
var lyricsDisplayed = this.screen == "lyrics" || this.player.lowerPanelState == "lyrics" var lyricsDisplayed = this.screen == "lyrics" || this.player.lowerPanelState == "lyrics"
if (this.player.currentMediaItem["isrc"] != mediaitem["isrc"]) { if (this.player.currentMediaItem["isrc"] != mediaitem["isrc"]) {
this.getLibraryStatus(mediaitem.playParams.kind, mediaitem.playParams.id)
if (lyricsDisplayed) { if (lyricsDisplayed) {
this.getLyrics() this.getLyrics()
} }
@ -617,6 +654,39 @@ var app = new Vue({
} }
this.player.currentMediaItem = mediaitem this.player.currentMediaItem = mediaitem
}, },
openSongMenu() {
const params = this.player.currentMediaItem.playParams;
if (params) {
this.getLibraryStatus(params.kind, params.id);
}
this.player.songActions = true;
},
rate(rating) {
const params = this.player.currentMediaItem.playParams;
if (params && params.kind !== undefined && params.id !== "no-id-found") {
socket.send(JSON.stringify({
action: "rating",
type: params.kind,
id: params.id,
rating: rating
}))
}
},
toLibrary(shouldAdd) {
const params = this.player.currentMediaItem.playParams;
if (params && params.kind !== undefined && params.id !== "no-id-found") {
socket.send(JSON.stringify({
action: "change-library",
type: params.kind,
id: params.id,
add: shouldAdd
}))
}
},
quit() { quit() {
socket.send(JSON.stringify({ socket.send(JSON.stringify({
action: "quit" action: "quit"

View file

@ -838,6 +838,15 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
cursor: pointer; cursor: pointer;
} }
.context-menu .context-menu-item:disabled {
cursor: default;
filter: brightness(125%);
}
.context-menu .context-menu-item:active:disabled {
filter: brightness(125%);
}
.context-menu .context-menu-item:active { .context-menu .context-menu-item:active {
filter: brightness(75%); filter: brightness(75%);
} }

View file

@ -130,8 +130,8 @@
{{ player.currentMediaItem.artistName }} {{ player.currentMediaItem.artistName }}
</div> </div>
</div> </div>
<div class="col-auto nopadding player-more-container" v-if="false" style=""> <div class="col-auto nopadding player-more-container" style="">
<button @click="player.songActions = true;" class="player-more-button">...</button> <button @click="openSongMenu()" class="player-more-button">...</button>
</div> </div>
</div> </div>
</div> </div>
@ -525,7 +525,8 @@
</div> </div>
<div class="md-body context-menu-body"> <div class="md-body context-menu-body">
<button class="context-menu-item context-menu-item--left" v-if="false"> <button class="context-menu-item context-menu-item--left" v-if="!player.status.inLibrary"
@click="toLibrary(true)">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
Add To Library Add To Library
@ -535,7 +536,19 @@
</div> </div>
</div> </div>
</button> </button>
<button class="context-menu-item context-menu-item--left" v-if="false"> <button class="context-menu-item context-menu-item--left" v-if="player.status.inLibrary"
@click="toLibrary(false)">
<div class="row">
<div class="col">
Remove From Library
</div>
<div class="col-auto">
</div>
</div>
</button>
<button class="context-menu-item context-menu-item--left" :disabled="player.status.rating === 1"
@click="rate(1)">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
Love Love
@ -545,7 +558,29 @@
</div> </div>
</div> </div>
</button> </button>
<button class="context-menu-item context-menu-item--left"> <button class="context-menu-item context-menu-item--left" :disabled="player.status.rating === 0"
@click="rate(0)">
<div class="row">
<div class="col">
Remove Rating
</div>
<div class="col-auto">
</div>
</div>
</button>
<button class="context-menu-item context-menu-item--left"
:disabled="player.status.rating === -1" @click="rate(-1)">
<div class="row">
<div class="col">
Dislike
</div>
<div class="col-auto">
👎
</div>
</div>
</button>
<button class="context-menu-item context-menu-item--left" v-if="false">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
Share Share
@ -555,7 +590,7 @@
</div> </div>
</div> </div>
</button> </button>
<button class="context-menu-item context-menu-item--left"> <button class="context-menu-item context-menu-item--left" v-if="false">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
Open in {{ musicAppVariant() }} Open in {{ musicAppVariant() }}

View file

@ -1,7 +1,7 @@
{ {
"electronVersion": "19.0.3", "electronVersion": "19.0.8",
"electronDownload": { "electronDownload": {
"version": "19.0.3+wvcus", "version": "20.0.0-beta.11+wvcus",
"mirror": "https://github.com/castlabs/electron-releases/releases/download/v" "mirror": "https://github.com/castlabs/electron-releases/releases/download/v"
}, },
"appId": "cider", "appId": "cider",