Merge branch 'dweymouth:main' into main

This commit is contained in:
Benoît Smith
2024-08-17 21:08:26 +02:00
committed by GitHub
15 changed files with 287 additions and 52 deletions
+22 -10
View File
@@ -5,6 +5,7 @@ import (
"fmt"
"log"
"os"
"runtime"
"sync"
"time"
@@ -14,6 +15,7 @@ import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/driver"
"fyne.io/fyne/v2/lang"
)
@@ -62,16 +64,26 @@ func main() {
}()
// slightly hacky workaround for https://github.com/fyne-io/fyne/issues/4964
workaroundWindowSize := sync.OnceFunc(func() {
time.Sleep(50 * time.Millisecond)
s := mainWindow.DesiredSize()
mainWindow.Window.Resize(s.Subtract(fyne.NewSize(4, 0)))
time.Sleep(50 * time.Millisecond)
mainWindow.Window.Resize(s) // back to desired size
})
fyneApp.Lifecycle().SetOnEnteredForeground(func() {
workaroundWindowSize()
})
if runtime.GOOS == "linux" {
workaroundWindowSize := sync.OnceFunc(func() {
go func() {
isWayland := false
mainWindow.Window.(driver.NativeWindow).RunNative(func(ctx any) {
_, isWayland = ctx.(*driver.WaylandWindowContext)
})
if !isWayland {
time.Sleep(50 * time.Millisecond)
s := mainWindow.DesiredSize()
mainWindow.Window.Resize(s.Subtract(fyne.NewSize(4, 0)))
time.Sleep(50 * time.Millisecond)
mainWindow.Window.Resize(s) // back to desired size
}
}()
})
fyneApp.Lifecycle().SetOnEnteredForeground(func() {
workaroundWindowSize()
})
}
mainWindow.ShowAndRun()
+2 -3
View File
@@ -133,12 +133,11 @@
"Playing": "Playing",
"Playlist": "Playlist",
"Playlists": "Playlists",
"playlist by": "playlist by",
"Plays": "Plays",
"Prevent clipping": "Prevent clipping",
"Previous": "Previous",
"Private": "Private",
"Public": "Public",
"Private playlist by": "Private playlist by",
"Public playlist by": "Public playlist by",
"Random": "Random",
"Rating": "Rating",
"reissued": "reissued",
+229
View File
@@ -0,0 +1,229 @@
{
"A new version is available": "Una nueva versión está disponible",
"About": "Acerca de",
"Add Server": "Agregar servidor",
"Add to playlist": "Agregar a la lista de reproducción",
"Add to queue": "Agregar a la cola",
"Album": "Álbum",
"album": "álbum",
"Album count": "Número de álbumes",
"Album Count": "Número de álbumes",
"Album filters": "Filtros de álbumes",
"Album gain": "Ganancia del álbum",
"Album info not available": "Información del álbum no disponible",
"Album peak": "Pico del álbum",
"Albums": "Álbumes",
"albums": "álbumes",
"All": "Todos",
"All Tracks": "Todas las pistas",
"Alt. URL": "URL alternativa",
"Are you sure you want to delete the server": "¿Estás seguro de que quieres eliminar el servidor?",
"Artist": "Artista",
"Artist (A-Z)": "Artista (A-Z)",
"Artists": "Artistas",
"Artist biography not available.": "Biografía del artista no disponible.",
"Audio device": "Dispositivo de audio",
"Audio Drama": "Drama de audio",
"Audiobook": "Audiolibro",
"Authentication failed": "Autenticación fallida",
"Auto": "Automático",
"Autoselect device": "Seleccionar dispositivo automáticamente",
"Back": "Atrás",
"Bit rate": "Tasa de bits",
"BPM": "BPM",
"Broadcast": "Transmisión",
"Cancel": "Cancelar",
"Check for Updates": "Buscar actualizaciones",
"Close": "Cerrar",
"Close to system tray": "Cerrar a la bandeja del sistema",
"Comment": "Comentario",
"Compilation": "Compilación",
"Composer": "Compositor",
"Configure your music server to add radio stations": "Configura tu servidor de música para agregar estaciones de radio",
"Confirm Delete Playlist": "Confirmar eliminación de la lista de reproducción",
"Confirm Delete Server": "Confirmar eliminación del servidor",
"Connect to Server": "Conectar al servidor",
"Connecting": "Conectando",
"Connecting to": "Conectando a",
"Content type": "Tipo de contenido",
"Could not reach server": "No se pudo conectar con el servidor",
"Create new playlist": "Crear nueva lista de reproducción",
"day": "día",
"days": "días",
"Delete Playlist": "Eliminar lista de reproducción",
"Demo": "Demo",
"Description": "Descripción",
"Disable server transcoding": "Desactivar transcodificación del servidor",
"Disc number": "Número de disco",
"Discography": "Discografía",
"discs": "discos",
"DJ-Mix": "Mezcla de DJ",
"Download": "Descargar",
"Download completed": "Descarga completa",
"Duration": "Duración",
"Edit": "Editar",
"Edit Playlist": "Editar lista de reproducción",
"Edit server": "Editar servidor",
"Enable system tray": "Habilitar bandeja del sistema",
"Enabled": "Habilitado",
"Enter": "Ingresar",
"EP": "EP",
"Equalizer": "Ecualizador",
"Exclusive mode": "Modo exclusivo",
"Favorites": "Favoritos",
"Field Recording": "Grabación en campo",
"File path": "Ruta al archivo",
"File size": "Tamaño del archivo",
"Filter albums": "Filtrar álbumes",
"Filter genres": "Filtrar géneros",
"Forward": "Siguiente",
"Frequently Played": "Reproducidas frequentemente",
"General": "General",
"Genre": "Género",
"Genres": "Géneros",
"Github page": "Página de Github",
"Go to release page": "Ir a la página de lanzamiento",
"Hide": "Ocultar",
"Home": "Inicio",
"Home Page": "Página de inicio",
"hr": "hr",
"hrs": "hrs",
"Internet Radio Stations": "Estaciones de radio por Internet",
"Interview": "Entrevista",
"Is favorite": "Es favorito",
"Is not favorite": "No es favorito",
"Last played": "Última reproducción",
"Live": "En vivo",
"Locally": "Localmente",
"Log Out": "Cerrar sesión",
"Login to Server": "Iniciar sesión en el servidor",
"Lyrics": "Letras",
"Lyrics not available": "Letras no disponibles",
"Menu": "Menú",
"min": "min",
"minutes of track have been played": "minutos de la pista han sido reproducidos",
"Mixtape": "Mixtape",
"Mute": "Silencio",
"My Server": "Mi servidor",
"Name": "Nombre",
"Name (A-Z)": "Nombre (A-Z)",
"Next": "Siguiente",
"Nickname": "Apodo",
"No new version found": "No se encontró nueva versión",
"No radio stations available": "No hay estaciones de radio disponibles",
"None": "Ninguno",
"none": "ninguno",
"none selected": "ninguno seleccionado",
"OK": "OK",
"optional": "opcional",
"or when": "o cuando",
"Password": "Contraseña",
"Pause": "Pausar",
"Paused": "Pausada",
"Peak Meter": "Medidor de picos",
"percent of track is played": "porciento de la pista ha sido reproducida",
"Play": "Reproducir",
"Play Artist Radio": "Reproducir mezcla del artista",
"Play count": "Número de reproducciones",
"Play Discography": "Reproducir discografía",
"Play next": "Reproducir siguiente",
"Play Queue": "Cola de reproducción",
"Play random": "Reproducir aleatorio",
"Playback": "Reproducción",
"Playing": "Reproduciendo",
"Playlist": "Lista de reproducción",
"Playlists": "Listas de reproducción",
"Plays": "Reproducciones",
"Prevent clipping": "Prevenir recortes",
"Previous": "Anterior",
"Private playlist by": "Lista de reproducción privada de",
"Public playlist by": "Lista de reproducción pública de",
"Random": "Aleatorio",
"Rating": "Calificación",
"reissued": "emitido nuevamente",
"Recently Added": "Agregado recientemente",
"Recently Played": "Reproducido recientemente",
"Related": "Relacionado",
"Reload": "Recargar",
"Remix": "Remix",
"Remove from playlist": "Remover de la lista de reproducción",
"ReplayGain mode": "Modo ReplayGain",
"ReplayGain preamp": "Preamp ReplayGain",
"Restart required": "Reinicio requerido",
"Save play queue on exit": "Guardar cola de reproducción al salir",
"Saved at": "Guardado en",
"Scrobble when": "Scrobble cuando",
"Search Everywhere": "Buscar en todas partes",
"Search page": "Buscar en la página",
"Search playlists or new playlist name": "Buscar listas de reproducción o nombre de nueva lista",
"sec": "seg",
"selected": "seleccionado",
"Send playback statistics to server": "Enviar estadísticas de reproducción al servidor",
"Server": "Servidor",
"Server Type": "Tipo de servidor",
"Server unreachable": "Servidor inalcanzable",
"Set rating": "Establecer calificación",
"Settings": "Configuración",
"Share": "Compartir",
"Share content": "Compartir contenido",
"Show": "Mostrar",
"Show info": "Mostrar información",
"Show notification on track change": "Mostrar notificación en cambio de pista",
"Show play queue": "Mostrar cola de reproducción",
"Show year in album grid cards": "Mostrar año en tarjetas de cuadrícula de álbumes",
"Shuffle": "Aleatorio",
"Shuffle albums": "Aleatorio álbumes",
"Shuffle tracks": "Aleatorio pistas",
"Similar artists": "Artistas similares",
"Single": "Sencillo",
"Size": "Tamaño",
"Skip duplicate tracks": "Saltar pistas duplicadas",
"Skip this version": "Saltar esta versión",
"Soundtrack": "Banda sonora",
"Spoken Word": "Palabra Hablada",
"Startup page": "Página de inicio",
"Stopped": "Detenida",
"Support the project": "Apoya el proyecto",
"Switch Servers": "Cambiar servidores",
"Testing connection": "Probando conexión",
"Theme": "Tema",
"Time": "Tiempo",
"Title": "Título",
"Title (A-Z)": "Título (A-Z)",
"Top Tracks": "Mejores Pistas",
"Total time": "Tiempo total",
"Track": "Pista",
"track": "pista",
"Track count": "Número de pistas",
"Track gain": "Ganancia de la pista",
"Track Info": "Información de la pista",
"Track number": "Número de pista",
"Track peak": "Pico de la pista",
"tracks": "pistas",
"UI Scaling": "Escalado de la interfaz",
"URL": "URL",
"Use legacy authentication": "Usar autenticación legacy",
"Username": "Nombre de usuario",
"version": "versión",
"Visualizations": "Visualizaciones",
"Volume": "Volumen",
"wrong URL": "URL incorrecta",
"wrong username/password": "nombre de usuario/contraseña incorrectos",
"Year": "Año",
"Year (ascending)": "Año (ascendente)",
"Year (descending)": "Año (descendente)",
"Year from": "Año desde",
"You are running the latest version of": "Estás ejecutando la última versión de",
"Quit": "Salir",
"Rescan Library": "Reescanear la biblioteca",
"Search": "Buscar",
"Owner": "Propietario",
"To server": "Al servidor",
"Fav.": "Fav.",
"Set favorite": "Establecer como favorito",
"Unset favorite": "Quitar de favoritos",
"Remove from queue": "Remover de la cola",
"Play song radio": "Reproducir canciones similares",
"to": "a",
"by": "por"
}
+2 -3
View File
@@ -133,12 +133,11 @@
"Playing": "Lecture en cours",
"Playlist": "Liste de lecture",
"Playlists": "Listes de lecture",
"playlist by": "liste de lecture créée par",
"Plays": "Lectures",
"Prevent clipping": "Empêcher le clipping",
"Previous": "Précédente",
"Private": "Privée",
"Public": "Publique",
"Private playlist by": "Liste de lecture privée créée par",
"Public playlist by": "Liste de lecture publique créée par",
"Random": "Aléatoire",
"Rating": "Notation",
"reissued": "ressorti",
+3 -4
View File
@@ -133,12 +133,11 @@
"Playing": "Riproduzione in corso",
"Playlist": "Playlist",
"Playlists": "Playlist",
"playlist by": "playlist by",
"Plays": "Nº ascolti",
"Prevent clipping": "Previeni clipping",
"Previous": "Precedente",
"Private": "Privata",
"Public": "Pubblica",
"Private playlist by": "Playlist privata by",
"Public playlist by": "Playlist pubblica by",
"Random": "Casuale",
"Rating": "Rating",
"reissued": "reissued",
@@ -155,7 +154,7 @@
"Saved at": "Salvato in",
"Scrobble when": "Scrobbla quando",
"Search Everywhere": "Cerca ovunque",
"Search page": "Pagina di ricerca",
"Search page": "Cerca nella pagina",
"Search playlists or new playlist name": "Cerca tra le playlist o creane una nuova",
"sec": "sec",
"selected": "selezionato",
+2 -3
View File
@@ -127,12 +127,11 @@
"Playing": "Odtwarza",
"Playlist": "Playlista",
"Playlists": "Playlisty",
"playlist by": "playlista przez",
"Plays": "Ilość odtworzeń",
"Prevent clipping": "Zapobiegnij przycicnaniu",
"Previous": "Poprzednie",
"Private": "Prywatna",
"Public": "Publiczne",
"Private playlist by": "Prywatna playlista przez",
"Public playlist by": "Publiczne playlista przez",
"Random": "Losowe",
"Rating": "Ocena",
"reissued": "odnowiony",
+3 -4
View File
@@ -133,12 +133,11 @@
"Playing": "Tocando",
"Playlist": "Lista de reprodução",
"Playlists": "Listas de reprodução",
"playlist by": "lista de reprodução por",
"Plays": "Reproduções",
"Prevent clipping": "Evitar clipping",
"Previous": "Anterior",
"Private": "Privado",
"Public": "Público",
"Private playlist by": "Lista de reprodução privado por",
"Public playlist by": "Lista de reprodução público por",
"Random": "Aleatório",
"Rating": "Classificação",
"reissued": "reeditado",
@@ -155,7 +154,7 @@
"Saved at": "Salvo em",
"Scrobble when": "Fazer scrobble quando",
"Search Everywhere": "Pesquisar em todos os lugares",
"Search page": "Página de pesquisa",
"Search page": "Pesquisar en página",
"Search playlists or new playlist name": "Pesquisar listas de reprodução ou criar uma nova",
"sec": "s",
"selected": "selecionado",
+3 -4
View File
@@ -127,12 +127,11 @@
"Playing": "Redare",
"Playlist": "Playlist",
"Playlists": "Playlist-uri",
"playlist by": "playlist de",
"Plays": "Redări",
"Prevent clipping": "Previne distorsiunea",
"Previous": "Anterior",
"Private": "Privat",
"Public": "Public",
"Private playlist by": "Playlist privat de",
"Public playlist by": "Playlist public de",
"Random": "Aleatoriu",
"Rating": "Rating",
"reissued": "reeditat",
@@ -148,7 +147,7 @@
"Saved at": "Salvat la",
"Scrobble when": "Scrobblare când",
"Search Everywhere": "Caută peste tot",
"Search page": "Pagină căutare",
"Search page": "Caută pagină",
"Search playlists or new playlist name": "Caută playlisturi sau nume de playlist nou",
"sec": "sec",
"selected": "selectat",
+2 -3
View File
@@ -127,12 +127,11 @@
"Playing": "正在播放",
"Playlist": "播放列表",
"Playlists": "播放列表",
"playlist by": "播放列表作者",
"Plays": "播放",
"Prevent clipping": "防止削波",
"Previous": "上一个",
"Private": "私人",
"Public": "公开",
"Private playlist by": "私人 播放列表作者",
"Public playlist by": "公开 播放列表作者",
"Random": "随机",
"Rating": "评分",
"reissued": "重新发行",
+2 -3
View File
@@ -127,12 +127,11 @@
"Playing": "正在播放",
"Playlist": "播放列表",
"Playlists": "播放列表",
"playlist by": "播放列表作者",
"Plays": "播放",
"Prevent clipping": "防止削波",
"Previous": "上一个",
"Private": "私人",
"Public": "公开",
"Private playlist by": "私人 播放列表作者",
"Public playlist by": "公开 播放列表作者",
"Random": "随机",
"Rating": "评分",
"reissued": "重新发行",
+2 -3
View File
@@ -127,12 +127,11 @@
"Playing": "正在播放",
"Playlist": "播放清單",
"Playlists": "播放清單",
"playlist by": "播放清單作者",
"Plays": "播放",
"Prevent clipping": "防止削波",
"Previous": "上一個",
"Private": "私人",
"Public": "公開",
"Private playlist by": "私人 播放清單作者",
"Public playlist by": "公開 播放清單作者",
"Random": "隨機",
"Rating": "評分",
"reissued": "重新發行",
+3 -4
View File
@@ -343,12 +343,11 @@ func (a *PlaylistPageHeader) Update(playlist *mediaprovider.PlaylistWithTracks)
}
func (a *PlaylistPageHeader) formatPlaylistOwnerStr(p *mediaprovider.PlaylistWithTracks) string {
pubPriv := lang.L("Public")
pubPriv := lang.L("Public playlist by")
if !p.Public {
pubPriv = lang.L("Private")
pubPriv = lang.L("Private playlist by")
}
playlistBy := lang.L("playlist by")
return fmt.Sprintf("%s %s %s", pubPriv, playlistBy, p.Owner)
return fmt.Sprintf("%s %s", pubPriv, p.Owner)
}
func (a *PlaylistPageHeader) formatPlaylistTrackTimeStr(p *mediaprovider.PlaylistWithTracks) string {
+2 -2
View File
@@ -78,7 +78,7 @@ func NewAddEditServerDialog(title string, cancelable bool, prefillServer *backen
nickField := widget.NewEntryWithData(binding.BindString(&a.Nickname))
nickField.SetPlaceHolder(lang.L("My Server"))
nickField.OnSubmitted = func(_ string) { focusHandler(hostField) }
a.submitBtn = widget.NewButton(lang.L("Enter"), a.doSubmit)
a.submitBtn = widget.NewButtonWithIcon(lang.L("Enter"), theme.ConfirmIcon(), a.doSubmit)
a.submitBtn.Importance = widget.HighImportance
a.promptText = widget.NewRichTextWithText("")
a.promptText.Hidden = true
@@ -88,7 +88,7 @@ func NewAddEditServerDialog(title string, cancelable bool, prefillServer *backen
bottomRow = container.NewHBox(
a.promptText,
layout.NewSpacer(),
widget.NewButton(lang.L("Cancel"), a.onCancel),
widget.NewButtonWithIcon(lang.L("Cancel"), theme.CancelIcon(), a.onCancel),
a.submitBtn)
} else {
bottomRow = container.NewHBox(
+9 -5
View File
@@ -6,6 +6,7 @@ import (
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/lang"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
"github.com/dweymouth/supersonic/backend/mediaprovider"
)
@@ -36,25 +37,28 @@ func NewEditPlaylistDialog(playlist *mediaprovider.Playlist, showPublicCheck boo
isPublicCheck.Hidden = !showPublicCheck
nameEntry := widget.NewEntryWithData(binding.BindString(&e.Name))
descriptionEntry := widget.NewEntryWithData(binding.BindString(&e.Description))
deleteBtn := widget.NewButton(lang.L("Delete Playlist"), func() {
deleteBtn := widget.NewButtonWithIcon(lang.L("Delete Playlist"), theme.DeleteIcon(), func() {
if e.OnDeletePlaylist != nil {
e.OnDeletePlaylist()
}
})
submitBtn := widget.NewButton(lang.L("OK"), func() {
submitBtn := widget.NewButtonWithIcon(lang.L("OK"), theme.ConfirmIcon(), func() {
if e.OnUpdateMetadata != nil {
e.OnUpdateMetadata()
}
})
submitBtn.Importance = widget.HighImportance
cancelBtn := widget.NewButton(lang.L("Cancel"), func() {
cancelBtn := widget.NewButtonWithIcon(lang.L("Cancel"), theme.CancelIcon(), func() {
if e.OnCanceled != nil {
e.OnCanceled()
}
})
title := widget.NewLabel(lang.L("Edit Playlist"))
title.Alignment = fyne.TextAlignCenter
title.TextStyle.Bold = true
e.container = container.NewVBox(
container.NewHBox(layout.NewSpacer(), widget.NewLabel(lang.L("Edit Playlist")), layout.NewSpacer()),
title,
container.New(layout.NewFormLayout(),
widget.NewLabel(lang.L("Name")),
nameEntry,
@@ -72,7 +76,7 @@ func NewEditPlaylistDialog(playlist *mediaprovider.Playlist, showPublicCheck boo
}
func (e *EditPlaylistDialog) MinSize() fyne.Size {
return fyne.NewSize(300, e.BaseWidget.MinSize().Height)
return fyne.NewSize(400, e.BaseWidget.MinSize().Height)
}
func (e *EditPlaylistDialog) CreateRenderer() fyne.WidgetRenderer {
+1 -1
View File
@@ -58,7 +58,7 @@ func NewLoginDialog(servers []*backend.ServerConfig, pwFetch PasswordFetchFunc)
editBtn := widget.NewButtonWithIcon("", theme.DocumentCreateIcon(), l.onEditServer)
newBtn := widget.NewButtonWithIcon("", theme.ContentAddIcon(), l.onNewServer)
deleteBtn := widget.NewButtonWithIcon("", theme.DeleteIcon(), func() { l.onDeleteServer(l.serverSelect.SelectedIndex()) })
l.submitBtn = widget.NewButton(lang.L("OK"), l.onSubmit)
l.submitBtn = widget.NewButtonWithIcon(lang.L("OK"), theme.ConfirmIcon(), l.onSubmit)
l.submitBtn.Importance = widget.HighImportance
l.promptText = widget.NewRichTextWithText("")
l.promptText.Segments[0].(*widget.TextSegment).Style.ColorName = theme.ColorNameError