diff --git a/.circleci/config.yml b/.circleci/config.yml index f1370fb9..e02b98b2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2.1 executors: cider-ci: docker: - - image: circleci/node:16 + - image: cimg/node:lts-browsers working_directory: ~/Cider orbs: # Add orbs to your configuration @@ -15,15 +15,9 @@ jobs: executor: cider-ci steps: - checkout - # - run: - # name: Rename Repository - # command: sed -i 's/github:ciderapp\/Cider/github:ciderapp\/cider-releases/' package.json - run: name: Update Version Number of App command: sudo chmod +x resources/version.sh && ./resources/version.sh || true - - run: - name: Update Package Managers - command: sudo npm update -g npm yarn - restore_cache: name: Restore Yarn Package Cache keys: @@ -60,9 +54,6 @@ jobs: steps: - attach_workspace: at: ~/Cider -# - run: -# name: Fix Versioning and Add Channel -# command: yarn circle:script - run: name: Generate Builds (Linux) command: yarn electron-builder -l -p never @@ -89,9 +80,6 @@ jobs: sudo dpkg --add-architecture i386 sudo apt-get update -y sudo apt-get install -y wine32 -# - run: -# name: Fix Versioning and Add Channel -# command: yarn circle:script - run: name: Generate Builds (Windows) command: yarn electron-builder -w --x64 -p never @@ -117,9 +105,6 @@ jobs: sudo dpkg --add-architecture i386 sudo apt-get update -y sudo apt-get install -y wine32 -# - run: -# name: Fix Versioning and Add Channel -# command: yarn circle:script - run: name: Generate Builds (Winget) command: yarn electron-builder --win -c winget.json -p never @@ -156,9 +141,6 @@ jobs: mv ~/Cider/dist/*.blockmap ~/Cider/dist/artifacts - store_artifacts: path: ~/Cider/dist/artifacts -# - run: -# name: Fix Versioning and Add Channel -# command: yarn circle:script - run: name: Update Version Number of App command: sudo chmod +x resources/version.sh && ./resources/version.sh || true diff --git a/Assets/Release.svg b/Assets/Release.svg index f27dc45d..3c9999cd 100644 --- a/Assets/Release.svg +++ b/Assets/Release.svg @@ -1,6 +1,9 @@ - - - + + + + + + diff --git a/resources/icons/icon.svg b/resources/icons/icon.svg new file mode 100644 index 00000000..6f5cad41 --- /dev/null +++ b/resources/icons/icon.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/i18n/README.md b/src/i18n/README.md index a21bf49e..026c7ec6 100644 --- a/src/i18n/README.md +++ b/src/i18n/README.md @@ -423,10 +423,10 @@ Update 24/05/2022 20:30 UTC Update 24/05/2022 21:15 UTC -* `settings.option.general.updateCider`: Deleted for all language files -* `settings.option.general.updateCider.branch`: Deleted for all language files +* `settings.option.general.updateCider`: Deleted for all language files +* `settings.option.general.updateCider.branch`: Deleted for all language files * `settings.option.general.updateCider.branch.description`: Deleted for all language files -* `settings.option.general.updateCider.branch.main`: Deleted for all language files +* `settings.option.general.updateCider.branch.main`: Deleted for all language files * `settings.option.general.updateCider.branch.develop`: Deleted for all language files * `settings.notyf.updateCider.update-error`: Deleted for all language files @@ -444,7 +444,56 @@ Update 03/06/2022 11:40 UTC * `settings.option.connectivity.discordRPC.reload`: Added to `en_US` * `settings.option.connectivity.discordRPC.reconnectedToUser`: Added to `en_US` +Update 04/06/2022 03:00 UTC + +* `term.cast`: Added to `en_US` +* `term.playpause`: Added to `en_US` +* `term.reload`: Added to `en_US` +* `term.toggleprivate`: Added to `en_US` +* `term.webremote`: Added to `en_US` +* `term.cast2`: Added to `en_US` +* `term.quit`: Added to `en_US` +* `menubar.options.zoom`: Added to `en_US` +* `term.zoomin`: Added to `en_US` +* `term.zoomout`: Added to `en_US` +* `term.zoomreset`: Added to `en_US` +* `term.fullscreen`: Added to `en_US` +* `settings.option.general.keybindings.library`: Added to `en_US` +* `settings.option.general.keybindings.session`: Added to `en_US` +* `settings.option.general.keybindings.control`: Added to `en_US` +* `settings.option.general.keybindings.interface`: Added to `en_US` +* `settings.option.general.keybindings.advanced`: Added to `en_US` + +* `action.tray.quit`: Deleted for all language files +* `action.tray.playpause`: Deleted for all language files +* `action.tray.next`: Deleted for all language files +* `action.tray.previous`: Deleted for all language files +* `menubar.options.about`: Deleted for all language files +* `menubar.options.settings`: Deleted for all language files +* `menubar.options.quit`: Deleted for all language files +* `menubar.options.toggleprivate`: Deleted for all language files +* `menubar.options.webremote`: Deleted for all language files +* `menubar.options.audio`: Deleted for all language files +* `menubar.options.next`: Deleted for all language files +* `menubar.options.previous`: Deleted for all language files +* `menubar.options.browse`: Deleted for all language files +* `menubar.options.artists`: Deleted for all language files +* `menubar.options.search`: Deleted for all language files +* `menubar.options.albums`: Deleted for all language files +* `menubar.options.cast`: Deleted for all language files +* `menubar.options.accountsettings`: Deleted for all language files +* `menubar.options.discord`: Deleted for all language files +* `menubar.options.github`: Deleted for all language files, +* `menubar.options.listennow`: Deleted for all language files +* `menubar.options.recentlyAdded`: Deleted for all language files +* `menubar.options.songs`: Deleted for all language files +* `settings.option.general.keybindings.open`: Deleted for all language files +* `menubar.options.playpause`: Deleted for all language files Update 10/06/2022 20:00 UTC * `settings.option.visual.purplePodcastPlaybackBar`: Added to `en_US` +Update 14/06/2022 14:10 UTC + +* `term.themeManaged`: Added to `en_US` + diff --git a/src/i18n/en_GB.json b/src/i18n/en_GB.json index bd4f7203..3be188ea 100644 --- a/src/i18n/en_GB.json +++ b/src/i18n/en_GB.json @@ -2,7 +2,7 @@ "i18n.languageName": "English (UK)", "i18n.languageNameEnglish": "English (UK)", "i18n.category": "main", - "i18n.authors": "Core, inalone, nosh118", + "i18n.authors": "Core, inalone, nosh118, booploops", "date.format": "${d} ${m}, ${y}", "term.equalizer": "Equaliser", "settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalisation, Equalisers and Visualisers - however on some systems this may cause stuttering in audio tracks.", @@ -14,5 +14,14 @@ "term.track": { "one" : "song", "other" : "songs" - } + }, + "home.syncFavorites": "Sync Favourites", + "home.syncFavorites.gettingArtists": "Getting Favourited Artists...", + "action.addToFavorites": "Add to Favourites", + "action.favorite": "Favourite", + "action.removeFavorite": "Remove Favourite", + "settings.option.visual.customAccentColor": "Custom Accent Colour", + "settings.option.visual.accentColor": "Accent Colour", + "settings.option.visual.windowColor": "Window Tint Colour", + "settings.header.visual.windowBackgroundStyle.color": "Colour Tint" } diff --git a/src/i18n/en_US.json b/src/i18n/en_US.json index 692e86c2..33831002 100644 --- a/src/i18n/en_US.json +++ b/src/i18n/en_US.json @@ -22,7 +22,6 @@ "term.logout": "Logout", "term.login": "Log In", "term.quickNav": "Quick Nav", - "term.cast": "Cast", "term.about": "About", "term.privateSession": "Private Session", "term.disablePrivateSession": "Disable Private Session", @@ -52,6 +51,7 @@ "term.navigateBack": "Navigate back", "term.navigateForward": "Navigate forward", "term.play": "Play", + "term.playpause": "Play/Pause", "term.pause": "Pause", "term.stop": "Stop", "term.previous": "Previous", @@ -134,6 +134,7 @@ "term.recentStations": "Recent Stations", "term.personalStations": "Personal Stations", "term.amLive": "Apple Music Live", + "term.live": "LIVE", "term.language": "Language", "term.funLanguages": "Fun", "term.noLyrics": "Loading... / Lyrics not found./ Instrumental.", @@ -154,6 +155,7 @@ }, "term.videos": "Videos", "term.menu": "Menu", + "term.themeManaged": "Managed by a theme", "term.check": "Check", "term.aboutArtist": "About {{artistName}}", "term.topResult": "Top Result", @@ -193,6 +195,16 @@ "term.confirmLogout": "Are you sure you want to logout?", "term.creditDesignedBy": "Designed by ${authorUsername}", "term.discNumber": "Disc ${discNumber}", + "term.reload" : "Reload Cider ?", + "term.toggleprivate" : "Toggle Private Session", + "term.webremote" : "Web Remote", + "term.cast" : "Cast", + "term.cast2" : "Cast to Devices", + "term.quit" : "Quit", + "term.zoomin" : "Zoom In", + "term.zoomout" : "Zoom Out", + "term.zoomreset" : "Reset Zoom", + "term.fullscreen" : "Fullscreen", "home.syncFavorites": "Sync Favorites", "home.syncFavorites.gettingArtists": "Getting Favorited Artists...", "home.title": "Home", @@ -269,11 +281,7 @@ "action.export": "Export", "action.showAlbum": "Show Complete Album", "action.tray.minimize": "Minimize to Tray", - "action.tray.quit": "Quit", "action.tray.show": "Show Cider", - "action.tray.playpause": "Play/Pause", - "action.tray.next": "Next", - "action.tray.previous": "Previous", "action.tray.listento": "Listen To:", "action.update": "Update", "action.install": "Install", @@ -293,45 +301,27 @@ "action.createNew": "Create New...", "action.openArtworkInBrowser": "Open artwork in browser", "action.scrollToTop": "Scroll to top", - "menubar.options.about": "About", - "menubar.options.settings": "Settings", - "menubar.options.quit": "Quit Cider", - "menubar.options.view": "View ", + "action.refresh": "Refresh", + "menubar.options.view": "View", "menubar.options.reload": "Reload", "menubar.options.forcereload": "Force Reload", "menubar.options.toggledevtools": "Toggle Developer Tools", "menubar.options.window": "Window", "menubar.options.minimize": "Minimize", - "menubar.options.toggleprivate": "Toggle Private Session", - "menubar.options.webremote": "Web Remote", - "menubar.options.audio": "Audio Settings", "menubar.options.plugins": "Plu-gins Menu", "menubar.options.controls": "Controls", - "menubar.options.next": "Next", - "menubar.options.playpause": "Play/Pause", - "menubar.options.previous": "Previous", "menubar.options.volumeup": "Volume Up", "menubar.options.volumedown": "Volume Down", - "menubar.options.browse": "Browse", - "menubar.options.artists": "Artists", - "menubar.options.search": "Search", - "menubar.options.albums": "Albums", - "menubar.options.cast": "Cast To Devices", "menubar.options.account": "Account", - "menubar.options.accountsettings": "Account Settings", "menubar.options.signout": "Sign Out", "menubar.options.support": "Support", - "menubar.options.discord": "Discord", - "menubar.options.github": "GitHub Wiki", "menubar.options.report": "Report a...", "menubar.options.bug": "Bug", "menubar.options.feature": "Feature Request", "menubar.options.trans": "Translation Report/Request", "menubar.options.license": "View License", "menubar.options.conf": "Open Configuration File in Editor", - "menubar.options.listennow": "Listen Now", - "menubar.options.recentlyAdded": "Recently Added", - "menubar.options.songs": "Songs", + "menubar.options.zoom": "Zoom", "settings.header.general": "General", "settings.header.general.description": "Adjust the general settings for Cider.", "settings.option.general.language": "Language", @@ -351,11 +341,15 @@ "settings.option.general.customizeSidebar": "Customize Sidebar Items", "settings.option.general.customizeSidebar.customize": "Customize", "settings.option.general.keybindings": "Keybindings", + "settings.option.general.keybindings.library": "Library", + "settings.option.general.keybindings.session": "Session", + "settings.option.general.keybindings.control": "Controls", + "settings.option.general.keybindings.interface": "Interface", + "settings.option.general.keybindings.advanced": "Advanced", "settings.option.general.keybindings.pressCombination": "Press a combination of two keys to update keybind.", "settings.option.general.keybindings.pressEscape": "Press Escape key to go back.", "settings.notyf.general.keybindings.update.success": "Keybind updated successfully", "settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider", - "settings.option.general.keybindings.open": "Open", "settings.option.general.themeUpdateNotification": "Automatically check for theme updates", "settings.option.general.showLovedTracksInline": "Show loved tracks inline", "settings.description.search": "Search", diff --git a/src/i18n/es_ES.json b/src/i18n/es_ES.json index 68a1f802..47a72deb 100644 --- a/src/i18n/es_ES.json +++ b/src/i18n/es_ES.json @@ -22,7 +22,6 @@ "term.logout": "Cerrar Sesión", "term.login": "Iniciar Sesión", "term.quickNav": "Navegación rápida", - "term.cast": "Transmitir", "term.about": "Acerca de", "term.privateSession": "Sesión Privada", "term.disablePrivateSession": "Deshabilitar Sesión Privada", @@ -42,6 +41,7 @@ "term.artists": "Artistas", "term.podcasts": "Podcasts", "term.playlists": "Listas de Reproducción", + "term.charts": "Charts", "term.playlist": "Lista de Reproducción", "term.newPlaylist": "Nueva Lista de Reproducción", "term.newPlaylistFolder": "Nueva Carpeta de Listas de Reproducción", @@ -51,7 +51,9 @@ "term.navigateBack": "Navegar Hacia Atrás", "term.navigateForward": "Navegar Hacia Adelante", "term.play": "Reproducir", + "term.playpause": "Reproducir/Pausar", "term.pause": "Pausar", + "term.stop": "Detener", "term.previous": "Anterior", "term.next": "Siguiente", "term.shuffle": "Aleatorio", @@ -124,12 +126,15 @@ "one": "Segundo", "other": "Segundos" }, - "term.fullscreenView": "Vista de Pantalla Completa", + "term.fullscreenView": "Pantalla Completa", "term.defaultView": "Vista Predeterminada", "term.audioSettings": "Configuración de Audio", "term.audioControls": "Configuración volumen", "term.clearAll": "Borrar todo", "term.recentStations": "Estaciones Recientes", + "term.personalStations": "Estaciones Personales", + "term.amLive": "Apple Music Live", + "term.live": "LIVE", "term.language": "Idioma", "term.funLanguages": "Idiomas Fun (Parodias)", "term.noLyrics": "Cargando... / Letras no encontradas./ Instrumental.", @@ -150,6 +155,7 @@ }, "term.videos": "Videos", "term.menu": "Menú", + "term.themeManaged": "Administrado por un tema", "term.check": "Comprobar", "term.aboutArtist": "Acerca de {{artistName}}", "term.topResult": "Mejor Resultado", @@ -189,6 +195,18 @@ "term.confirmLogout": "¿Estás seguro de que quieres cerrar sesión?", "term.creditDesignedBy": "Diseñado por ${authorUsername}", "term.discNumber": "Disco ${discNumber}", + "term.reload" : "¿ Recargar Cider ?", + "term.toggleprivate" : "Cambiar 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", + "home.syncFavorites": "Sincronizar Favoritos", + "home.syncFavorites.gettingArtists": "Consiguiendo Artistas Favoritos...", "home.title": "Principal", "home.recentlyPlayed": "Escuchado Recientemente", "home.recentlyAdded": "Agregado Recientemente", @@ -209,9 +227,17 @@ "podcast.episodes": "Episodios", "podcast.playEpisode": "Reproducir Episodio", "podcast.website": "Sitio web de Podcasts", + "action.favorite": "Favorito", + "action.removeFavorite": "Eliminar Favorito", + "action.hideLibrary": "Ocultar biblioteca", + "action.showLibrary": "Mostrar biblioteca", + "action.cut": "Cortar", + "action.paste": "Pegar", + "action.selectAll": "Seleccionar Todo", + "action.delete": "Borrar", "action.edit": "Editar", "action.done": "Hecho", - "action.editTracklist": "Edit Tracklist", + "action.editTracklist": "Editar Lista de Canciones", "action.addToLibrary": "Agregar a la Biblioteca", "action.addToLibrary.success": "Agregado a la Biblioteca", "action.addToLibrary.error": "Error al agregar a la Biblioteca", @@ -255,8 +281,8 @@ "action.export": "Exportar", "action.showAlbum": "Mostrar Álbum Completo", "action.tray.minimize": "Minimizar a la bandeja", - "action.tray.quit": "Salir", "action.tray.show": "Mostrar Cider", + "action.tray.listento": "Escuchando a:", "action.update": "Actualizar", "action.install": "Instalar", "action.copy": "Copiar", @@ -275,45 +301,26 @@ "action.createNew": "Crear Nuevo...", "action.openArtworkInBrowser": "Abrir Ilustración en el navegador", "action.scrollToTop": "Ir al inicio", - "menubar.options.about": "Acerca de", - "menubar.options.settings": "Ajustes", - "menubar.options.quit": "Salir", "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.toggleprivate": "Cambiar Sesión Privada", - "menubar.options.webremote": "Web Remoto", - "menubar.options.audio": "Configuraciones de Audio", - "menubar.options.plugins": "Menu de Plu-gins", + "menubar.options.plugins": "Menú de Plug-ins", "menubar.options.controls": "Controles", - "menubar.options.next": "Siguiente", - "menubar.options.playpause": "Reproducir/Pausar", - "menubar.options.previous": "Anterior", "menubar.options.volumeup": "Subir Volumen", "menubar.options.volumedown": "Bajar Volumen", - "menubar.options.browse": "Explorar", - "menubar.options.artists": "Artistas", - "menubar.options.search": "Buscar", - "menubar.options.albums": "Álbumes", - "menubar.options.cast": "Transmitir a Dispositivos", "menubar.options.account": "Cuenta", - "menubar.options.accountsettings": "Ajustes de Cuenta", "menubar.options.signout": "Cerrar Sesión", "menubar.options.support": "Soporte", - "menubar.options.discord": "Discord", - "menubar.options.github": "GitHub Wiki", "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.listennow": "Escuchar Ahora", - "menubar.options.recentlyAdded": "Agregadas Recientemente", - "menubar.options.songs": "Canciones", + "menubar.options.zoom": "Zoom", "settings.header.general": "General", "settings.header.general.description": "Ajuste la configuración general de Cider.", "settings.option.general.language": "Idioma", @@ -333,11 +340,17 @@ "settings.option.general.customizeSidebar": "Personalizar elementos de la barra lateral", "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.keybindings.open": "Abrir", + "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", @@ -356,8 +369,9 @@ "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.header.audio": "Audio", - "settings.header.audio.description": "Ajuste la Configuración de Audio para Cider.", - "settings.option.audio.volumeStep": "Paso de Volumen", + "settings.header.audio.description": "Ajuste la configuración de audio para Cider.", + "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.changePlaybackRate": "Cambiar la Velocidad de Reproducción", "settings.option.audio.playbackRate": "Velocidad de Reproducción", @@ -390,38 +404,58 @@ "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": "Natural (Estándar)", - "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Natural (Plus)", + "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.Z8500B": "Clafoutis de Cerezas", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Leche Creme Brûlée de Azúcar Morena", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Abrazo de Calidez", "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.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.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.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.tunedAudioSpatialization": "Espacialización Sintonizada 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": "Espacialización ajustada de Cider", + "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.description": "Cambia el Perfil de Ajuste de Espacialización.", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Estándar", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Cambia el Perfil de Ajuste de la Espacialización.", + "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.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "La Espacialización no es compatible con CAP. Deshabilite CAP para continuar.", - "settings.option.audio.dbspl.display": "Visualización dB SPL", - "settings.option.audio.dbspl.description": "(Solo usuarios avanzados) Muestra 'dB SPL' en lugar de 'dBFS' en el control deslizante de volumen.", + "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.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 'dB SPL con Ponderación-Z' cuando Cider esté en 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.description": "Ajuste la configuración visual de Cider.", "settings.option.visual.windowStyle": "Estilo de Ventana", + "settings.option.visual.customAccentColor": "Color de Acento Personalizado", + "settings.option.visual.accentColor": "Color de Acento", + "settings.option.visual.purplePodcastPlaybackBar": "Barra de Reproducción Púrpura para Podcasts", + "settings.option.visual.windowColor": "Color de Tinte de Ventana", "settings.option.visual.windowBackgroundStyle": "Estilo de Fondo de Ventana", "settings.header.visual.windowBackgroundStyle.none": "Ninguno", "settings.header.visual.windowBackgroundStyle.artwork": "ilustración", "settings.header.visual.windowBackgroundStyle.image": "Imagen", + "settings.header.visual.windowBackgroundStyle.color": "Tinte de Color", "settings.option.visual.animatedArtwork": "Ilustración Animada", "settings.header.visual.animatedArtwork.always": "Siempre", "settings.header.visual.animatedArtwork.limited": "Limitado a páginas y entradas especiales", @@ -491,6 +525,8 @@ "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.delay": "Last.fm Retraso de Scrobble (%)", "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activar Last.fm Now Playing", diff --git a/src/i18n/hu_HU.json b/src/i18n/hu_HU.json index c38d44ab..a2dabd7a 100644 --- a/src/i18n/hu_HU.json +++ b/src/i18n/hu_HU.json @@ -154,6 +154,7 @@ }, "term.videos": "Videók", "term.menu": "Menü", + "term.themeManaged": "Egy téma kezeli a beállítást", "term.check": "Ellenőrzés", "term.aboutArtist": "{{artistName}}-ról/ről", "term.topResult": "Legjobb találatok", @@ -250,7 +251,7 @@ "action.goToAlbum": "Album megjelenítése", "action.showInPlaylist": "Lejátszási lista megjelenítése", "action.showInAppleMusic": "Megjelenítés az Apple Musicban", - "action.moveToTop": "Mozgatás legfelülre", + "action.moveToTop": "Kivétel a mappákból", "action.share": "Megosztás", "action.rename": "Átnevezés", "action.love": "Szeretem", diff --git a/src/i18n/pt_PT.json b/src/i18n/pt_PT.json index 5cac376a..b499d775 100644 --- a/src/i18n/pt_PT.json +++ b/src/i18n/pt_PT.json @@ -1,584 +1,588 @@ { - "i18n.languageName": "Português (Portugal)", - "i18n.languageNameEnglish": "Portuguese (Portugal)", - "i18n.category": "main", - "i18n.authors": "@pgalhardo", - "app.name": "Cider", - "date.format": "${m} ${d}, ${y}", - "dialog.cancel": "Cancelar", - "dialog.ok": "OK", - "notification.updatingLibrarySongs": "A atualizar biblioteca de músicas...", - "notification.updatingLibraryAlbums": "A atualizar biblioteca de álbuns...", - "notification.updatingLibraryArtists": "A atualizar biblioteca de artistas...", - "term.variables": "Variáveis", - "term.appleInc": "Apple Inc.", - "term.appleMusic": "Apple Music", - "term.applePodcasts": "Apple Podcasts", - "term.itunes": "iTunes", - "term.github": "GitHub", - "term.discord": "Discord", - "term.learnMore": "Saiba mais", - "term.accountSettings": "Definições da conta", - "term.logout": "Terminar sessão", - "term.login": "Iniciar sessão", - "term.quickNav": "Navegação rápida", - "term.cast": "Transmitir", - "term.about": "Sobre", - "term.privateSession": "Sessão privada", - "term.disablePrivateSession": "Desativar sessão privada", - "term.queue": "Fila", - "term.autoplay": "Reprodução automática", - "term.lyrics": "Letra", - "term.miniplayer": "Mini-leitor", - "term.history": "Histórico", - "term.search": "Pesquisa", - "term.library": "Biblioteca", - "term.listenNow": "Ouvir agora", - "term.browse": "Explorar", - "term.radio": "Rádio", - "term.recentlyAdded": "Adições recentes", - "term.songs": "Músicas", - "term.albums": "Álbuns", - "term.artists": "Intérpretes", - "term.podcasts": "Podcasts", - "term.playlists": "Listas de reprodução", - "term.charts": "Gráficos", - "term.playlist": "Lista de reprodução", - "term.newPlaylist": "Nova lista de reprodução", - "term.newPlaylistFolder": "Nova pasta de listas de reprodução", - "term.createNewPlaylist": "Criar nova lista de reprodução", - "term.createNewPlaylistFolder": "Criar nova pasta de listas de reprodução", - "term.deletePlaylist": "Tem a certeza de que pretende apagar esta lista de reprodução?", - "term.navigateBack": "Retroceder uma página", - "term.navigateForward": "Avançar uma página", - "term.play": "Reproduzir", - "term.pause": "Pausa", - "term.stop": "Parar", - "term.previous": "Anterior", - "term.next": "Seguinte", - "term.shuffle": "Modo aleatório", - "term.enableShuffle": "Ativar modo aleatório", - "term.disableShuffle": "Desativar modo aleatório", - "term.repeat": "Repetir", - "term.enableRepeatOne": "Ativar repetir uma", - "term.disableRepeatOne": "Desativar repetir uma", - "term.disableRepeat": "Não repetir", - "term.volume": "Volume", - "term.mute": "Mudo", - "term.unmute": "Com som", - "term.share": "Partilhar", - "term.share.success": "Copiado para a área de transferência", - "term.settings": "Definições", - "term.seeAll": "Ver tudo", - "term.sortBy": "Ordenar por", - "term.sortBy.album": "Álbum", - "term.sortBy.artist": "Intérprete", - "term.sortBy.name": "Nome", - "term.sortBy.genre": "Género", - "term.sortBy.releaseDate": "Data de lançamento", - "term.sortBy.duration": "Duração", - "term.sortBy.dateAdded": "Data de adição", - "term.sortOrder": "A-Z", - "term.sortOrder.ascending": "Ascendente", - "term.sortOrder.descending": "Descendente", - "term.viewAs": "Ver como", - "term.viewAs.coverArt": "Grafismos", - "term.viewAs.list": "Lista", - "term.dynamic": "Dinâmico", - "term.size": "Tamanho", - "term.size.normal": "Normal", - "term.size.compact": "Compacto", - "term.enable": "Ativar", - "term.disable": "Desativar", - "term.enabled": "Ativado", - "term.disabled": "Desativado", - "term.connect": "Ligar", - "term.connecting": "A ligar", - "term.disconnect": "Desligar", - "term.authed": "Autenticado", - "term.confirm": "Confirmar?", - "term.more": "Mais", - "term.less": "Menos", - "term.showMore": "Mostrar mais", - "term.showLess": "Mostrar menos", - "term.topSongs": "Músicas populares", - "term.latestReleases": "Últimos lançamentos", - "term.time.added": "Adicionado", - "term.time.released": "Lançado", - "term.time.updated": "Atualizado", - "term.time.days": "dias", - "term.time.day": { - "one": "dia", - "other": "dias" - }, - "term.time.hours": "horas", - "term.time.hour": { - "one": "hora", - "other": "horas" - }, - "term.time.minutes": "minutos", - "term.time.minute": { - "one": "minuto", - "other": "minutos" - }, - "term.time.seconds": "segundos", - "term.time.second": { - "one": "segundo", - "other": "segundos" - }, - "term.fullscreenView": "Vista de ecrã inteiro", - "term.defaultView": "Vista normal", - "term.audioSettings": "Definições de áudio", - "term.audioControls": "Controlos de volume", - "term.clearAll": "Limpar tudo", - "term.recentStations": "Estações recentes", - "term.personalStations": "Estações pessoais", - "term.amLive": "Apple Music Live", - "term.language": "Idioma", - "term.funLanguages": "Divertido", - "term.noLyrics": "A carregar... / Letra não encontrada. / Instrumental.", - "term.copyright": "Copyright", - "term.rightsReserved": "Todos os direitos reservados.", - "term.sponsor": "Patrocine este projecto", - "term.ciderTeam": "Equipa do Cider", - "term.developer": "Programador", - "term.socialTeam": "Equipa social", - "term.socials": "Redes sociais", - "term.contributors": "Contribuidores", - "term.equalizer": "Equalizador", - "term.reset": "Repor", - "term.tracks": "músicas", - "term.track": { - "one": "música", - "other": "músicas" - }, - "term.videos": "Vídeos", - "term.menu": "Menu", - "term.check": "Verificar", - "term.aboutArtist": "Sobre {{artistName}}", - "term.topResult": "Melhor resultado", - "term.sharedPlaylists": "Listas de reprodução partilhadas", - "term.people": "Pessoas", - "term.newpreset.name": "Nome da nova predefinição do EQ", - "term.addedpreset": "Predefinição adicionada", - "term.deletepreset.warn": "Tem a certeza de que pretende apagar esta predefinição?", - "term.deletedpreset": "Predefinição eliminada", - "term.defaultPresets": "Predefinições por omissão", - "term.userPresets": "Predefinições do utilizador", - "term.requestError": "Ocorreu um problema ao processar o pedido.", - "term.song.link.generate": "A obter o URL de partilha song.link...", - "term.musicVideos": "Videoclipes", - "term.stations": "Estações", - "term.curators": "Curadores", - "term.appleCurators": "Curadores da Apple", - "term.radioShows": "Programas de rádio", - "term.recordLabels": "Gravadoras", - "term.videoExtras": "Vídeos extra", - "term.top": "Top", - "term.version": "Versão", - "term.noVideos": "Não foram encontrados vídeos.", - "term.plugin": "Plug-in", - "term.pluginMenu": "Menu de plug-ins", - "term.pluginMenu.none": "Sem plug-ins interactivos", - "term.replay": "Repetir", - "term.uniqueAlbums": "Álbuns únicos", - "term.uniqueArtists": "Intérpretes únicos", - "term.uniqueSongs": "Músicas únicas", - "term.topArtists": "Intérpretes populares", - "term.listenedTo": "Reproduzido:", - "term.times": "vezes", - "term.topAlbums": "Álbuns populares", - "term.plays": "Reproduções", - "term.topGenres": "Géneros populares", - "term.confirmLogout": "Tem a certeza de que pretende terminar sessão?", - "term.creditDesignedBy": "Concebido por ${authorUsername}", - "term.discNumber": "Disco ${discNumber}", - "home.title": "Início", - "home.recentlyPlayed": "Reproduzido recentemente", - "home.recentlyAdded": "Adicionado recentemente", - "home.artistsFeed": "Feed dos seus artistas", - "home.artistsFeed.noArtist": "Siga alguns artistas para ver os seus últimos lançamentos", - "home.madeForYou": "Feito para si", - "home.friendsListeningTo": "O que os seus amigos estão a ouvir", - "home.followedArtists": "Artistas seguidos", - "error.appleMusicSubRequired": "A Apple Music requer uma subscrição.", - "error.connectionError": "Ocorreu um problema ao estabelecer ligação à Apple Music.", - "error.noResults": "Sem resultados.", - "error.noResults.description": "Tente uma nova pesquisa.", - "podcast.followOnCider": "Siga no Cider", - "podcast.followedOnCider": "A seguir no Cider", - "podcast.subscribeOnItunes": "Subscreva no iTunes", - "podcast.subscribedOnItunes": "Subscrito no iTunes", - "podcast.itunesStore": "iTunes Store", - "podcast.episodes": "Episódios", - "podcast.playEpisode": "Reproduzir episódio", - "podcast.website": "Website do Podcast", - "action.hideLibrary": "Ocultar biblioteca", - "action.showLibrary": "Mostrar biblioteca", - "action.cut": "Cortar", - "action.paste": "Colar", - "action.selectAll": "Seleccionar tudo", - "action.delete": "Apagar", - "action.edit": "Editar", - "action.done": "Concluído", - "action.editTracklist": "Editar lista de reprodução", - "action.addToLibrary": "Adicionar à biblioteca", - "action.addToLibrary.success": "Adicionado à biblioteca", - "action.addToLibrary.error": "Erro ao adicionar à biblioteca", - "action.removeFromLibrary": "Remover da biblioteca", - "action.removeFromLibrary.success": "Removido da biblioteca", - "action.addToQueue": "Adicionar à fila", - "action.addToQueue.success": "Adicionado à fila", - "action.addToQueue.error": "Erro ao adicionar à fila", - "action.removeFromQueue": "Remover da fila", - "action.removeFromQueue.success": "Removido da fila", - "action.removeFromQueue.error": "Erro ao remover da fila", - "action.createPlaylist": "Criar uma nova lista de reprodução", - "action.addToPlaylist": "Adicionar à lista de reprodução", - "action.removeFromPlaylist": "Removar da lista de reprodução", - "action.addToFavorites": "Adicionar aos favoritos", - "action.follow": "Seguir", - "action.follow.success": "Seguido", - "action.follow.error": "Erro ao seguir", - "action.unfollow": "Não seguir", - "action.unfollow.success": "Não seguido", - "action.unfollow.error": "Erro ao deixar de seguir", - "action.playNext": "Reproduzir a seguir", - "action.playLater": "Reproduzir mais tarde", - "action.startRadio": "Criar estação", - "action.goToArtist": "Ir para intérprete", - "action.goToAlbum": "Ir para álbum", - "action.showInPlaylist": "Mostrar na lista de reprodução", - "action.showInAppleMusic": "Mostrar na Apple Music", - "action.moveToTop": "Mover para fora da pasta", - "action.share": "Partilhar", - "action.rename": "Renomear", - "action.love": "Gostar", - "action.unlove": "Desfazer gostar", - "action.dislike": "Não gostar", - "action.undoDislike": "Desfazer não gostar", - "action.showWebRemoteQR": "Web Remote", - "action.playTracksNext": "Reproduzir ${app.selectedMediaItems.length} músicas a seguir", - "action.playTracksLater": "Reproduzir ${app.selectedMediaItems.length} músicas mais tarde", - "action.removeTracks": "Remover ${self.selectedItems.length} músicas da fila", - "action.import": "Importar", - "action.export": "Exportar", - "action.showAlbum": "Mostrar álbum completo", - "action.tray.minimize": "Minimizar para a bandeja", - "action.tray.quit": "Fechar", - "action.tray.show": "Mostrar o Cider", - "action.tray.playpause": "Reproduzir/Pausa", - "action.tray.next": "Seguinte", - "action.tray.previous": "Anterior", - "action.tray.listento": "Ouvir:", - "action.update": "Atualizar", - "action.install": "Instalar", - "action.copy": "Copiar", - "action.newpreset": "Nova predefinição...", - "action.deletepreset": "Eliminar predefinição", - "action.open": "Abrir", - "action.close": "Fechar", - "action.relaunch.confirm": "Pretende reiniciar o Cider?", - "action.cast.chromecast": "Chromecast", - "action.cast.todevices": "Transmitir para dispositivos", - "action.cast.stop": "Parar a transmissão para todos os dispositivos", - "action.cast.airplay": "AirPlay", - "action.cast.airplay.underdevelopment": "AirPlay ainda está em desenvolvimento", - "action.cast.scan": "Procurar", - "action.cast.scanning": "A procurar...", - "action.createNew": "Criar nova...", - "action.openArtworkInBrowser": "Abrir grafismo no navegador", - "action.scrollToTop": "Voltar ao topo", - "menubar.options.about": "Sobre", - "menubar.options.settings": "Definições", - "menubar.options.quit": "Fechar o Cider", - "menubar.options.view": "Ver", - "menubar.options.reload": "Atualizar", - "menubar.options.forcereload": "Forçar atualização", - "menubar.options.toggledevtools": "Alternar ferramentas do programador", - "menubar.options.window": "Janela", - "menubar.options.minimize": "Minimizar", - "menubar.options.toggleprivate": "Alternar sessão privada", - "menubar.options.webremote": "Web Remote", - "menubar.options.audio": "Definições de áudio", - "menubar.options.plugins": "Menu de plug-ins", - "menubar.options.controls": "Controlos", - "menubar.options.next": "Seguinte", - "menubar.options.playpause": "Reproduzir/Pausa", - "menubar.options.previous": "Anterior", - "menubar.options.volumeup": "Aumentar o volume", - "menubar.options.volumedown": "Diminuir o volume", - "menubar.options.browse": "Explorar", - "menubar.options.artists": "Intérpretes", - "menubar.options.search": "Pesquisa", - "menubar.options.albums": "Álbuns", - "menubar.options.cast": "Transmitir para dispositivos", - "menubar.options.account": "Conta", - "menubar.options.accountsettings": "Definições da conta", - "menubar.options.signout": "Terminar sessão", - "menubar.options.support": "Suporte", - "menubar.options.discord": "Discord", - "menubar.options.github": "GitHub Wiki", - "menubar.options.report": "Reportar um...", - "menubar.options.bug": "Problema", - "menubar.options.feature": "Pedido de funcionalidade", - "menubar.options.trans": "Pedido de tradução", - "menubar.options.license": "Ver licença", - "menubar.options.conf": "Abrir ficheiro de configuração no editor", - "menubar.options.listennow": "Ouvir agora", - "menubar.options.recentlyAdded": "Adições recentes", - "menubar.options.songs": "Músicas", - "settings.header.general": "Geral", - "settings.header.general.description": "Ajustar as definições gerais do Cider.", - "settings.option.general.language": "Idioma", - "settings.option.general.resumebehavior": "Comportamento de retoma", - "settings.option.general.resumebehavior.description": "Define a forma como o Cider irá retomar a sua sessão quando regressar à aplicação.", - "settings.option.general.resumebehavior.locally": "Localmente", - "settings.option.general.resumebehavior.locally.description": "O Cider irá retomar a sua última sessão nesta máquina.", - "settings.option.general.resumebehavior.history": "Histórico", - "settings.option.general.resumebehavior.history.description": "O Cider irá colocar na fila a última música do seu histórico da Apple Music, através de todos os seus dispositivos.", - "settings.option.general.resumetabs": "Abrir separador no arranque", - "settings.option.general.resumetabs.description": "Pode escolher que separador quer abrir quando abre o Cider.", - "settings.option.general.resumetabs.dynamic": "Dinâmico", - "settings.option.general.resumetabs.dynamic.description": "O Cider abrirá o separador que utilizou pela última vez.", - "settings.option.general.language.main": "Idiomas", - "settings.option.general.language.fun": "Idiomas divertidos", - "settings.option.general.language.unsorted": "Indiferenciado", - "settings.option.general.customizeSidebar": "Personalizar os itens da barra lateral", - "settings.option.general.customizeSidebar.customize": "Personalizar", - "settings.option.general.keybindings": "Atalhos do teclado", - "settings.option.general.keybindings.pressCombination": "Prima uma combinação de duas teclas para atualizar o atalho.", - "settings.option.general.keybindings.pressEscape": "Prima a tecla Escape para voltar atrás.", - "settings.notyf.general.keybindings.update.success": "Atalho atualizado com sucesso", - "settings.prompt.general.keybindings.update.success": "Atalho atualizado com sucesso. Prima OK para reiniciar o Cider", - "settings.option.general.keybindings.open": "Abrir", - "settings.option.general.themeUpdateNotification": "Verificação automática de atualizações de temas", - "settings.option.general.showLovedTracksInline": "Mostrar músicas que gosta \"inline\"", - "settings.description.search": "Pesquisa", - "settings.description.albums": "Álbuns da biblioteca", - "settings.description.artists": "Intérpretes da biblioteca", - "settings.description.browse": "Explorar", - "settings.description.private": "Alternar sessão privada", - "settings.description.remote": "Web Remote", - "settings.description.audio": "Definições de áudio", - "settings.description.plugins": "Menu de plug-ins", - "settings.description.cast": "Transmitir para dispositivos", - "settings.description.settings": "Definições", - "settings.description.developer": "Ferramentas do programador", - "settings.description.listnow": "Ouvir agora", - "settings.description.recentAdd": "Adições recentes", - "settings.description.songs": "Músicas", - "settings.notyf.updateCider.update-not-available": "Nenhuma atualização disponível", - "settings.notyf.updateCider.update-downloaded": "A atualização foi descarregada, reinicie para aplicar", - "settings.notyf.updateCider.update-timeout": "O pedido de atualização estou o tempo limite", - "settings.header.audio": "Áudio", - "settings.header.audio.description": "Ajustar as definições de áudio para o Cider.", - "settings.option.audio.volumeStep": "Nível de incremento de volume", - "settings.option.audio.advanced": "Controlo avançado de volume", - "settings.option.audio.maxVolume": "Volume máximo", - "settings.option.audio.changePlaybackRate": "Alterar velocidade de reprodução", - "settings.option.audio.playbackRate": "Velocidade de reprodução", - "settings.option.audio.playbackRate.change": "Alterar", - "settings.option.audio.quality": "Qualidade do áudio", - "settings.header.audio.quality.hireslossless": "Alta resolução sem perdas", - "settings.header.audio.quality.hireslossless.description": "até 24-bit/192 kHz", - "settings.header.audio.quality.lossless": "Sem perdas", - "settings.header.audio.quality.lossless.description": "até 24-bit/48 kHz", - "settings.header.audio.quality.high": "Alta", - "settings.header.audio.quality.high.description": "256 kbps", - "settings.header.audio.quality.standard": "Padrão", - "settings.header.audio.quality.standard.description": "64 kbps", - "settings.option.audio.seamlessTransition": "Transição gradual do áudio", - "settings.option.audio.enableAdvancedFunctionality": "Ativar funcionalidades avançadas", - "settings.option.audio.enableAdvancedFunctionality.description": "Ativar o AudioContext dá acesso a funcionalidades alargadas como Normalização de Áudio, Equalizadores e Visualizadores - contudo, isto pode causar dificuldades em alguns sistemas.", - "settings.warn.audio.enableAdvancedFunctionality.lowcores": "O Cider pensa que o seu PC não é capaz de lidar com estas funcionalidades. Tem a certeza de que pretende continuar?", - "settings.option.audio.audioLab": "Cider Audio Lab", - "settings.option.audio.audioLab.description": "Efeitos de áudio desenvolvidos internamente para o Cider.", - "settings.option.audio.audioLab.subheader": "Designed by Cider Acoustic Technologies in California", - "settings.warn.audioLab.withoutAF": "AudioContext (funcionalidade avançada) é necessário para suportar o Cider Audio Lab.", - "settings.warn.enableAdvancedFunctionality": "AudioContext (funcionalidade avançada) é necessário para suportar esta funcionalidade.", - "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calor Analógico", - "settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula o calor analógico inspirado no Korg Nutube 6P1", - "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidade do calor analógico", - "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Altera a intensidade do processamento do módulo de calor analógico.", - "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Suave", - "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Quente", - "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™️", - "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Cria uma atmosfera musical diferente inspirada nas mais modernas aparelhagens.", - "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Modo do Cider Atmosphere Realizer™️", - "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Altera o modo de funcionamento do módulo 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.Z8500": "Moonlight Softcake", - "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Brown Sugar Creme Brûlée Milk", - "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Cuddle Warmth", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Melhora a qualidade de áudio percecionada do áudio codificado em AAC, utilizando um algoritmo de tempo real que tira partido tanto dos modelos psicoacústicos da audição humana como das características de codificação do AAC.", - "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "O CAP não é compatível com a espacialização. Por favor, desative a espacialização para continuar.", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Intensidade do CAP", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Muda a intensidade do processamento feito ao áudio (a agressividade pode produzir resultados indesejáveis).", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Padrão", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptativo", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Antigo", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agressivo", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalização de áudio", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza o volume de pico das músicas para criar uma experiência de audição mais uniforme (não funciona em músicas carregadas pelo utilizador).", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Gerido pelo Audio Lab", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Espacialização ajustada pelo Cider", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efeito de espacialização pré-ajustado, desactiva as configurações personalizáveis de espacialização de áudio.", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Perfil de espacialização do Cider", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Altera o perfil de ajuste da espacialização.", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Padrão", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Palco", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separação", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Mínimo", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiófilo", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Difundido", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore", - "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Encore expandido", - "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "A espacialização não é compatível com o CAP. Por favor, desative o CAP para continuar.", - "settings.option.audio.dbspl.display": "Mostrar dB SPL", - "settings.option.audio.dbspl.description": "(Apenas para utilizadores avançados) Mostrar dB SPL em vez de dBFS no controlo de volume.", - "settings.option.audio.dbfs.calibration": "Calibração de 0 dBFS", - "settings.option.audio.dbfs.description": "Introduza o pico de SPL com ponderação Z quando o Cider está a 0 dBFS.", - "settings.header.visual": "Aparência", - "settings.header.visual.description": "Ajustar as definições visuais do Cider.", - "settings.option.visual.windowStyle": "Estilo da janela", - "settings.option.visual.windowBackgroundStyle": "Estilo do fundo da janela", - "settings.header.visual.windowBackgroundStyle.none": "Nenhum", - "settings.header.visual.windowBackgroundStyle.artwork": "Grafismo", - "settings.header.visual.windowBackgroundStyle.image": "Imagem", - "settings.option.visual.animatedArtwork": "Grafismo animado", - "settings.header.visual.animatedArtwork.always": "Sempre", - "settings.header.visual.animatedArtwork.limited": "Limitado a páginas e entradas especiais", - "settings.header.visual.animatedArtwork.disable": "Desativar em todo o lado", - "settings.option.visual.animatedArtworkQuality": "Qualidade dos grafismos animados", - "settings.header.visual.animatedArtworkQuality.low": "Baixa", - "settings.header.visual.animatedArtworkQuality.medium": "Média", - "settings.header.visual.animatedArtworkQuality.high": "Alta", - "settings.header.visual.animatedArtworkQuality.veryHigh": "Muito alta", - "settings.header.visual.animatedArtworkQuality.extreme": "Extrema", - "settings.option.visual.animatedWindowBackground": "Fundo da janela animado", - "settings.option.visual.hardwareAcceleration": "Aceleração de hardware", - "settings.option.visual.hardwareAcceleration.description": "Requer reinício", - "settings.header.visual.hardwareAcceleration.default": "Padrão", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", - "settings.option.visual.uiscale": "Escala da UI", - "settings.header.visual.theme": "Tema", - "settings.option.visual.theme.github.download": "Instalar a partir de um URL do GitHub", - "settings.option.visual.theme.github.openfolder": "Abrir pasta de temas", - "settings.option.visual.theme.github.explore": "Explorar temas do GitHub", - "settings.header.visual.theme.github.page": "Temas do GitHub", - "settings.option.visual.theme.github.install.confirm": "Tem a certeza de que pretende instalar {{ repo }}?", - "settings.prompt.visual.theme.github.URL": "Introduza o URL do tema que pretende instalar", - "settings.prompt.visual.theme.uninstallTheme": "Tem a certeza de que pretende desinstalar {{ theme }}?", - "settings.option.visual.theme.checkForUpdates": "Procurar por atualizações", - "settings.option.visual.theme.manageStyles": "Gerir estilos", - "settings.option.visual.theme.uninstall": "Desinstalar", - "settings.option.visual.theme.viewInfo": "Ver informação", - "settings.option.visual.theme.github.available": "Disponível", - "settings.option.visual.theme.github.applied": "Aplicado", - "settings.notyf.visual.theme.install.success": "Tema instalado com sucesso", - "settings.notyf.visual.theme.install.error": "A instalação do tema falhou", - "settings.header.visual.plugin": "Plug-in", - "settings.option.visual.plugin.github.download": "Instalar a partir de um URL do GitHub", - "settings.option.visual.plugin.github.explore": "Explorar plug-ins do GitHub", - "settings.header.visual.plugin.github.page": "Plug-ins do GitHub", - "settings.option.visual.plugin.github.install.confirm": "Tem a certeza de que pretende instalar {{ repo }}?", - "settings.prompt.visual.plugin.github.URL": "Introduza o URL do plug-in que pretende instalar", - "settings.prompt.visual.plugin.github.success": "Plug-in instalado com sucesso. Pressione OK para reiniciar o Cider", - "settings.notyf.visual.plugin.install.success": "Plug-in instalado com sucesso", - "settings.notyf.visual.plugin.install.error": "A instalação do plug-in falhou", - "settings.option.visual.theme.default": "Cider", - "settings.option.visual.theme.dark": "Escuro", - "settings.option.visual.showPersonalInfo": "Mostrar informação pessoal", - "settings.header.window": "Janela", - "settings.header.window.description": "Ajustar as definições da janela para o Cider.", - "settings.option.window.openOnStartup": "Abrir o Cider no arranque", - "settings.option.window.openOnStartup.hidden": "Abrir escondido", - "settings.option.window.useNativeTitleBar": "Usar barra de título nativa", - "settings.option.window.windowControlStyle": "Estilo de controlo da janela", - "settings.option.window.windowControlStyle.right": "Direita", - "settings.option.window.windowControlStyle.left": "Esquerda", - "settings.header.lyrics": "Letras", - "settings.header.lyrics.description": "Ajustar as definições de letras para o Cider.", - "settings.option.lyrics.enableMusixmatch": "Ativar letras do Musixmatch", - "settings.option.lyrics.enableMusixmatchKaraoke": "Ativar o modo Karaoke (apenas para o Musixmatch)", - "settings.option.lyrics.musixmatchPreferredLanguage": "Língua preferida para traduções do Musixmatch", - "settings.option.lyrics.enableYoutubeLyrics": "Ativar letras do Youtube para videoclipes", - "settings.option.lyrics.enableQQLyrics": "Ativar letras do QQ", - "settings.header.connectivity": "Conectividade", - "settings.header.connectivity.description": "Ajustar as definições de conectividade para o Cider.", - "settings.option.connectivity.playbackNotifications": "Notificações de reprodução", - "settings.option.connectivity.discordRPC": "Discord Rich Presence", - "settings.option.connectivity.discordRPC.clientName": "Nome do cliente", - "settings.option.connectivity.discordRPC.clearOnPause": "Limpar o Discord Rich Presence ao colocar em pausa", - "settings.option.connectivity.discordRPC.hideButtons": "Esconder botões no Discord Rich Presence", - "settings.option.connectivity.discordRPC.hideTimestamp": "Esconder timestamp no Discord Rich Presence", - "settings.option.connectivity.discordRPC.detailsFormat": "Formato dos detalhes", - "settings.option.connectivity.discordRPC.stateFormat": "Formato do estado", - "settings.option.connectivity.discordRPC.reload": "Reiniciar o DiscordRPC", - "settings.option.connectivity.discordRPC.reconnectedToUser": "DiscordRPC ligação restabelecida ao utilizador: {{user}} ({{userid}})", - "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", - "settings.option.connectivity.lastfmScrobble.delay": "Last.fm atraso do scrobble (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "Ativar Last.fm Now Playing", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remover artistas do título da música (Last.fm)", - "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar música em loop (Last.fm)", - "settings.header.debug": "Debug", - "settings.option.debug.copy_log": "Copiar logs para a área de transferência", - "settings.option.debug.openAppData": "Abrir pasta do Cider", - "settings.header.experimental": "Experimental", - "settings.header.experimental.description": "Ajustar as definições experimentais para o Cider.", - "settings.option.experimental.reinstallwidevine": "Reinstalar WidevineCDM", - "settings.option.experimental.reinstallwidevine.confirm": "Tem a certeza de que pretende reinstalar o Widevine?", - "settings.option.experimental.unknownPlugin": "Fontes desconhecidas", - "settings.option.experimental.unknownPlugin.description": "Permitir a instalação de plug-ins de outros repositórios que não o repositório de plug-ins do Cider", - "settings.option.experimental.compactUI": "UI compacta", - "settings.option.window.close_button_hide": "Botão fechar oculta a aplicação", - "settings.option.experimental.inline_playlists": "Listas de reprodução e álbuns \"inline\"", - "settings.option.advanced.playlistTrackMapping": "Mapeamento de músicas de listas de reprodução", - "settings.option.advanced.playlistTrackMapping.description": "Ativa uma análise profunda das listas de reprodução para determinar que músicas estão em que listas de reprodução. O tempo de construção da cache das listas de reprodução pode aumentar significativamente.", - "settings.option.visual.transparent": "Moldura transparente", - "settings.option.visual.transparent.description": "Necessita de suporte do tema, requer reinício", - "settings.header.advanced": "Avançado", - "settings.header.connect": "Sincronização", - "settings.option.connect.link_account": "Ativar a sincronização com o Cider Connect", - "settings.option.connect.link_account.description": "Ligar a sua conta Discord ao Cider Connect permite-lhe armazenar dados de utilizador incluindo definições, EQ's, e eventualmente mais uma vez terminado (trabalho em curso).", - "spatial.notTurnedOn": "A espacialização de áudio está desativada. Para utilizar, por favor, ative-a primeiro.", - "spatial.spatialProperties": "Propriedades espaciais", - "spatial.width": "Largura", - "spatial.height": "Altura", - "spatial.depth": "Profundidade", - "spatial.gain": "Ganho", - "spatial.roomMaterials": "Materiais da sala", - "spatial.roomDimensions": "Dimensões da sala", - "spatial.roomPositions": "Posições na sala", - "spatial.setDimensions": "Definir dimensões", - "spatial.setPositions": "Definir posições", - "spatial.up": "Acima", - "spatial.front": "Frente", - "spatial.left": "Esquerda", - "spatial.right": "Direita", - "spatial.back": "Atrás", - "spatial.down": "Em baixo", - "spatial.listener": "Ouvinte", - "spatial.audioSource": "Fonte de áudio", - "settings.header.unfinished": "Inacabado", - "remote.web.title": "Cider Remote", - "remote.web.description": "Digitalize o código QR para emparelhar o seu telemóvel com esta instância do Cider", - "share.platform.twitter.tweet": "Ouça {{song}} na Apple Music.\n\n{{url}}\n\n#AppleMusic #Cider", - "share.platform.twitter": "Twitter", - "share.platform.facebook": "Facebook", - "share.platform.reddit": "Reddit", - "share.platform.telegram": "Telegram", - "share.platform.whatsapp": "WhatsApp", - "share.platform.messenger": "Messenger", - "share.platform.email": "Email", - "share.platform.songLink": "Copiar com song.link", - "share.platform.clipboard": "Copiar ligação", - "about.thanks": "Um grande obrigado à equipa da Cider Collective e a todos os nossos contribuidores." + "i18n.languageName": "Português (Portugal)", + "i18n.languageNameEnglish": "Portuguese (Portugal)", + "i18n.category": "main", + "i18n.authors": "@pgalhardo", + "app.name": "Cider", + "date.format": "${m} ${d}, ${y}", + "dialog.cancel": "Cancelar", + "dialog.ok": "OK", + "notification.updatingLibrarySongs": "A atualizar biblioteca de músicas...", + "notification.updatingLibraryAlbums": "A atualizar biblioteca de álbuns...", + "notification.updatingLibraryArtists": "A atualizar biblioteca de artistas...", + "term.variables": "Variáveis", + "term.appleInc": "Apple Inc.", + "term.appleMusic": "Apple Music", + "term.applePodcasts": "Apple Podcasts", + "term.itunes": "iTunes", + "term.github": "GitHub", + "term.discord": "Discord", + "term.learnMore": "Saiba mais", + "term.accountSettings": "Definições da conta", + "term.logout": "Terminar sessão", + "term.login": "Iniciar sessão", + "term.quickNav": "Navegação rápida", + "term.about": "Sobre", + "term.privateSession": "Sessão privada", + "term.disablePrivateSession": "Desativar sessão privada", + "term.queue": "Fila", + "term.autoplay": "Reprodução automática", + "term.lyrics": "Letra", + "term.miniplayer": "Mini-leitor", + "term.history": "Histórico", + "term.search": "Pesquisa", + "term.library": "Biblioteca", + "term.listenNow": "Ouvir agora", + "term.browse": "Explorar", + "term.radio": "Rádio", + "term.recentlyAdded": "Adições recentes", + "term.songs": "Músicas", + "term.albums": "Álbuns", + "term.artists": "Intérpretes", + "term.podcasts": "Podcasts", + "term.playlists": "Listas de reprodução", + "term.charts": "Gráficos", + "term.playlist": "Lista de reprodução", + "term.newPlaylist": "Nova lista de reprodução", + "term.newPlaylistFolder": "Nova pasta de listas de reprodução", + "term.createNewPlaylist": "Criar nova lista de reprodução", + "term.createNewPlaylistFolder": "Criar nova pasta de listas de reprodução", + "term.deletePlaylist": "Tem a certeza de que pretende apagar esta lista de reprodução?", + "term.navigateBack": "Retroceder uma página", + "term.navigateForward": "Avançar uma página", + "term.play": "Reproduzir", + "term.playpause": "Reproduzir/Pausa", + "term.pause": "Pausa", + "term.stop": "Parar", + "term.previous": "Anterior", + "term.next": "Seguinte", + "term.shuffle": "Modo aleatório", + "term.enableShuffle": "Ativar modo aleatório", + "term.disableShuffle": "Desativar modo aleatório", + "term.repeat": "Repetir", + "term.enableRepeatOne": "Ativar repetir uma", + "term.disableRepeatOne": "Desativar repetir uma", + "term.disableRepeat": "Não repetir", + "term.volume": "Volume", + "term.mute": "Mudo", + "term.unmute": "Com som", + "term.share": "Partilhar", + "term.share.success": "Copiado para a área de transferência", + "term.settings": "Definições", + "term.seeAll": "Ver tudo", + "term.sortBy": "Ordenar por", + "term.sortBy.album": "Álbum", + "term.sortBy.artist": "Intérprete", + "term.sortBy.name": "Nome", + "term.sortBy.genre": "Género", + "term.sortBy.releaseDate": "Data de lançamento", + "term.sortBy.duration": "Duração", + "term.sortBy.dateAdded": "Data de adição", + "term.sortOrder": "A-Z", + "term.sortOrder.ascending": "Ascendente", + "term.sortOrder.descending": "Descendente", + "term.viewAs": "Ver como", + "term.viewAs.coverArt": "Grafismos", + "term.viewAs.list": "Lista", + "term.dynamic": "Dinâmico", + "term.size": "Tamanho", + "term.size.normal": "Normal", + "term.size.compact": "Compacto", + "term.enable": "Ativar", + "term.disable": "Desativar", + "term.enabled": "Ativado", + "term.disabled": "Desativado", + "term.connect": "Ligar", + "term.connecting": "A ligar", + "term.disconnect": "Desligar", + "term.authed": "Autenticado", + "term.confirm": "Confirmar?", + "term.more": "Mais", + "term.less": "Menos", + "term.showMore": "Mostrar mais", + "term.showLess": "Mostrar menos", + "term.topSongs": "Top de músicas", + "term.latestReleases": "Últimos lançamentos", + "term.time.added": "Adicionado", + "term.time.released": "Lançado", + "term.time.updated": "Atualizado", + "term.time.days": "dias", + "term.time.day": { + "one": "dia", + "other": "dias" + }, + "term.time.hours": "horas", + "term.time.hour": { + "one": "hora", + "other": "horas" + }, + "term.time.minutes": "minutos", + "term.time.minute": { + "one": "minuto", + "other": "minutos" + }, + "term.time.seconds": "segundos", + "term.time.second": { + "one": "segundo", + "other": "segundos" + }, + "term.fullscreenView": "Vista de ecrã inteiro", + "term.defaultView": "Vista normal", + "term.audioSettings": "Definições de áudio", + "term.audioControls": "Controlos de volume", + "term.clearAll": "Limpar tudo", + "term.recentStations": "Estações recentes", + "term.personalStations": "Estações pessoais", + "term.amLive": "Apple Music Live", + "term.live": "AO VIVO", + "term.language": "Idioma", + "term.funLanguages": "Divertido", + "term.noLyrics": "A carregar... / Letra não encontrada. / Instrumental.", + "term.copyright": "Copyright", + "term.rightsReserved": "Todos os direitos reservados.", + "term.sponsor": "Patrocine este projecto", + "term.ciderTeam": "Equipa do Cider", + "term.developer": "Programador", + "term.socialTeam": "Equipa social", + "term.socials": "Redes sociais", + "term.contributors": "Contribuidores", + "term.equalizer": "Equalizador", + "term.reset": "Repor", + "term.tracks": "músicas", + "term.track": { + "one": "música", + "other": "músicas" + }, + "term.videos": "Vídeos", + "term.menu": "Menu", + "term.themeManaged": "Gerido por um tema", + "term.check": "Verificar", + "term.aboutArtist": "Sobre {{artistName}}", + "term.topResult": "Melhor resultado", + "term.sharedPlaylists": "Listas de reprodução partilhadas", + "term.people": "Pessoas", + "term.newpreset.name": "Nome da nova predefinição do EQ", + "term.addedpreset": "Predefinição adicionada", + "term.deletepreset.warn": "Tem a certeza de que pretende apagar esta predefinição?", + "term.deletedpreset": "Predefinição eliminada", + "term.defaultPresets": "Predefinições por omissão", + "term.userPresets": "Predefinições do utilizador", + "term.requestError": "Ocorreu um problema ao processar o pedido.", + "term.song.link.generate": "A obter o URL de partilha song.link...", + "term.musicVideos": "Videoclipes", + "term.stations": "Estações", + "term.curators": "Curadores", + "term.appleCurators": "Curadores da Apple", + "term.radioShows": "Programas de rádio", + "term.recordLabels": "Gravadoras", + "term.videoExtras": "Vídeos extra", + "term.top": "Top", + "term.version": "Versão", + "term.noVideos": "Não foram encontrados vídeos.", + "term.plugin": "Plug-in", + "term.pluginMenu": "Menu de plug-ins", + "term.pluginMenu.none": "Sem plug-ins interactivos", + "term.replay": "Repetir", + "term.uniqueAlbums": "Álbuns únicos", + "term.uniqueArtists": "Intérpretes únicos", + "term.uniqueSongs": "Músicas únicas", + "term.topArtists": "Top de intérpretes", + "term.listenedTo": "Reproduzido:", + "term.times": "vezes", + "term.topAlbums": "Top de álbuns", + "term.plays": "Reproduções", + "term.topGenres": "Top de géneros", + "term.confirmLogout": "Tem a certeza de que pretende terminar sessão?", + "term.creditDesignedBy": "Concebido por ${authorUsername}", + "term.discNumber": "Disco ${discNumber}", + "term.reload": "Reiniciar o Cider ?", + "term.toggleprivate": "Alternar sessão privada", + "term.webremote": "Web Remote", + "term.cast": "Transmitir", + "term.cast2": "Transmitir para dispositivos", + "term.quit": "Fechar", + "term.zoomin": "Aumentar o zoom", + "term.zoomout": "Diminuir o zoom", + "term.zoomreset": "Repor zoom", + "term.fullscreen": "Ecrã inteiro", + "home.syncFavorites": "Sincronizar favoritos", + "home.syncFavorites.gettingArtists": "A obter os artistas favoritos...", + "home.title": "Início", + "home.recentlyPlayed": "Reproduzido recentemente", + "home.recentlyAdded": "Adicionado recentemente", + "home.artistsFeed": "Feed dos seus artistas", + "home.artistsFeed.noArtist": "Siga alguns artistas para ver os seus últimos lançamentos", + "home.madeForYou": "Feito para si", + "home.friendsListeningTo": "O que os seus amigos estão a ouvir", + "home.followedArtists": "Artistas seguidos", + "error.appleMusicSubRequired": "A Apple Music requer uma subscrição.", + "error.connectionError": "Ocorreu um problema ao estabelecer ligação à Apple Music.", + "error.noResults": "Sem resultados.", + "error.noResults.description": "Tente uma nova pesquisa.", + "podcast.followOnCider": "Siga no Cider", + "podcast.followedOnCider": "A seguir no Cider", + "podcast.subscribeOnItunes": "Subscreva no iTunes", + "podcast.subscribedOnItunes": "Subscrito no iTunes", + "podcast.itunesStore": "iTunes Store", + "podcast.episodes": "Episódios", + "podcast.playEpisode": "Reproduzir episódio", + "podcast.website": "Website do Podcast", + "action.favorite": "Adicionar favorito", + "action.removeFavorite": "Remover favorito", + "action.hideLibrary": "Ocultar biblioteca", + "action.showLibrary": "Mostrar biblioteca", + "action.cut": "Cortar", + "action.paste": "Colar", + "action.selectAll": "Seleccionar tudo", + "action.delete": "Apagar", + "action.edit": "Editar", + "action.done": "Concluído", + "action.editTracklist": "Editar lista de reprodução", + "action.addToLibrary": "Adicionar à biblioteca", + "action.addToLibrary.success": "Adicionado à biblioteca", + "action.addToLibrary.error": "Erro ao adicionar à biblioteca", + "action.removeFromLibrary": "Remover da biblioteca", + "action.removeFromLibrary.success": "Removido da biblioteca", + "action.addToQueue": "Adicionar à fila", + "action.addToQueue.success": "Adicionado à fila", + "action.addToQueue.error": "Erro ao adicionar à fila", + "action.removeFromQueue": "Remover da fila", + "action.removeFromQueue.success": "Removido da fila", + "action.removeFromQueue.error": "Erro ao remover da fila", + "action.createPlaylist": "Criar uma nova lista de reprodução", + "action.addToPlaylist": "Adicionar à lista de reprodução", + "action.removeFromPlaylist": "Removar da lista de reprodução", + "action.addToFavorites": "Adicionar aos favoritos", + "action.follow": "Seguir", + "action.follow.success": "Seguido", + "action.follow.error": "Erro ao seguir", + "action.unfollow": "Não seguir", + "action.unfollow.success": "Não seguido", + "action.unfollow.error": "Erro ao deixar de seguir", + "action.playNext": "Reproduzir a seguir", + "action.playLater": "Reproduzir mais tarde", + "action.startRadio": "Criar estação", + "action.goToArtist": "Ir para intérprete", + "action.goToAlbum": "Ir para álbum", + "action.showInPlaylist": "Mostrar na lista de reprodução", + "action.showInAppleMusic": "Mostrar na Apple Music", + "action.moveToTop": "Mover para fora da pasta", + "action.share": "Partilhar", + "action.rename": "Renomear", + "action.love": "Gostar", + "action.unlove": "Desfazer gostar", + "action.dislike": "Não gostar", + "action.undoDislike": "Desfazer não gostar", + "action.showWebRemoteQR": "Web Remote", + "action.playTracksNext": "Reproduzir ${app.selectedMediaItems.length} músicas a seguir", + "action.playTracksLater": "Reproduzir ${app.selectedMediaItems.length} músicas mais tarde", + "action.removeTracks": "Remover ${self.selectedItems.length} músicas da fila", + "action.import": "Importar", + "action.export": "Exportar", + "action.showAlbum": "Mostrar álbum completo", + "action.tray.minimize": "Minimizar para a bandeja", + "action.tray.show": "Mostrar o Cider", + "action.tray.listento": "Ouvir:", + "action.update": "Atualizar", + "action.install": "Instalar", + "action.copy": "Copiar", + "action.newpreset": "Nova predefinição...", + "action.deletepreset": "Eliminar predefinição", + "action.open": "Abrir", + "action.close": "Fechar", + "action.relaunch.confirm": "Pretende reiniciar o Cider?", + "action.cast.chromecast": "Chromecast", + "action.cast.todevices": "Transmitir para dispositivos", + "action.cast.stop": "Parar a transmissão para todos os dispositivos", + "action.cast.airplay": "AirPlay", + "action.cast.airplay.underdevelopment": "AirPlay ainda está em desenvolvimento", + "action.cast.scan": "Procurar", + "action.cast.scanning": "A procurar...", + "action.createNew": "Criar nova...", + "action.openArtworkInBrowser": "Abrir grafismo no navegador", + "action.scrollToTop": "Voltar ao topo", + "menubar.options.view": "Ver", + "menubar.options.reload": "Atualizar", + "menubar.options.forcereload": "Forçar atualização", + "menubar.options.toggledevtools": "Alternar ferramentas do programador", + "menubar.options.window": "Janela", + "menubar.options.minimize": "Minimizar", + "menubar.options.plugins": "Menu de plug-ins", + "menubar.options.controls": "Controlos", + "menubar.options.volumeup": "Aumentar o volume", + "menubar.options.volumedown": "Diminuir o volume", + "menubar.options.account": "Conta", + "menubar.options.signout": "Terminar sessão", + "menubar.options.support": "Suporte", + "menubar.options.report": "Reportar um...", + "menubar.options.bug": "Problema", + "menubar.options.feature": "Pedido de funcionalidade", + "menubar.options.trans": "Pedido de tradução", + "menubar.options.license": "Ver licença", + "menubar.options.conf": "Abrir ficheiro de configuração no editor", + "menubar.options.zoom": "Zoom", + "settings.header.general": "Geral", + "settings.header.general.description": "Ajustar as definições gerais do Cider.", + "settings.option.general.language": "Idioma", + "settings.option.general.resumebehavior": "Comportamento de retoma", + "settings.option.general.resumebehavior.description": "Define a forma como o Cider irá retomar a sua sessão quando regressar à aplicação.", + "settings.option.general.resumebehavior.locally": "Localmente", + "settings.option.general.resumebehavior.locally.description": "O Cider irá retomar a sua última sessão nesta máquina.", + "settings.option.general.resumebehavior.history": "Histórico", + "settings.option.general.resumebehavior.history.description": "O Cider irá colocar na fila a última música do seu histórico da Apple Music, através de todos os seus dispositivos.", + "settings.option.general.resumetabs": "Abrir separador no arranque", + "settings.option.general.resumetabs.description": "Pode escolher que separador quer abrir quando abre o Cider.", + "settings.option.general.resumetabs.dynamic": "Dinâmico", + "settings.option.general.resumetabs.dynamic.description": "O Cider abrirá o separador que utilizou pela última vez.", + "settings.option.general.language.main": "Idiomas", + "settings.option.general.language.fun": "Idiomas divertidos", + "settings.option.general.language.unsorted": "Indiferenciado", + "settings.option.general.customizeSidebar": "Personalizar os itens da barra lateral", + "settings.option.general.customizeSidebar.customize": "Personalizar", + "settings.option.general.keybindings": "Atalhos do teclado", + "settings.option.general.keybindings.library": "Biblioteca", + "settings.option.general.keybindings.session": "Sessão", + "settings.option.general.keybindings.control": "Controlos", + "settings.option.general.keybindings.interface": "Interface", + "settings.option.general.keybindings.advanced": "Avançado", + "settings.option.general.keybindings.pressCombination": "Prima uma combinação de duas teclas para atualizar o atalho.", + "settings.option.general.keybindings.pressEscape": "Prima a tecla Escape para voltar atrás.", + "settings.notyf.general.keybindings.update.success": "Atalho atualizado com sucesso", + "settings.prompt.general.keybindings.update.success": "Atalho atualizado com sucesso. Prima OK para reiniciar o Cider", + "settings.option.general.themeUpdateNotification": "Verificação automática de atualizações de temas", + "settings.option.general.showLovedTracksInline": "Mostrar músicas que gosta \"inline\"", + "settings.description.search": "Pesquisa", + "settings.description.albums": "Álbuns da biblioteca", + "settings.description.artists": "Intérpretes da biblioteca", + "settings.description.browse": "Explorar", + "settings.description.private": "Alternar sessão privada", + "settings.description.remote": "Web Remote", + "settings.description.audio": "Definições de áudio", + "settings.description.plugins": "Menu de plug-ins", + "settings.description.cast": "Transmitir para dispositivos", + "settings.description.settings": "Definições", + "settings.description.developer": "Ferramentas do programador", + "settings.description.listnow": "Ouvir agora", + "settings.description.recentAdd": "Adições recentes", + "settings.description.songs": "Músicas", + "settings.notyf.updateCider.update-not-available": "Nenhuma atualização disponível", + "settings.notyf.updateCider.update-downloaded": "A atualização foi descarregada, reinicie para aplicar", + "settings.notyf.updateCider.update-timeout": "O pedido de atualização estou o tempo limite", + "settings.header.audio": "Áudio", + "settings.header.audio.description": "Ajustar as definições de áudio para o Cider.", + "settings.option.audio.volumeStep": "Nível de incremento de volume", + "settings.option.audio.advanced": "Controlo avançado de volume", + "settings.option.audio.maxVolume": "Volume máximo", + "settings.option.audio.changePlaybackRate": "Alterar velocidade de reprodução", + "settings.option.audio.playbackRate": "Velocidade de reprodução", + "settings.option.audio.playbackRate.change": "Alterar", + "settings.option.audio.quality": "Qualidade do áudio", + "settings.header.audio.quality.hireslossless": "Alta resolução sem perdas", + "settings.header.audio.quality.hireslossless.description": "até 24-bit/192 kHz", + "settings.header.audio.quality.lossless": "Sem perdas", + "settings.header.audio.quality.lossless.description": "até 24-bit/48 kHz", + "settings.header.audio.quality.high": "Alta", + "settings.header.audio.quality.high.description": "256 kbps", + "settings.header.audio.quality.standard": "Padrão", + "settings.header.audio.quality.standard.description": "64 kbps", + "settings.option.audio.seamlessTransition": "Transição gradual do áudio", + "settings.option.audio.enableAdvancedFunctionality": "Ativar funcionalidades avançadas", + "settings.option.audio.enableAdvancedFunctionality.description": "Ativar o AudioContext dá acesso a funcionalidades alargadas como Normalização de Áudio, Equalizadores e Visualizadores - contudo, isto pode causar dificuldades em alguns sistemas.", + "settings.warn.audio.enableAdvancedFunctionality.lowcores": "O Cider pensa que o seu PC não é capaz de lidar com estas funcionalidades. Tem a certeza de que pretende continuar?", + "settings.option.audio.audioLab": "Cider Audio Lab", + "settings.option.audio.audioLab.description": "Efeitos de áudio desenvolvidos internamente para o Cider.", + "settings.option.audio.audioLab.subheader": "Designed by Cider Acoustic Technologies in California", + "settings.warn.audioLab.withoutAF": "AudioContext (funcionalidade avançada) é necessário para suportar o Cider Audio Lab.", + "settings.warn.enableAdvancedFunctionality": "AudioContext (funcionalidade avançada) é necessário para suportar esta funcionalidade.", + "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calor Analógico", + "settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula o calor analógico inspirado no Korg Nutube 6P1", + "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidade do calor analógico", + "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Altera a intensidade do processamento do módulo de calor analógico.", + "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Suave", + "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Quente", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™️", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Cria uma atmosfera musical diferente inspirada nas mais modernas aparelhagens.", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Modo do Cider Atmosphere Realizer™️", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Altera o modo de funcionamento do módulo 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": "Moonwight Softcake", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "Clafoutis aux Cerises", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Brown Sugar Creme Brûlée Milk", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Cuddle Warmth", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Melhora a qualidade de áudio percecionada do áudio codificado em AAC, utilizando um algoritmo de tempo real que tira partido tanto dos modelos psicoacústicos da audição humana como das características de codificação do AAC.", + "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "O CAP não é compatível com a espacialização. Por favor, desative a espacialização para continuar.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Intensidade do CAP", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Muda a intensidade do processamento feito ao áudio (a agressividade pode produzir resultados indesejáveis).", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Padrão", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptativo", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Antigo", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agressivo", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalização de áudio", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza o volume de pico das músicas para criar uma experiência de audição mais uniforme (não funciona em músicas carregadas pelo utilizador).", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Gerido pelo Audio Lab", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Espacialização ajustada pelo Cider", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efeito de espacialização pré-ajustado, desactiva as configurações personalizáveis de espacialização de áudio.", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Perfil de espacialização do Cider", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Altera o perfil de ajuste da espacialização.", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Padrão", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Palco", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separação", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Mínimo", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiófilo", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Difundido", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Encore expandido", + "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "A espacialização não é compatível com o CAP. Por favor, desative o CAP para continuar.", + "settings.option.audio.dbspl.display": "Mostrar dB SPL", + "settings.option.audio.dbspl.description": "(Apenas para utilizadores avançados) Mostrar dB SPL em vez de dBFS no controlo de volume.", + "settings.option.audio.dbfs.calibration": "Calibração de 0 dBFS", + "settings.option.audio.dbfs.description": "Introduza o pico de SPL com ponderação Z quando o Cider está a 0 dBFS.", + "settings.header.visual": "Aparência", + "settings.header.visual.description": "Ajustar as definições visuais do Cider.", + "settings.option.visual.windowStyle": "Estilo da janela", + "settings.option.visual.customAccentColor": "Cor de destaque personalizada", + "settings.option.visual.accentColor": "Cor de destaque", + "settings.option.visual.purplePodcastPlaybackBar": "Barra de reprodução roxa para Podcasts", + "settings.option.visual.windowColor": "Tonalidade da cor da janela", + "settings.header.visual.windowBackgroundStyle.color": "Tonalidade da cor", + "settings.option.visual.windowBackgroundStyle": "Estilo do fundo da janela", + "settings.header.visual.windowBackgroundStyle.none": "Nenhum", + "settings.header.visual.windowBackgroundStyle.artwork": "Grafismo", + "settings.header.visual.windowBackgroundStyle.image": "Imagem", + "settings.option.visual.animatedArtwork": "Grafismo animado", + "settings.header.visual.animatedArtwork.always": "Sempre", + "settings.header.visual.animatedArtwork.limited": "Limitado a páginas e entradas especiais", + "settings.header.visual.animatedArtwork.disable": "Desativar em todo o lado", + "settings.option.visual.animatedArtworkQuality": "Qualidade dos grafismos animados", + "settings.header.visual.animatedArtworkQuality.low": "Baixa", + "settings.header.visual.animatedArtworkQuality.medium": "Média", + "settings.header.visual.animatedArtworkQuality.high": "Alta", + "settings.header.visual.animatedArtworkQuality.veryHigh": "Muito alta", + "settings.header.visual.animatedArtworkQuality.extreme": "Extrema", + "settings.option.visual.animatedWindowBackground": "Fundo da janela animado", + "settings.option.visual.hardwareAcceleration": "Aceleração de hardware", + "settings.option.visual.hardwareAcceleration.description": "Requer reinício", + "settings.header.visual.hardwareAcceleration.default": "Padrão", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.option.visual.uiscale": "Escala da UI", + "settings.header.visual.theme": "Tema", + "settings.option.visual.theme.github.download": "Instalar a partir de um URL do GitHub", + "settings.option.visual.theme.github.openfolder": "Abrir pasta de temas", + "settings.option.visual.theme.github.explore": "Explorar temas do GitHub", + "settings.header.visual.theme.github.page": "Temas do GitHub", + "settings.option.visual.theme.github.install.confirm": "Tem a certeza de que pretende instalar {{ repo }}?", + "settings.prompt.visual.theme.github.URL": "Introduza o URL do tema que pretende instalar", + "settings.prompt.visual.theme.uninstallTheme": "Tem a certeza de que pretende desinstalar {{ theme }}?", + "settings.option.visual.theme.checkForUpdates": "Procurar por atualizações", + "settings.option.visual.theme.manageStyles": "Gerir estilos", + "settings.option.visual.theme.uninstall": "Desinstalar", + "settings.option.visual.theme.viewInfo": "Ver informação", + "settings.option.visual.theme.github.available": "Disponível", + "settings.option.visual.theme.github.applied": "Aplicado", + "settings.notyf.visual.theme.install.success": "Tema instalado com sucesso", + "settings.notyf.visual.theme.install.error": "A instalação do tema falhou", + "settings.header.visual.plugin": "Plug-in", + "settings.option.visual.plugin.github.download": "Instalar a partir de um URL do GitHub", + "settings.option.visual.plugin.github.explore": "Explorar plug-ins do GitHub", + "settings.header.visual.plugin.github.page": "Plug-ins do GitHub", + "settings.option.visual.plugin.github.install.confirm": "Tem a certeza de que pretende instalar {{ repo }}?", + "settings.prompt.visual.plugin.github.URL": "Introduza o URL do plug-in que pretende instalar", + "settings.prompt.visual.plugin.github.success": "Plug-in instalado com sucesso. Pressione OK para reiniciar o Cider", + "settings.notyf.visual.plugin.install.success": "Plug-in instalado com sucesso", + "settings.notyf.visual.plugin.install.error": "A instalação do plug-in falhou", + "settings.option.visual.theme.default": "Cider", + "settings.option.visual.theme.dark": "Escuro", + "settings.option.visual.showPersonalInfo": "Mostrar informação pessoal", + "settings.header.window": "Janela", + "settings.header.window.description": "Ajustar as definições da janela para o Cider.", + "settings.option.window.openOnStartup": "Abrir o Cider no arranque", + "settings.option.window.openOnStartup.hidden": "Abrir escondido", + "settings.option.window.useNativeTitleBar": "Usar barra de título nativa", + "settings.option.window.windowControlStyle": "Estilo de controlo da janela", + "settings.option.window.windowControlStyle.right": "Direita", + "settings.option.window.windowControlStyle.left": "Esquerda", + "settings.header.lyrics": "Letras", + "settings.header.lyrics.description": "Ajustar as definições de letras para o Cider.", + "settings.option.lyrics.enableMusixmatch": "Ativar letras do Musixmatch", + "settings.option.lyrics.enableMusixmatchKaraoke": "Ativar o modo Karaoke (apenas para o Musixmatch)", + "settings.option.lyrics.musixmatchPreferredLanguage": "Língua preferida para traduções do Musixmatch", + "settings.option.lyrics.enableYoutubeLyrics": "Ativar letras do Youtube para videoclipes", + "settings.option.lyrics.enableQQLyrics": "Ativar letras do QQ", + "settings.header.connectivity": "Conectividade", + "settings.header.connectivity.description": "Ajustar as definições de conectividade para o Cider.", + "settings.option.connectivity.playbackNotifications": "Notificações de reprodução", + "settings.option.connectivity.discordRPC": "Discord Rich Presence", + "settings.option.connectivity.discordRPC.clientName": "Nome do cliente", + "settings.option.connectivity.discordRPC.clearOnPause": "Limpar o Discord Rich Presence ao colocar em pausa", + "settings.option.connectivity.discordRPC.hideButtons": "Esconder botões no Discord Rich Presence", + "settings.option.connectivity.discordRPC.hideTimestamp": "Esconder timestamp no Discord Rich Presence", + "settings.option.connectivity.discordRPC.detailsFormat": "Formato dos detalhes", + "settings.option.connectivity.discordRPC.stateFormat": "Formato do estado", + "settings.option.connectivity.discordRPC.reload": "Reiniciar o DiscordRPC", + "settings.option.connectivity.discordRPC.reconnectedToUser": "DiscordRPC ligação restabelecida ao utilizador: {{user}} ({{userid}})", + "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", + "settings.option.connectivity.lastfmScrobble.delay": "Last.fm atraso do scrobble (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Ativar Last.fm Now Playing", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remover artistas do título da música (Last.fm)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar música em loop (Last.fm)", + "settings.header.debug": "Debug", + "settings.option.debug.copy_log": "Copiar logs para a área de transferência", + "settings.option.debug.openAppData": "Abrir pasta do Cider", + "settings.header.experimental": "Experimental", + "settings.header.experimental.description": "Ajustar as definições experimentais para o Cider.", + "settings.option.experimental.reinstallwidevine": "Reinstalar WidevineCDM", + "settings.option.experimental.reinstallwidevine.confirm": "Tem a certeza de que pretende reinstalar o Widevine?", + "settings.option.experimental.unknownPlugin": "Fontes desconhecidas", + "settings.option.experimental.unknownPlugin.description": "Permitir a instalação de plug-ins de outros repositórios que não o repositório de plug-ins do Cider", + "settings.option.experimental.compactUI": "UI compacta", + "settings.option.window.close_button_hide": "Botão fechar oculta a aplicação", + "settings.option.experimental.inline_playlists": "Listas de reprodução e álbuns \"inline\"", + "settings.option.advanced.playlistTrackMapping": "Mapeamento de músicas de listas de reprodução", + "settings.option.advanced.playlistTrackMapping.description": "Ativa uma análise profunda das listas de reprodução para determinar que músicas estão em que listas de reprodução. O tempo de construção da cache das listas de reprodução pode aumentar significativamente.", + "settings.option.visual.transparent": "Moldura transparente", + "settings.option.visual.transparent.description": "Necessita de suporte do tema, requer reinício", + "settings.header.advanced": "Avançado", + "settings.header.connect": "Sincronização", + "settings.option.connect.link_account": "Ativar a sincronização com o Cider Connect", + "settings.option.connect.link_account.description": "Ligar a sua conta Discord ao Cider Connect permite-lhe armazenar dados de utilizador incluindo definições, EQ's, e eventualmente mais uma vez terminado (trabalho em curso).", + "spatial.notTurnedOn": "A espacialização de áudio está desativada. Para utilizar, por favor, ative-a primeiro.", + "spatial.spatialProperties": "Propriedades espaciais", + "spatial.width": "Largura", + "spatial.height": "Altura", + "spatial.depth": "Profundidade", + "spatial.gain": "Ganho", + "spatial.roomMaterials": "Materiais da sala", + "spatial.roomDimensions": "Dimensões da sala", + "spatial.roomPositions": "Posições na sala", + "spatial.setDimensions": "Definir dimensões", + "spatial.setPositions": "Definir posições", + "spatial.up": "Acima", + "spatial.front": "Frente", + "spatial.left": "Esquerda", + "spatial.right": "Direita", + "spatial.back": "Atrás", + "spatial.down": "Em baixo", + "spatial.listener": "Ouvinte", + "spatial.audioSource": "Fonte de áudio", + "settings.header.unfinished": "Inacabado", + "remote.web.title": "Cider Remote", + "remote.web.description": "Digitalize o código QR para emparelhar o seu telemóvel com esta instância do Cider", + "share.platform.twitter.tweet": "Ouça {{song}} na Apple Music.\n\n{{url}}\n\n#AppleMusic #Cider", + "share.platform.twitter": "Twitter", + "share.platform.facebook": "Facebook", + "share.platform.reddit": "Reddit", + "share.platform.telegram": "Telegram", + "share.platform.whatsapp": "WhatsApp", + "share.platform.messenger": "Messenger", + "share.platform.email": "Email", + "share.platform.songLink": "Copiar com song.link", + "share.platform.clipboard": "Copiar ligação", + "about.thanks": "Um grande obrigado à equipa da Cider Collective e a todos os nossos contribuidores." } diff --git a/src/i18n/source/en_US.json b/src/i18n/source/en_US.json index e202b0bf..7c9a36cb 100644 --- a/src/i18n/source/en_US.json +++ b/src/i18n/source/en_US.json @@ -22,7 +22,6 @@ "term.logout": "Logout", "term.login": "Log In", "term.quickNav": "Quick Nav", - "term.cast": "Cast", "term.about": "About", "term.privateSession": "Private Session", "term.disablePrivateSession": "Disable Private Session", @@ -42,6 +41,7 @@ "term.artists": "Artists", "term.podcasts": "Podcasts", "term.playlists": "Playlists", + "term.charts": "Charts", "term.playlist": "Playlist", "term.newPlaylist": "New Playlist", "term.newPlaylistFolder": "New Playlist Folder", @@ -51,6 +51,7 @@ "term.navigateBack": "Navigate back", "term.navigateForward": "Navigate forward", "term.play": "Play", + "term.playpause": "Play/Pause", "term.pause": "Pause", "term.stop": "Stop", "term.previous": "Previous", @@ -153,6 +154,7 @@ }, "term.videos": "Videos", "term.menu": "Menu", + "term.themeManaged": "Managed by a theme", "term.check": "Check", "term.aboutArtist": "About {{artistName}}", "term.topResult": "Top Result", @@ -192,6 +194,16 @@ "term.confirmLogout": "Are you sure you want to logout?", "term.creditDesignedBy": "Designed by ${authorUsername}", "term.discNumber": "Disc ${discNumber}", + "term.reload" : "Reload Cider ?", + "term.toggleprivate" : "Toggle Private Session", + "term.webremote" : "Web Remote", + "term.cast" : "Cast", + "term.cast2" : "Cast to Devices", + "term.quit" : "Quit", + "term.zoomin" : "Zoom In", + "term.zoomout" : "Zoom Out", + "term.zoomreset" : "Reset Zoom", + "term.fullscreen" : "Fullscreen", "home.title": "Home", "home.recentlyPlayed": "Recently Played", "home.recentlyAdded": "Recently Added", @@ -264,11 +276,7 @@ "action.export": "Export", "action.showAlbum": "Show Complete Album", "action.tray.minimize": "Minimize to Tray", - "action.tray.quit": "Quit", "action.tray.show": "Show Cider", - "action.tray.playpause": "Play/Pause", - "action.tray.next": "Next", - "action.tray.previous": "Previous", "action.tray.listento": "Listen To:", "action.update": "Update", "action.install": "Install", @@ -288,45 +296,26 @@ "action.createNew": "Create New...", "action.openArtworkInBrowser": "Open artwork in browser", "action.scrollToTop": "Scroll to top", - "menubar.options.about": "About", - "menubar.options.settings": "Settings", - "menubar.options.quit": "Quit Cider", - "menubar.options.view": "View ", + "menubar.options.view": "View", "menubar.options.reload": "Reload", "menubar.options.forcereload": "Force Reload", "menubar.options.toggledevtools": "Toggle Developer Tools", "menubar.options.window": "Window", "menubar.options.minimize": "Minimize", - "menubar.options.toggleprivate": "Toggle Private Session", - "menubar.options.webremote": "Web Remote", - "menubar.options.audio": "Audio Settings", "menubar.options.plugins": "Plu-gins Menu", "menubar.options.controls": "Controls", - "menubar.options.next": "Next", - "menubar.options.playpause": "Play/Pause", - "menubar.options.previous": "Previous", "menubar.options.volumeup": "Volume Up", "menubar.options.volumedown": "Volume Down", - "menubar.options.browse": "Browse", - "menubar.options.artists": "Artists", - "menubar.options.search": "Search", - "menubar.options.albums": "Albums", - "menubar.options.cast": "Cast To Devices", "menubar.options.account": "Account", - "menubar.options.accountsettings": "Account Settings", "menubar.options.signout": "Sign Out", "menubar.options.support": "Support", - "menubar.options.discord": "Discord", - "menubar.options.github": "GitHub Wiki", "menubar.options.report": "Report a...", "menubar.options.bug": "Bug", "menubar.options.feature": "Feature Request", "menubar.options.trans": "Translation Report/Request", "menubar.options.license": "View License", "menubar.options.conf": "Open Configuration File in Editor", - "menubar.options.listennow": "Listen Now", - "menubar.options.recentlyAdded": "Recently Added", - "menubar.options.songs": "Songs", + "menubar.options.zoom": "Zoom", "settings.header.general": "General", "settings.header.general.description": "Adjust the general settings for Cider.", "settings.option.general.language": "Language", @@ -346,11 +335,15 @@ "settings.option.general.customizeSidebar": "Customize Sidebar Items", "settings.option.general.customizeSidebar.customize": "Customize", "settings.option.general.keybindings": "Keybindings", + "settings.option.general.keybindings.library": "Library", + "settings.option.general.keybindings.session": "Session", + "settings.option.general.keybindings.control": "Controls", + "settings.option.general.keybindings.interface": "Interface", + "settings.option.general.keybindings.advanced": "Advanced", "settings.option.general.keybindings.pressCombination": "Press a combination of two keys to update keybind.", "settings.option.general.keybindings.pressEscape": "Press Escape key to go back.", "settings.notyf.general.keybindings.update.success": "Keybind updated successfully", "settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider", - "settings.option.general.keybindings.open": "Open", "settings.option.general.themeUpdateNotification": "Automatically check for theme updates", "settings.option.general.showLovedTracksInline": "Show loved tracks inline", "settings.description.search": "Search", diff --git a/src/i18n/zh_CN.json b/src/i18n/zh_CN.json index ec32497a..9e726cb9 100644 --- a/src/i18n/zh_CN.json +++ b/src/i18n/zh_CN.json @@ -164,7 +164,7 @@ "term.plugin": "插件", "term.pluginMenu": "插件菜单", "term.pluginMenu.none": "沒有交互式插件", - "term.replay":"重新播放", + "term.replay":"音乐回忆", "term.uniqueAlbums":"Unique Albums", "term.uniqueArtists":"Unique Artists", "term.uniqueSongs":"Unique Songs", @@ -177,6 +177,8 @@ "term.confirmLogout":"你确定要退出登录吗?", "term.creditDesignedBy":"由 ${authorUsername} 设计", "term.discNumber":"碟 ${discNumber}", + "home.syncFavorites": "同步喜爱艺人", + "home.syncFavorites.gettingArtists": "获取喜爱艺人...", "home.title": "主页", "home.recentlyPlayed": "最近播放", "home.recentlyAdded": "最近添加", @@ -197,6 +199,8 @@ "podcast.episodes": "单集", "podcast.playEpisode": "播放单集", "podcast.website": "Podcast 网站", + "action.favorite":"喜爱", + "action.removeFavorite":"取消喜爱", "action.hideLibrary":"隐藏资料库", "action.showLibrary":"显示资料可查", "action.cut":"剪切", @@ -362,7 +366,7 @@ "settings.option.audio.advanced":"高级功能", "settings.option.audio.changePlaybackRate":"修改播放速度", "settings.option.audio.playbackRate":"播放速度", - "settings.option.audio.playbackRate.change":"播放速度已修改", + "settings.option.audio.playbackRate.change":"修改", "settings.option.audio.quality": "音质", "settings.header.audio.quality.hireslossless": "高解析度无损", "settings.header.audio.quality.hireslossless.description": "(最高 24 位/192 kHz)", @@ -430,10 +434,15 @@ "settings.header.visual": "外观", "settings.header.visual.description": "调整 Cider 的外观", "settings.option.visual.windowStyle":"窗口风格", + "settings.option.visual.customAccentColor": "自定义强调色", + "settings.option.visual.accentColor": "强调色", + "settings.option.visual.purplePodcastPlaybackBar": "播放播客时使用紫色进度条", + "settings.option.visual.windowColor": "窗口色调", "settings.option.visual.windowBackgroundStyle": "窗口背景样式", "settings.header.visual.windowBackgroundStyle.none": "无", "settings.header.visual.windowBackgroundStyle.artwork": "专辑插图", "settings.header.visual.windowBackgroundStyle.image": "图像", + "settings.header.visual.windowBackgroundStyle.color":"色调", "settings.option.visual.animatedArtwork": "动态专辑插图", "settings.header.visual.animatedArtwork.always": "总是显示", "settings.header.visual.animatedArtwork.limited": "只在艺人页面和专辑插图显示", diff --git a/src/main/base/app.ts b/src/main/base/app.ts index 58ccda47..ea81d8f6 100644 --- a/src/main/base/app.ts +++ b/src/main/base/app.ts @@ -335,7 +335,7 @@ export class AppEvents { { visible: !visible, - label: this.i18n['action.tray.playpause'], + label: this.i18n['term.playpause'], click: () => { utils.getWindow().webContents.executeJavaScript('MusicKitInterop.playPause()') } @@ -343,7 +343,7 @@ export class AppEvents { { visible: !visible, - label: this.i18n['action.tray.next'], + label: this.i18n['term.next'], click: () => { utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.next()`) } @@ -351,7 +351,7 @@ export class AppEvents { { visible: !visible, - label: this.i18n['action.tray.previous'], + label: this.i18n['term.previous'], click: () => { utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.previous()`) } @@ -372,7 +372,7 @@ export class AppEvents { } }, { - label: this.i18n['action.tray.quit'], + label: this.i18n['term.quit'], click: () => { app.quit() } diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts index 89c54e55..0f158405 100644 --- a/src/main/base/browserwindow.ts +++ b/src/main/base/browserwindow.ts @@ -53,6 +53,7 @@ export class BrowserWindow { dev: app.isPackaged, osRelease: os.release(), updatable: !process.windowsStore || !process.mas, + useV3: utils.getStoreValue('advanced.experiments').includes("ampv3"), components: [ "pages/podcasts", "pages/apple-account-settings", @@ -849,6 +850,7 @@ export class BrowserWindow { }) ipcMain.handle("get-github-plugin", async (event, url) => { + await this.StopWatcher() const returnVal = { success: true, theme: null, @@ -893,9 +895,11 @@ export class BrowserWindow { returnVal.success = false; } BrowserWindow.win.webContents.send("plugin-installed", returnVal); + this.StartWatcher(utils.getPath('themes')); }); ipcMain.handle("get-github-theme", async (event, url) => { + await this.StopWatcher() const returnVal = { success: true, theme: null, @@ -940,6 +944,8 @@ export class BrowserWindow { returnVal.success = false; } BrowserWindow.win.webContents.send("theme-installed", returnVal); + this.StartWatcher(utils.getPath('themes')); + BrowserWindow.win.webContents.send("theme-update", "") }); ipcMain.on("get-themes", (event, _key) => { @@ -1162,6 +1168,10 @@ export class BrowserWindow { app.quit(); }) + ipcMain.handle("quit-app", (_event, _) => { + app.quit(); + }) + app.on('before-quit', () => { }) diff --git a/src/main/base/store.ts b/src/main/base/store.ts index 8cbcd2c4..10fae66c 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -21,6 +21,7 @@ export class Store { "state_format": "by {artist}", "details_format": "{title}", }, + "refreshInterval": 120000, "language": "en_US", // electron.app.getLocale().replace('-', '_') this can be used in future "playbackNotifications": true, "resumeOnStartupBehavior": "local", @@ -106,6 +107,18 @@ export class Store { "CommandOrControl", // Who the hell uses a different key for this? Fucking Option? "," ], + "zoomn": [ + "Control", + "numadd", + ], + "zoomt": [ + "Control", + "numsub", + ], + "zoomrst": [ + "Control", + "num0", + ], "openDeveloperTools": [ "CommandOrControl", "Shift", @@ -206,7 +219,6 @@ export class Store { }, "windowControlPosition": 0, // 0 default right "nativeTitleBar": false, - "uiScale": 1.0, "windowColor": "#000000", "customAccentColor": false, "accentColor": "#fc3c44", @@ -228,10 +240,11 @@ export class Store { "NowPlaying": "true" }, "advanced": { - "AudioContext": false, + "AudioContext": true, "experiments": [], "playlistTrackMapping": true, - "ffmpegLocation": "" + "ffmpegLocation": "", + "disableLogging": false }, "connectUser": { "auth": null, diff --git a/src/main/base/utils.ts b/src/main/base/utils.ts index 41e0ae12..b0f1b513 100644 --- a/src/main/base/utils.ts +++ b/src/main/base/utils.ts @@ -2,7 +2,7 @@ import * as fs from "fs"; import * as path from "path"; import {Store} from "./store"; import {BrowserWindow as bw} from "./browserwindow"; -import {app, dialog, ipcMain, Notification, shell } from "electron"; +import {app, dialog, ipcMain, Notification, shell, BrowserWindow} from "electron"; import fetch from "electron-fetch"; import {AppImageUpdater, NsisUpdater} from "electron-updater"; import * as log from "electron-log"; @@ -124,7 +124,11 @@ export class utils { * Gets the browser window */ static getWindow(): Electron.BrowserWindow { - return bw.win + if (bw.win) { + return bw.win + } else { + return BrowserWindow.getAllWindows()[0] + } } static loadPluginFrontend(path: string): void { diff --git a/src/main/plugins/menubar.ts b/src/main/plugins/menubar.ts index 5b9f47a1..9546e5d8 100644 --- a/src/main/plugins/menubar.ts +++ b/src/main/plugins/menubar.ts @@ -17,6 +17,8 @@ export default class Thumbar { * Menubar Assets * @private */ + + private isNotMac: boolean = process.platform !== 'darwin'; private isMac: boolean = process.platform === 'darwin'; private _menuTemplate: any = [ { @@ -28,12 +30,12 @@ export default class Thumbar { }, {type: 'separator'}, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.toggleprivate'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.toggleprivate'), accelerator: utils.getStoreValue("general.keybindings.togglePrivateSession").join('+'), click: () => utils.getWindow().webContents.executeJavaScript(`app.cfg.general.privateEnabled = !app.cfg.general.privateEnabled`) }, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.settings'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.settings'), accelerator: utils.getStoreValue("general.keybindings.settings").join('+'), click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('settings')`) }, @@ -47,11 +49,21 @@ export default class Thumbar { {type: 'separator'}, {role: 'quit'} ] : []), + ...(this.isNotMac ? [ + {type: 'separator'}, + { + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.quit'), + accelerator: 'Control+Q', + click: () => app.quit() + + } + ] : []) ] }, { label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.view'), submenu: [ + ...(this.isMac ? [ {role: 'reload'}, {role: 'forceReload'}, {role: 'toggleDevTools'}, @@ -62,40 +74,41 @@ export default class Thumbar { {type: 'separator'}, {role: 'togglefullscreen'}, {type: 'separator'}, + ] : []), { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.search'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.search'), accelerator: utils.getStoreValue("general.keybindings.search").join('+'), click: () => utils.getWindow().webContents.executeJavaScript('app.focusSearch()') }, {type:'separator'}, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.listennow'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.listenNow'), accelerator: utils.getStoreValue('general.keybindings.listnow').join('+'), click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('listen_now')`) }, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.browse'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.browse'), accelerator: utils.getStoreValue("general.keybindings.browse").join('+'), click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('browse')`) }, {type: 'separator'}, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.recentlyAdded') + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.recentlyAdded') ,accelerator: utils.getStoreValue("general.keybindings.recentAdd").join('+'), click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-recentlyadded')`) }, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.songs'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.songs'), accelerator: utils.getStoreValue("general.keybindings.songs").join('+'), click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-songs')`) }, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.albums'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.albums'), accelerator: utils.getStoreValue("general.keybindings.albums").join('+'), click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-albums')`) }, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.artists'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.artists'), accelerator: utils.getStoreValue("general.keybindings.artists").join('+'), click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-artists')`) }, @@ -105,29 +118,16 @@ export default class Thumbar { label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.window'), submenu: [ {role: 'minimize', label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.minimize')}, + {type: 'separator'}, ...(this.isMac ? [ { label: 'Show', click: () => utils.getWindow().show() }, - {role: 'toggleDevTools'}, + {role: 'zoom'}, {type: 'separator'}, - { - label:'Zoom', - submenu: [ - {role: 'zoom'}, - {role: 'resetZoom'}, - {role: 'zoomIn'}, - {role: 'zoomOut'}, - ] - }, - {type: 'separator'}, - {role: 'togglefullscreen'}, - - - {type: 'separator'}, - {role: 'front'}, - {role: 'close'}, + {role: 'front'}, + {role: 'close'}, { label: 'Edit', submenu: [ @@ -139,29 +139,74 @@ export default class Thumbar { {role: 'paste'}, ] }, - ] : [ + {type: 'separator'}, + ] : [ ]), + ...(this.isNotMac ? [ + + { + label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.zoom'), + submenu: [ + { + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.zoomin'), + role: 'zoomIn', + accelerator: utils.getStoreValue("general.keybindings.zoomn").join('+') + + }, + { + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.zoomout'), + role: 'zoomOut', + accelerator: utils.getStoreValue("general.keybindings.zoomt").join('+') + + }, + { + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.zoomreset'), + role: 'resetZoom', + accelerator: utils.getStoreValue("general.keybindings.zoomrst").join('+') + } + ] + }, + {type: 'separator'}, + { + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.fullscreen'), + accelerator: 'Control+Enter', + role: 'togglefullscreen' + }, + {type: 'separator'}, + { + label: utils.getLocale(utils.getStoreValue('general.language'), 'action.close'), + accelerator: 'Control+W', + role: 'close' + }, {type:'separator'}, - {role: 'reload', label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.reload')}, - {role: 'forceReload', label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.forcereload')}, - ]), - ] + { + label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.reload'), + accelerator: 'Control+R', + role: 'reload' + }, + { + label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.forcereload'), + accelerator: 'Control+Shift+R', + role: 'forceReload' + }, + ] : []), + ], }, { label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.controls'), submenu: [ { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.playpause'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.playpause'), accelerator: 'Space', click: () => utils.getWindow().webContents.executeJavaScript(`app.SpacePause()`) }, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.next'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.next'), accelerator: 'CommandOrControl+Right', click: () => utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.next()`) }, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.previous'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.previous'), accelerator: 'CommandOrControl+Left', click: () => utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.previous()`) }, @@ -178,19 +223,19 @@ export default class Thumbar { }, {type: 'separator'}, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.cast'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.cast2'), accelerator: utils.getStoreValue("general.keybindings.castToDevices").join('+'), click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.castMenu = true`) }, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.webremote'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.webremote'), accelerator: utils.getStoreValue("general.keybindings.webRemote").join('+'), sublabel: 'Opens in external window', click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('remote-pair')`) }, {type: 'separator'}, { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.audio'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.audioSettings'), accelerator: utils.getStoreValue("general.keybindings.audioSettings").join('+'), click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.audioSettings = true`) }, @@ -207,7 +252,7 @@ export default class Thumbar { label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.account'), submenu: [ { - label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.accountsettings'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.accountSettings'), click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('apple-account-settings')`) }, { @@ -221,11 +266,11 @@ export default class Thumbar { role: 'help', submenu: [ { - label: utils.getLocale('Discord', 'menubar.options.discord'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.discord'), click: () => shell.openExternal("https://discord.gg/AppleMusic").catch(console.error) }, { - label: utils.getLocale('GitHub Wiki', 'menubar.options.github'), + label: utils.getLocale(utils.getStoreValue('general.language'), 'term.github'), click: () => shell.openExternal("https://github.com/ciderapp/Cider/wiki/Troubleshooting").catch(console.error) }, {type: 'separator'}, diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index eaf0860d..d4c2da18 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -80,6 +80,7 @@ const CiderAudio = { } } catch (e) { + console.debug("[Cider][MaikiwiSoundCheck] normalizer func err: " + e) } }, normalizerOff: function () { @@ -619,89 +620,54 @@ const CiderAudio = { switch (app.cfg.audio.maikiwiAudio.ciderPPE_value) { case "MAIKIWI": - try { - switch (localStorage.getItem("playingBitrate")) { - case "64": - CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); - CiderAudio.audioNodes.llpw[0].normalize = false; - fetch('./cideraudio/impulses/CAP_64.wav').then(async (impulseData) => { - let bufferedImpulse = await impulseData.arrayBuffer(); - CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); - }); - console.debug("[Cider][Audio] CAP Adaptive - 64kbps"); - - break; - case "256": - CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false; - CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37; // Post Gain Compensation - CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]); - fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => { - let bufferedImpulse = await impulseData.arrayBuffer(); - CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); - }); - console.debug("[Cider][Audio] CAP Adaptive - 256kbps_2_48k"); - - break; - default: - CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false; - CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37; // Post Gain Compensation - CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]); - fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => { - let bufferedImpulse = await impulseData.arrayBuffer(); - CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); - }); - console.debug("[Cider][Audio] CAP Adaptive - CONFIG FALLBACK - 256kbps_2_48k"); + try { + switch (localStorage.getItem("playingBitrate")) { + case "64": + CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); + CiderAudio.audioNodes.llpw[0].normalize = false; + fetch('./cideraudio/impulses/CAP_64.wav').then(async (impulseData) => { + let bufferedImpulse = await impulseData.arrayBuffer(); + CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); + }); + console.debug("[Cider][Audio] CAP Adaptive - 64kbps"); + + break; + case "256": + CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false; + CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37; // Post Gain Compensation + CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]); + fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => { + let bufferedImpulse = await impulseData.arrayBuffer(); + CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); + }); + console.debug("[Cider][Audio] CAP Adaptive - 256kbps_2_48k"); + + break; + default: + CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false; + CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37; // Post Gain Compensation + CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]); + fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => { + let bufferedImpulse = await impulseData.arrayBuffer(); + CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); + }); + console.debug("[Cider][Audio] CAP Adaptive - CONFIG FALLBACK - 256kbps_2_48k"); - break; - } - - } catch (e) { - CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false; - CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37; - CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]); - fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => { - let bufferedImpulse = await impulseData.arrayBuffer(); - CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); - }); - console.debug("[Cider][Audio] CAP Adaptive - (Error Fallback) 256kbps"); - } - - switch (destination) { - case "spatial": - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { } - break; - case "n5": - try { - CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer2); - console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2"); - } catch (e) { } - break; - case 'n4': - try { - CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer1); - console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1"); - } catch (e) { } - break; - - case 'n3': - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]); - console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { } - break; - case 'n2': - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { } - break; - case 'n1': - try { - CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.llpw[0]); - console.debug("[Cider][Audio] llpw_n1 -> llpw"); - } catch (e) { } - break; - case 'n0': - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { } - break; + break; } - - break; + + } catch (e) { + CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false; + CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37; + CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]); + fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => { + let bufferedImpulse = await impulseData.arrayBuffer(); + CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); + }); + console.debug("[Cider][Audio] CAP Adaptive - (Error Fallback) 256kbps"); + } + + break; case "MAIKIWI_LEGACY": CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false; @@ -709,41 +675,6 @@ const CiderAudio = { let bufferedImpulse = await impulseData.arrayBuffer(); CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); }); - - switch (destination) { - case "spatial": - try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { } - break; - case "n5": - try { - CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer2); - console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2"); - } catch (e) { } - break; - case 'n4': - try { - CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer1); - console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1"); - } catch (e) { } - break; - case 'n1': - try { - CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[0]); - console.debug("[Cider][Audio] llpw_n1 -> llpw"); - } catch (e) { } - break; - case 'n3': - try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.vibrantbassNode[0]); - console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { } - break; - case 'n2': - try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { } - break; - case 'n0': - try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { } - break; - } - console.debug("[Cider][Audio] CAP - Maikiwi Signature Mode"); break; case "NATURAL": @@ -754,41 +685,6 @@ const CiderAudio = { CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); }); - switch (destination) { - case "spatial": - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { } - break; - case "n5": - try { - CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer2); - console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2"); - } catch (e) { } - break; - case 'n4': - try { - CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer1); - console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1"); - } catch (e) { } - break; - case 'n1': - try { - CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[0]); - console.debug("[Cider][Audio] llpw_n1 -> llpw"); - } catch (e) { } - break; - case 'n3': - try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.vibrantbassNode[0]); - console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { } - break; - case 'n2': - try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { } - break; - case 'n0': - try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { } - break; - - } - console.debug("[Cider][Audio] CAP - Natural Mode"); break; @@ -803,41 +699,7 @@ const CiderAudio = { for (let i = 1; i < LLPW_FREQUENCIES.length; i ++) { CiderAudio.audioNodes.llpw[i-1].connect(CiderAudio.audioNodes.llpw[i]); } - - switch (destination) { - case "spatial": - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { } - break; - case "n5": - try { - CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer2); - console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2"); - } catch (e) { } - break; - case 'n4': - try { - CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer1); - console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1"); - } catch (e) { } - break; - case 'n1': - try { - CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.llpw[0]); - console.debug("[Cider][Audio] llpw_n1 -> llpw"); - } catch (e) { } - break; - case 'n3': - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]); - console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { } - break; - case 'n2': - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { } - break; - case 'n0': - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { } - break; - } - console.debug("[Cider][Audio] CAP - Legacy Mode"); + console.debug("[Cider][Audio] CAP - Legacy Mode"); break; @@ -851,42 +713,43 @@ const CiderAudio = { }); app.cfg.audio.maikiwiAudio.ciderPPE_value = "MAIKIWI"; - switch (destination) { - case "spatial": - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { } - break; - case "n5": - try { - CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.atmosphereRealizer2); - console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2"); - } catch (e) { } - break; - case 'n4': - try { - CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.atmosphereRealizer1); - console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1"); - } catch (e) { } - break; - case 'n1': - try { - CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.llpw[0]); - console.debug("[Cider][Audio] llpw_n1 -> llpw"); - } catch (e) { } - break; - case 'n3': - try { CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.vibrantbassNode[0]); - console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { } - break; - case 'n2': - try { CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { } - break; - case 'n0': - try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { } - break; - } console.debug("[Cider][Audio] CAP - Maikiwi Adaptive Mode (Defaulted from broki config)"); break; } + + switch (destination) { + case "spatial": + try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { } + break; + case "n5": + try { + CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer2); + console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2"); + } catch (e) { } + break; + case 'n4': + try { + CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer1); + console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1"); + } catch (e) { } + break; + case 'n3': + try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]); + console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { } + break; + case 'n2': + try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { } + break; + case 'n1': + try { + CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.llpw[0]); + console.debug("[Cider][Audio] llpw_n1 -> llpw"); + } catch (e) { } + break; + case 'n0': + try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { } + break; + } } }, diff --git a/src/renderer/less/elements.less b/src/renderer/less/elements.less index 1604effa..e43e8a6c 100644 --- a/src/renderer/less/elements.less +++ b/src/renderer/less/elements.less @@ -400,15 +400,15 @@ .listitem-content { width: 100%; - height: 60px; - display: flex; - flex: 0 0 auto; - flex-direction: row; - font-size: 14px; - justify-content: center-between; - align-items: center; - border-radius: var(--mediaItemRadius); - position: relative; + height: 60px; + display: flex; + flex: 0 0 auto; + flex-direction: row; + font-size: 14px; + justify-content: center-between; + align-items: center; + border-radius: var(--mediaItemRadius); + position: relative; } &:hover { @@ -444,6 +444,7 @@ .mediaitem-artwork { border-radius: var(--mediaItemRadiusSmall); } + .overlay-play { background: rgba(0, 0, 0, 0.5); opacity: 0; @@ -957,6 +958,7 @@ /* mediaitem-square */ .cd-mediaitem-square { + --transitionDuration: .25s; --scaleRate: 1.25; --scaleRateArtwork: 1; width: 200px; @@ -968,6 +970,7 @@ justify-content: center; align-items: center; border-radius: 6px; + transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; .artwork-container { position: relative; @@ -982,6 +985,7 @@ flex: 0 0 auto; margin: 6px; cursor: pointer; + transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; .mediaitem-artwork { box-shadow: unset; @@ -1055,16 +1059,33 @@ } } - @media (min-width: 1600px) { - width: calc(200px * var(--scaleRate)); - height: calc(200px * var(--scaleRate)); + &:not(.mediaitem-card):not(.mediaitem-brick):not(.mediaitem-video):not(.noscale) { + @media (min-width: 1460px) { + --scaleRate: 1.1; + --scaleRateArtwork: 0.9; + width: calc(200px * var(--scaleRate)); + height: calc(200px * var(--scaleRate)); - .artwork-container > .artwork { - width: calc(190px * var(--scaleRateArtwork)); - height: calc(190px * var(--scaleRateArtwork)); + .artwork-container > .artwork { + width: calc(190px * var(--scaleRateArtwork)); + height: calc(190px * var(--scaleRateArtwork)); + } + } + + @media (min-width: 1550px) { + --scaleRate: 1.25; + --scaleRateArtwork: 1; + width: calc(200px * var(--scaleRate)); + height: calc(200px * var(--scaleRate)); + + .artwork-container > .artwork { + width: calc(190px * var(--scaleRateArtwork)); + height: calc(190px * var(--scaleRateArtwork)); + } } } + .info-rect { width: 90%; height: 100%; @@ -1112,8 +1133,6 @@ } &.mediaitem-video { - --scaleRate: 1.25; - --scaleRateArtwork: 1.25; height: 200px; width: 240px; @@ -1122,13 +1141,29 @@ width: 212px; } - @media (min-width: 1600px) { - width: calc(240px * var(--scaleRate)); - height: calc(200px * var(--scaleRate)); - - .artwork-container > .artwork { - width: calc(212px * var(--scaleRateArtwork)); - height: calc(120px * var(--scaleRateArtwork)); + &:not(.noscale) { + @media (min-width: 1460px) { + --scaleRate: 1.1; + --scaleRateArtwork: 1.1; + width: calc(240px * var(--scaleRate)); + height: calc(200px * var(--scaleRate)); + + .artwork-container > .artwork { + width: calc(220px * var(--scaleRateArtwork)); + height: calc(123px * var(--scaleRateArtwork)); + } + } + + @media (min-width: 1550px) { + --scaleRate: 1.25; + --scaleRateArtwork: 1.25; + width: calc(240px * var(--scaleRate)); + height: calc(200px * var(--scaleRate)); + + .artwork-container > .artwork { + width: calc(220px * var(--scaleRateArtwork)); + height: calc(123px * var(--scaleRateArtwork)); + } } } } @@ -1141,6 +1176,32 @@ height: 123px; width: 220px; } + + &:not(.noscale) { + @media (min-width: 1460px) { + --scaleRate: 1.1; + --scaleRateArtwork: 1.1; + width: calc(240px * var(--scaleRate)); + height: calc(200px * var(--scaleRate)); + + .artwork-container > .artwork { + width: calc(220px * var(--scaleRateArtwork)); + height: calc(123px * var(--scaleRateArtwork)); + } + } + + @media (min-width: 1550px) { + --scaleRate: 1.25; + --scaleRateArtwork: 1.25; + width: calc(240px * var(--scaleRate)); + height: calc(200px * var(--scaleRate)); + + .artwork-container > .artwork { + width: calc(220px * var(--scaleRateArtwork)); + height: calc(123px * var(--scaleRateArtwork)); + } + } + } } &.mediaitem-small { @@ -1169,7 +1230,7 @@ overflow: hidden; border-radius: 0px; margin: 0; - + transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear, filter 0.2s ease-in-out; .mediaitem-artwork { border-radius: 0px; @@ -1183,6 +1244,8 @@ padding: 10px 10px 14px; position: relative; width: 100%; + display: grid; + align-content: center; &::before { background: var(--bgartwork); @@ -1197,6 +1260,7 @@ z-index: 0; opacity: 1; filter: brightness(0.5) blur(50px) saturate(180%); + transition: filter 0.2s ease-in-out; } } @@ -1211,7 +1275,7 @@ & + .subtitle { max-height: none !important; - margin-top: -0.5em; + // margin-top: -0.5em; } } @@ -1241,14 +1305,34 @@ border-radius: inherit; } - //@media (min-width: 1600px) { - // width: calc(230px * 1.25); - // height: calc(298px * 1.25); - // .artwork-container>.artwork { - // width: calc(230px * 1.25); - // height: calc(230px * 1.25); - // } - //} + &:hover { + .artwork{ + filter: brightness(0.8); + } + .info-rect-card::before { + filter: brightness(0.3) blur(50px) saturate(180%); + } + } + + &:not(.noscale) { + @media (min-width: 1460px) { + width: calc(230px * 1.1); + height: calc(298px * 1.1); + .artwork-container > .artwork { + width: calc(230px * 1.1); + height: calc(230px * 1.1); + } + } + + @media (min-width: 1550px) { + width: calc(230px * 1.25); + height: calc(298px * 1.25); + .artwork-container > .artwork { + width: calc(230px * 1.25); + height: calc(230px * 1.25); + } + } + } } } diff --git a/src/renderer/less/helpers.less b/src/renderer/less/helpers.less index 73ee3d45..1350f7f0 100644 --- a/src/renderer/less/helpers.less +++ b/src/renderer/less/helpers.less @@ -153,22 +153,8 @@ } .close-btn { - width : 50px; - height : 100%; - background-image : var(--gfx-closeBtn); - background-position: center; - background-repeat : no-repeat; - -webkit-app-region : no-drag; - appearance : none; - border : 0; - background-color : transparent; - position : absolute; - top : 0; - right : 0; + .menu-panel.menu-header-text.close-btn - &:hover { - background-color: rgb(196, 43, 28) - } } } } @@ -191,22 +177,7 @@ } .close-btn { - width : 50px; - height : 100%; - background-image : var(--gfx-closeBtn); - background-position: center; - background-repeat : no-repeat; - -webkit-app-region : no-drag; - appearance : none; - border : 0; - background-color : transparent; - position : absolute; - top : 0; - right : 0; - - &:hover { - background-color: rgb(196, 43, 28) - } + .menu-panel.menu-header-text.close-btn } } @@ -371,23 +342,31 @@ } } - .menu-header-text { margin: 18px 6px; .close-btn { - width : 50px; - height : 42px; - background-image : var(--gfx-closeBtn); + width: 36px; + height: 36px; background-position: center; - background-repeat : no-repeat; - -webkit-app-region : no-drag; - appearance : none; - border : 0; - background-color : transparent; - position : absolute; - top : 0; - right : 0; + background-repeat: no-repeat; + -webkit-app-region: no-drag; + appearance: none; + border: 0; + background-color: transparent; + position: absolute; + top: 10px; + right: 10px; + border-radius: 50px; + display: grid; + align-content: center; + + &:before { + content: ""; + font-family: "codicon"; + color: var(--textColor); + font-size: 20px; + } &:hover { background-color: rgb(196, 43, 28) @@ -505,7 +484,8 @@ .popover-artwork { width: 200px; height: 200px; - margin: 0 0 20px 0; + margin: 0 auto; + margin-bottom: 20px; } .song-name { diff --git a/src/renderer/less/linux.less b/src/renderer/less/linux.less index dc0be238..777e9cd0 100644 --- a/src/renderer/less/linux.less +++ b/src/renderer/less/linux.less @@ -3,4 +3,57 @@ body[platform="linux"] { #window-controls-container { //display: none; } + + .window-controls { + justify-content: flex-end; + align-items : center; + padding-right : 6px; + + >div { + --iconSize: 16px; + + &.close, + &.minmax, + &.minimize, + &.minmax.restore { + background-image: unset!important; + position : relative; + display : grid; + align-content : center; + text-align : center; + height : 36px!important; + width : 36px!important; + border-radius : 50px; + transition: background-color .1s ease-in-out; + + &:hover { + background: rgb(200 200 200 / 10%)!important; + } + } + + &.close::before { + font-family: "codicon"; + font-size : var(--iconSize); + content : ""; + } + + &.minmax::before { + font-family: "codicon"; + font-size : var(--iconSize); + content : ""; + } + + &.minimize::before { + font-family: "codicon"; + font-size : var(--iconSize); + content : ""; + } + + &.restore::before { + font-family: "codicon"; + font-size : var(--iconSize); + content : ""; + } + } + } } \ No newline at end of file diff --git a/src/renderer/less/pages.less b/src/renderer/less/pages.less index 3abcb2c9..859565b7 100644 --- a/src/renderer/less/pages.less +++ b/src/renderer/less/pages.less @@ -288,6 +288,7 @@ .podcast-header { text-align: center; + padding: 0 1rem; } .podcast-play-btn { @@ -634,7 +635,7 @@ opacity : .7; animation : playlistArtworkFadeIn 1s var(--appleEase); - .artworkMaterial>img { + .artworkMaterial img { filter : brightness(100%) blur(80px) saturate(100%) contrast(1); object-position: center; object-fit : cover; @@ -696,6 +697,16 @@ width : 60vw; } + .descriptionEdit { + font-size : 14px; + flex-shrink : unset; + background : transparent; + border : 0px; + color : inherit; + font-family : inherit; + width : 60vw; + } + .playlist-artist { font-size : 20px; margin-bottom: 6px; @@ -962,6 +973,10 @@ right : 28px; } + &.animated .artist-header { + min-height: 500px; + } + .artist-header { //background: linear-gradient(45deg, var(--keyColor), #0e0e0e); color : white; @@ -977,6 +992,19 @@ // margin-top: -16px; } + .artist-hero { + height:100%; + position: absolute; + top:0; + left:0; + right:0; + bottom:0; + + .mediaitem-artwork { + border-radius: 0px; + } + } + .artworkContainer { position : absolute; @@ -990,7 +1018,7 @@ opacity : .7; animation : playlistArtworkFadeIn 1s var(--appleEase); - .artworkMaterial>img { + .artworkMaterial img { filter : brightness(100%) blur(80px) saturate(100%) contrast(1); object-position: center; object-fit : cover; @@ -1013,6 +1041,7 @@ position : absolute; overflow : hidden; box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset; + z-index: 1; video { overflow : hidden; @@ -1879,4 +1908,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/renderer/main/app.js b/src/renderer/main/app.js index 476dfa47..097c0556 100644 --- a/src/renderer/main/app.js +++ b/src/renderer/main/app.js @@ -17,14 +17,26 @@ window.CiderCache = CiderCache window.CiderFrontAPI = CiderFrontAPI window.wsapi = wsapi +if (app.cfg.advanced.disableLogging === true) { + window.console = { + log: function() {}, + error: function() {}, + warn: function() {}, + assert: function() {}, + debug: function() {} + } +} + + // Mount Vue to #app app.$mount("#app") // Init CiderAudio -if (app.cfg.advanced.AudioContext){ - CiderAudio.init() +if (app.cfg.advanced.AudioContext === false){ + app.cfg.advanced.AudioContext === true; } +CiderAudio.init() // Import gamepad support app.simulateGamepad = simulateGamepad app.spawnMica = spawnMica diff --git a/src/renderer/main/events.js b/src/renderer/main/events.js index 24fe826b..52191c5d 100644 --- a/src/renderer/main/events.js +++ b/src/renderer/main/events.js @@ -24,7 +24,7 @@ const Events = { // CTRL + R if (event.keyCode === 82 && event.ctrlKey) { event.preventDefault() - bootbox.confirm("Reload Cider?", (res)=>{ + bootbox.confirm(app.getLz('term.reload'), (res)=>{ if (res) { window.location.reload() } @@ -91,8 +91,6 @@ const Events = { setTimeout(refreshFocus, 200); } - app.getHTMLStyle() - refreshFocus(); } } diff --git a/src/renderer/main/vueapp.js b/src/renderer/main/vueapp.js index 94a39304..a0c7fb55 100644 --- a/src/renderer/main/vueapp.js +++ b/src/renderer/main/vueapp.js @@ -325,11 +325,7 @@ const app = new Vue({ let advancedTooltip = this.cfg.audio.dBSPL ? (Number(this.cfg.audio.dBSPLcalibration) + (Math.log10(this.mk.volume) * 20)).toFixed(2) + ' dB SPL' : (Math.log10(this.mk.volume) * 20).toFixed(2) + ' dBFS' return this.cfg.audio.advanced ? advancedTooltip : (this.mk.volume * 100).toFixed(0) + '%' }, - mainMenuVisibility(val, isContextMenu) { - if (this.chrome.sidebarCollapsed && !isContextMenu) { - this.chrome.sidebarCollapsed = false - return - } + mainMenuVisibility(val) { if (val) { (this.mk.isAuthorized) ? this.chrome.menuOpened = !this.chrome.menuOpened : false; if (!this.mk.isAuthorized) { @@ -440,6 +436,9 @@ const app = new Vue({ } }) }, + quit() { + ipcRenderer.invoke("quit-app") + }, async openAppleMusicURL(url) { let properties = MusicKit.formattedMediaURL(url) let item = { @@ -527,11 +526,6 @@ const app = new Vue({ navigateForward() { history.forward() }, - getHTMLStyle() { - - ipcRenderer.send("setScreenScale", app.cfg.visual.uiScale); - - }, resetState() { this.menuPanel.visible = false; app.selectedMediaItems = []; @@ -874,6 +868,7 @@ const app = new Vue({ try { //CiderAudio.audioNodes.gainNode.gain.value = (Math.min(Math.pow(10, (replaygain.gain / 20)), (1 / replaygain.peak))) CiderAudio.audioNodes.gainNode.gain.value = gain + CiderAudio.hierarchical_loading(); } catch (e) { } } @@ -922,54 +917,69 @@ const app = new Vue({ } }) + // Used for Live Radio stations to set Metadata + this.mk.addEventListener(MusicKit.Events.timedMetadataDidChange, (e) => { + app.mk.nowPlayingItem.attributes.name = e.title + app.mk.nowPlayingItem.attributes.artistName = e.performer + app.mk.nowPlayingItem.attributes.albumName = e.album + if(e.links[1]) { + app.currentArtUrl = e.links[1].url + app.currentArtUrlRaw = e.links[1].url + }else{ + app.currentArtUrl = e.links[0].url + app.currentArtUrlRaw = e.links[0].url + } + app.mk.nowPlayingItem._songId = e._adamId ? e._adamId : -1 + app.mk.nowPlayingItem.id = e._adamId ? e._adamId : -1 + }) + this.mk.addEventListener(MusicKit.Events.nowPlayingItemDidChange, (a) => { if (self.$refs.queue) { self.$refs.queue.updateQueue(); } this.currentSongInfo = a + if (this.currentSongInfo === null || this.currentSongInfo === undefined) {return;} // EVIL EMPTY OBJECTS BE GONE + console.debug("songinfo: " + JSON.stringify(a)) if (app.cfg.advanced.AudioContext) { try { if (app.mk.nowPlayingItem.flavor.includes("64")) { - if (localStorage.getItem("playingBitrate") !== "64") { - localStorage.setItem("playingBitrate", "64") - CiderAudio.hierarchical_loading(); - } + localStorage.setItem("playingBitrate", "64") } else if (app.mk.nowPlayingItem.flavor.includes("256")) { - if (localStorage.getItem("playingBitrate") !== "256") { - localStorage.setItem("playingBitrate", "256") - CiderAudio.hierarchical_loading(); - } + localStorage.setItem("playingBitrate", "256") } else { localStorage.setItem("playingBitrate", "256") - CiderAudio.hierarchical_loading(); } } catch (e) { localStorage.setItem("playingBitrate", "256") - CiderAudio.hierarchical_loading(); - } + } + if (!app.cfg.audio.normalization) {CiderAudio.hierarchical_loading();} + } - + if (app.cfg.audio.normalization) { // get unencrypted audio previews to get SoundCheck's normalization tag try { let previewURL = null try { - previewURL = app.mk.nowPlayingItem.previewURL + previewURL = app.mk.nowPlayingItem.previewURL } catch (e) { } if (previewURL == null && ((app.mk.nowPlayingItem?._songId ?? (app.mk.nowPlayingItem["songId"] ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id)) != -1)) { app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/songs/${app.mk.nowPlayingItem?._songId ?? (app.mk.nowPlayingItem["songId"] ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id)}`).then((response) => { - previewURL = response.data.data[0].attributes.previews[0].url + previewURL = response.data.data[0].attributes.previews[0].url if (previewURL) + console.debug("[Cider][MaikiwiSoundCheck] previewURL response.data.data[0].attributes.previews[0].url: " + previewURL) ipcRenderer.send('getPreviewURL', previewURL) }) } else { if (previewURL) + console.debug("[Cider][MaikiwiSoundCheck] previewURL in app.mk.nowPlayingItem.previewURL: " + previewURL) ipcRenderer.send('getPreviewURL', previewURL) } } catch (e) { + if (e instanceof TypeError === false) {console.debug("[Cider][MaikiwiSoundCheck] normalizer function err: " + e)} } } @@ -1172,9 +1182,20 @@ const app = new Vue({ }, getAppClasses() { let classes = {} - if (this.cfg.advanced.experiments.includes('compactui')) { - classes.compact = true + switch (this.getThemeDirective('forceUI') ?? "none") { + case "compact": + classes.compact = true; + break; + case "standard": + classes.compact = false; + break; + default: + if (this.cfg.advanced.experiments.includes('compactui')) { + classes.compact = true; + } + break; } + if (this.cfg.visual.window_background_style == "none") { classes.simplebg = true } @@ -1430,6 +1451,12 @@ const app = new Vue({ action: () => { this.newPlaylistFolder() } + }, + { + name: app.getLz("action.refresh"), + action: ()=>{ + this.refreshPlaylists() + } } ] } @@ -1675,7 +1702,7 @@ const app = new Vue({ this.page = "" const artistData = await this.mkapi("artists", false, id, { "views": "featured-release,full-albums,appears-on-albums,featured-albums,featured-on-albums,singles,compilation-albums,live-albums,latest-release,top-music-videos,similar-artists,top-songs,playlists,more-to-hear,more-to-see", - "extend": "artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero", + "extend": "centeredFullscreenBackground,artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero", "extend[playlists]": "trackCount", "include[songs]": "albums", "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount", @@ -1982,14 +2009,21 @@ const app = new Vue({ }, async getNowPlayingItemDetailed(target) { + let nowPlayingItem = JSON.parse(JSON.stringify(this.mk.nowPlayingItem)) + if(nowPlayingItem.type === "radioStation" && app.mk.nowPlayingItem.id !== -1) { + nowPlayingItem.playParams = {kind: "songs"} + nowPlayingItem.attributes.playParams.catalogId = app.mk.nowPlayingItem.id + nowPlayingItem.attributes.playParams.id = app.mk.nowPlayingItem.id + nowPlayingItem.id = app.mk.nowPlayingItem.id + } try { - let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind, - (app.mk.nowPlayingItem.songId == -1), - (app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"], + let u = await app.mkapi(nowPlayingItem.playParams.kind, + (nowPlayingItem.songId == -1), + (nowPlayingItem.songId != -1) ? nowPlayingItem.songId : nowPlayingItem["id"], { "include[songs]": "albums,artists", l: app.mklang }); app.searchAndNavigate(u.data.data[0], target) } catch (e) { - app.searchAndNavigate(app.mk.nowPlayingItem, target) + app.searchAndNavigate(nowPlayingItem, target) } }, async searchAndNavigate(item, target) { @@ -2424,6 +2458,7 @@ const app = new Vue({ let library = [] let cacheId = "library-songs" let downloaded = null; + this.$store.commit("resetRecentlyAdded") if ((this.library.songs.downloadState == 2) && !force) { return } @@ -4312,7 +4347,15 @@ const app = new Vue({ this.showMenuPanel(menus[useMenu], event) try { - let result = await this.inLibrary([this.mk.nowPlayingItem]) + // if its a radio station, then change the attributes to match a song + const nowPlayingItem = JSON.parse(JSON.stringify(this.mk.nowPlayingItem)) + if(nowPlayingItem.type == "radioStation" && app.mk.nowPlayingItem.id != -1) { + nowPlayingItem.type = "song" + nowPlayingItem.attributes.playParams.catalogId = app.mk.nowPlayingItem.id + nowPlayingItem.attributes.playParams.id = app.mk.nowPlayingItem.id + nowPlayingItem.id = app.mk.nowPlayingItem.id + } + let result = await this.inLibrary([nowPlayingItem]) if (result[0].attributes.inLibrary) { menus.normal.items.find(x => x.id == 'addToLibrary').hidden = true menus.normal.items.find(x => x.id == 'removeFromLibrary').hidden = false diff --git a/src/renderer/main/vuex-store.js b/src/renderer/main/vuex-store.js index bb608759..f7c0b0be 100644 --- a/src/renderer/main/vuex-store.js +++ b/src/renderer/main/vuex-store.js @@ -19,6 +19,11 @@ const store = new Vuex.Store({ } }, mutations: { + resetRecentlyAdded(state) { + state.pageState.recentlyAdded.loaded = false; + state.pageState.recentlyAdded.nextUrl = null; + state.pageState.recentlyAdded.items = []; + }, setLCDArtwork(state, artwork) { state.artwork.playerLCD = artwork } diff --git a/src/renderer/style.less b/src/renderer/style.less index fb15e61b..5d45481c 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -1,9 +1,8 @@ @import url("assets/fonts/Pretendard/pretendardvariable.css"); -@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;300;400;500;700;900&display=swap'); -@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100;300;400;500;700;900&display=swap"); -@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+HK:wght@100;300;400;500;700;900&display=swap"); -@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;300;400;500;700;900&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100;300;400;500;700;900&display=swap"); @import url("less/appvars.less"); @import url("less/bootstrap-vue.min.less"); @import url("less/ameframework.less"); @@ -69,7 +68,7 @@ body { background-size: cover; background-position: center; background: #0000; - font-family: "Pretendard Variable", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-family: "Pretendard Variable", "Noto Sans JP", "Noto Sans KR", "Noto Sans TC", "Noto Sans SC", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; transition: opacity .10s var(--appleEase); } @@ -311,19 +310,19 @@ a.dropdown-item { overflow: hidden; pointer-events: none; - > img { + img { position: absolute; width: 200%; opacity: 0.5; filter: brightness(200%) blur(180px) saturate(280%) contrast(2); } - > img:first-child { + img:first-child { top: 0; left: 0; } - > img:last-child { + img:last-child { bottom: 0; right: 0; transform: rotate(180deg); @@ -1163,52 +1162,47 @@ input[type=range].web-slider::-webkit-slider-runnable-track { &-macos { width: 100px; } -} -.app-chrome .app-chrome-item > .window-controls > div { - height: 100%; - width: 32px; -} - -.app-chrome .app-chrome-item > .window-controls > div:hover { - background: rgb(200 200 200 / 10%); -} - -.app-chrome .app-chrome-item > .window-controls > div.close { - width: 100%; - height: 100%; - background-image: var(--gfx-closeBtn); - background-position: center; - background-repeat: no-repeat; - -webkit-app-region: no-drag; - - &:hover { - background-color: rgb(196, 43, 28) + > div { + height: 100%; + width: 32px; + &:hover { + background: rgb(200 200 200 / 10%); + } + &.close { + width: 100%; + height: 100%; + background-image: var(--gfx-closeBtn); + background-position: center; + background-repeat: no-repeat; + -webkit-app-region: no-drag; + + &:hover { + background-color: rgb(196, 43, 28) + } + } + &.minmax { + background-image: var(--gfx-maxBtn); + background-position: center; + background-repeat: no-repeat; + -webkit-app-region: no-drag; + width: 100%; + height: 100%; + } + &.minmax.restore { + background-image: var(--gfx-restoreBtn); + } + &.minimize { + background-image: var(--gfx-minBtn); + background-position: center; + background-repeat: no-repeat; + -webkit-app-region: no-drag; + width: 100%; + height: 100%; + } } } -.app-chrome .app-chrome-item > .window-controls > div.minmax { - background-image: var(--gfx-maxBtn); - background-position: center; - background-repeat: no-repeat; - -webkit-app-region: no-drag; - width: 100%; - height: 100%; -} - -.app-chrome .app-chrome-item > .window-controls > div.minmax.restore { - background-image: var(--gfx-restoreBtn); -} - -.app-chrome .app-chrome-item > .window-controls > div.minimize { - background-image: var(--gfx-minBtn); - background-position: center; - background-repeat: no-repeat; - -webkit-app-region: no-drag; - width: 100%; - height: 100%; -} - body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minimize { display: none; } @@ -1452,10 +1446,13 @@ div[data-type="musicVideo"] .info-rect .title::before { background-position: center; background-size: contain; background-repeat: no-repeat; - border-radius: 4px; + border-radius: var(--mediaItemRadiusSmall); flex: 0 0 auto; margin: 6px; image-rendering: -webkit-optimize-contrast; + .mediaitem-artwork { + border-radius: var(--mediaItemRadiusSmall); + } } .app-chrome .app-chrome-item > .app-playback-controls .actions { @@ -1656,7 +1653,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { overflow-x: hidden; display: flex; flex-flow: column; - font-family: "Pretendard Variable", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-family: "Pretendard Variable", "Noto Sans JP", "Noto Sans KR", "Noto Sans TC", "Noto Sans SC", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } .lyric-body .no-lyrics { @@ -1761,7 +1758,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { .lyrics-translation { font-size: 1.6rem; font-weight: 450; - font-family: "Pretendard Variable", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-family: "Pretendard Variable", "Noto Sans JP", "Noto Sans KR", "Noto Sans TC", "Noto Sans SC", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; filter: contrast(0.5); } @@ -3422,20 +3419,7 @@ body.no-gpu { } } -.keybindings-border { - padding-left: 15px; - padding-right: 15px; - border-style: solid; - border-radius: 5px; - border-color: #CBCBCB; -} -.keybinding-text { - width: 95px; - display: flex; - justify-content: center; - align-items: center; -} .qrimg { width: -webkit-fill-available; @@ -3475,22 +3459,7 @@ body.no-gpu { } .close-btn { - width: 50px; - height: 100%; - background-image: var(--gfx-closeBtn); - background-position: center; - background-repeat: no-repeat; - -webkit-app-region: no-drag; - appearance: none; - border: 0; - background-color: transparent; - position: absolute; - top: 0; - right: 0; - - &:hover { - background-color: rgb(196, 43, 28) - } + .menu-panel.menu-header-text.close-btn } } @@ -3609,14 +3578,31 @@ body[platform='darwin'] { display: none; } -.keybinds-page .md-option-header { - padding: 0px 0px; +.keybinds-page{ + + .md-option-header { + padding: 10px 0px; + border-bottom: unset; + border-top: unset; + font-weight: 600; + background: rgba(255, 255, 255, 0); + font-size: 2em; + } + + .md-option-header-sub { + padding: 15px 10px; border-bottom: unset; border-top: unset; - font-weight: 600; background: rgba(255, 255, 255, 0); - font-size: 2em; - } + font-weight: 600; + font-size: 1.7em; + } + + .md-option-line{ + padding: 15px 20px; + font-size: 0.90em; + } +} .content-inner.keybinds-page { top: var(--navigationBarHeight); diff --git a/src/renderer/themes/sweetener.less b/src/renderer/themes/sweetener.less index 18e029f4..1d40e315 100644 --- a/src/renderer/themes/sweetener.less +++ b/src/renderer/themes/sweetener.less @@ -57,10 +57,6 @@ .cd-mediaitem-square:not(.mediaitem-card) { transition : transform .2s var(--appleEase); transition-delay: .1s; - padding : 12px; - - // background-color: red; - height: 220px; .artwork-container {} @@ -73,9 +69,16 @@ transition-delay: .05s; } + .artwork-container { + transform : scale(0.962) translateZ(0); + transition : transform .1s var(--appleEase); + transition-delay: 0s; + transform-origin: center; + } + &:hover { .artwork-container { - transform : scale(1.1); + transform : scale(1.0); transition : transform .1s var(--appleEase); transition-delay: 0s; transform-origin: center; diff --git a/src/renderer/views/app/app-navigation.ejs b/src/renderer/views/app/app-navigation.ejs index 9ebaa5ed..31b44307 100644 --- a/src/renderer/views/app/app-navigation.ejs +++ b/src/renderer/views/app/app-navigation.ejs @@ -121,6 +121,14 @@ $root.getLz("term.logout") }} + + <%- include("../svg/x.svg") %> + + {{ + $root.getLz("term.quit") + }} + diff --git a/src/renderer/views/app/chrome-bottom.ejs b/src/renderer/views/app/chrome-bottom.ejs index 2a3ede26..2447fa3e 100644 --- a/src/renderer/views/app/chrome-bottom.ejs +++ b/src/renderer/views/app/chrome-bottom.ejs @@ -10,10 +10,10 @@
- +
- +
{{ mk.nowPlayingItem["attributes"]["name"] }}
{{ mk.nowPlayingItem["attributes"]["artistName"] }}
@@ -60,13 +60,27 @@
+
- - {{ convertTime(getSongProgress()) }} + + {{ convertTime(getSongProgress()) }} + --:-- - {{ convertTime(mk.currentPlaybackDuration) }} + {{ convertTime(mk.currentPlaybackDuration) }} + {{ getLz("term.live") }}
diff --git a/src/renderer/views/app/chrome-top.ejs b/src/renderer/views/app/chrome-top.ejs index b1f461a8..03c14b97 100644 --- a/src/renderer/views/app/chrome-top.ejs +++ b/src/renderer/views/app/chrome-top.ejs @@ -9,8 +9,8 @@
-
+
@@ -257,8 +269,8 @@
- +
\ No newline at end of file diff --git a/src/renderer/views/app/sidebar.ejs b/src/renderer/views/app/sidebar.ejs index dacff2c8..8d30c9dd 100644 --- a/src/renderer/views/app/sidebar.ejs +++ b/src/renderer/views/app/sidebar.ejs @@ -196,6 +196,7 @@ v-if="mk.shuffleMode == 0" @click="mk.shuffleMode = 1" :title="$root.getLz('term.enableShuffle')" + :class="$root.isDisabled() && 'disabled'" v-b-tooltip.hover.righttop > @@ -210,31 +212,26 @@
- - + + +
@@ -243,6 +240,7 @@ class="playback-button--small repeat" v-if="mk.repeatMode == 0" @click="mk.repeatMode = 1" + :class="$root.isDisabled() && 'disabled'" :title="$root.getLz('term.enableRepeatOne')" v-b-tooltip.hover > @@ -251,6 +249,7 @@ @click="mk.repeatMode = 2" v-else-if="mk.repeatMode == 1" :title="$root.getLz('term.disableRepeatOne')" + :class="$root.isDisabled() && 'disabled'" v-b-tooltip.hover > diff --git a/src/renderer/views/components/artist-chip.ejs b/src/renderer/views/components/artist-chip.ejs index 098f773a..eed505fc 100644 --- a/src/renderer/views/components/artist-chip.ejs +++ b/src/renderer/views/components/artist-chip.ejs @@ -1,7 +1,9 @@ diff --git a/src/renderer/views/components/fullscreen.ejs b/src/renderer/views/components/fullscreen.ejs index 658fdc2b..ee7f7ed2 100644 --- a/src/renderer/views/components/fullscreen.ejs +++ b/src/renderer/views/components/fullscreen.ejs @@ -14,7 +14,9 @@
@@ -52,39 +54,40 @@
-
- - -
-
- -
-
- - -
-
- -
-
- - - -
+
+ + +
+
+ +
+
+ + + +
+
+ +
+
+ + + +
+
@@ -149,6 +152,37 @@ return { app: this.$root, tabMode: "lyrics", + video: null + } + }, + async mounted() { + if (app.mk.nowPlayingItem._container.type == "albums") { + try { + const result = (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/${app.mk.nowPlayingItem._container.type}/${app.mk.nowPlayingItem._container.id}`, { + "fields": "editorialArtwork,editorialVideo", + })).data.data[0].attributes?.editorialVideo?.motionDetailSquare?.video + if (result) { + this.video = result + } else { + this.video = null + } + } catch (e) { + this.video = null + e = null + } + } else if (app.mk.nowPlayingItem._container.type == "library-albums") { + try { + const result = (await app.mk.api.v3.music(`/v1/me/library/albums/${app.mk.nowPlayingItem._container.id}/catalog` + , { "fields": "editorialArtwork,editorialVideo" })).data.data[0].attributes?.editorialVideo?.motionDetailSquare?.video + if (result) { + this.video = result + } else { + this.video = null + } + } catch (e) { + e = null + this.video = null + } } }, beforeMount() { diff --git a/src/renderer/views/components/mediaitem-square.ejs b/src/renderer/views/components/mediaitem-square.ejs index 385a463e..3ace5791 100644 --- a/src/renderer/views/components/mediaitem-square.ejs +++ b/src/renderer/views/components/mediaitem-square.ejs @@ -87,6 +87,11 @@ default: false, required: false }, + noScale: { + type: Boolean, + default: false, + required: false + }, 'contextExt': { type: Object, required: false }, }, data: function () { @@ -251,6 +256,10 @@ }, getClasses() { let type = [] + let classes = [] + if(this.noScale) { + classes.push("noscale") + } try { type = this.item.type @@ -263,25 +272,26 @@ } switch (type) { default: - return [] + break; case "editorial-elements": case "card": - return ["mediaitem-card"] + classes.push("mediaitem-card") break; case "385": // editorial - return ["mediaitem-brick"] + classes.push("mediaitem-brick") break; case "small": - return ["mediaitem-small"] + classes.push("mediaitem-small") break; case "music-videos": case "uploadedVideo": case "uploaded-videos": case "library-music-videos": - return "mediaitem-video"; + classes.push("mediaitem-video") break; } + return classes }, visibilityChanged: function (isVisible, entry) { this.isVisible = isVisible diff --git a/src/renderer/views/components/miniplayer.ejs b/src/renderer/views/components/miniplayer.ejs index a073e493..66c712d7 100644 --- a/src/renderer/views/components/miniplayer.ejs +++ b/src/renderer/views/components/miniplayer.ejs @@ -66,30 +66,40 @@
-
- - -
-
- -
-
- - -
-
- -
-
- - - -
+
+ + +
+
+ +
+
+ + + +
+
+ +
+
+ + + +
+
diff --git a/src/renderer/views/main.ejs b/src/renderer/views/main.ejs index dff0e197..1d691432 100644 --- a/src/renderer/views/main.ejs +++ b/src/renderer/views/main.ejs @@ -71,7 +71,7 @@
<%- include("../assets/cider-round.svg") %>
-
+
<%- include('app/chrome-top'); %> @@ -105,7 +105,8 @@ <% } %> - +