From 1c22c9506e00f7848a378fd2eb166cdda8db4c26 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Mon, 7 Jul 2025 21:14:18 -0700 Subject: [PATCH 01/45] remove stale lock comments --- .github/workflows/stale.yml | 86 +++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 46 deletions(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index e50c47d5..c8322243 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -1,53 +1,47 @@ name: 'Close stale issues and PRs' on: - workflow_dispatch: - schedule: - - cron: '30 1 * * *' + workflow_dispatch: + schedule: + - cron: '30 1 * * *' permissions: - contents: read + contents: read jobs: - stale: - permissions: - issues: write - pull-requests: write - runs-on: ubuntu-latest - steps: - - uses: dessant/lock-threads@v5 - with: - process-only: 'issues, prs' - issue-inactive-days: 120 - pr-inactive-days: 120 - log-output: true - add-issue-labels: 'frozen-due-to-age' - add-pr-labels: 'frozen-due-to-age' - issue-comment: > - This issue has been automatically locked since there - has not been any recent activity after it was closed. - Please open a new issue for related bugs. - pr-comment: > - This pull request has been automatically locked since there - has not been any recent activity after it was closed. - Please open a new issue for related bugs. - - uses: actions/stale@v9 - with: - operations-per-run: 999 - days-before-issue-stale: 180 - days-before-pr-stale: 180 - days-before-issue-close: 30 - days-before-pr-close: 30 - stale-issue-message: > - This issue has been automatically marked as stale because it has not had recent activity. - The resources of the Feishin team are limited, and so we are asking for your help. + stale: + permissions: + issues: write + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@v5 + with: + process-only: 'issues, prs' + issue-inactive-days: 120 + pr-inactive-days: 120 + log-output: true + add-issue-labels: 'frozen-due-to-age' + add-pr-labels: 'frozen-due-to-age' + - uses: actions/stale@v9 + with: + operations-per-run: 999 + days-before-issue-stale: 180 + days-before-pr-stale: 180 + days-before-issue-close: 30 + days-before-pr-close: 30 + stale-issue-message: > + This issue has been automatically marked as stale because it has not had recent activity. The resources of the Feishin team are limited, and so we are asking for your help. - If this is a **bug** and you can still reproduce this error on the development branch, please reply with all of the information you have about it in order to keep the issue open. + If this is a **bug** and you can still reproduce this error on the development branch, please reply with all of the information you have about it in order to keep the issue open. - This issue will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions. - stale-pr-message: > - This PR has been automatically marked as stale because it has not had recent activity. - The resources of the Feishin team are limited, and so we are asking for your help. + This issue will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions. - This PR will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions. - stale-issue-label: 'stale' - exempt-issue-labels: 'enhancement,keep,security' - stale-pr-label: 'stale' - exempt-pr-labels: 'keep,security' + + stale-pr-message: > + This PR has been automatically marked as stale because it has not had recent activity. The resources of the Feishin team are limited, and so we are asking for your help. + + This PR will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions. + + + stale-issue-label: 'stale' + exempt-issue-labels: 'enhancement,keep,security' + stale-pr-label: 'stale' + exempt-pr-labels: 'keep,security' From 2492456b9373054ff6b705eaad90bd00d5dceae6 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Mon, 7 Jul 2025 21:28:34 -0700 Subject: [PATCH 02/45] fix search on filtered list pages --- src/renderer/hooks/use-display-refresh.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/hooks/use-display-refresh.ts b/src/renderer/hooks/use-display-refresh.ts index 25aefc20..21304cfb 100644 --- a/src/renderer/hooks/use-display-refresh.ts +++ b/src/renderer/hooks/use-display-refresh.ts @@ -60,13 +60,14 @@ export const useDisplayRefresh = ({ (e: ChangeEvent) => { const searchTerm = e.target.value === '' ? undefined : e.target.value; const updatedFilters = setFilter({ + customFilters, data: { searchTerm }, itemType, key: pageKey, }); return updatedFilters; }, - [itemType, pageKey, setFilter], + [customFilters, itemType, pageKey, setFilter], ); return { customFilters, filter, handlePlay, refresh, search }; From 0b7d4bfb6a23cdc1ea032b9382c714bc5eaf5337 Mon Sep 17 00:00:00 2001 From: Gemini Wen Date: Tue, 8 Jul 2025 14:00:21 +0800 Subject: [PATCH 03/45] macOS: change window close behavior, like other macOS App (#999) --- src/main/index.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/index.ts b/src/main/index.ts index 66075554..9e064074 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -421,9 +421,6 @@ async function createWindow(first = true): Promise { store.set('fullscreen', mainWindow?.isFullScreen()); if (!exitFromTray && store.get('window_exit_to_tray')) { - if (isMacOS() && !forceQuit) { - exitFromTray = true; - } event.preventDefault(); mainWindow?.hide(); } @@ -432,8 +429,6 @@ async function createWindow(first = true): Promise { event.preventDefault(); saved = true; - getMainWindow()?.webContents.send('renderer-save-queue'); - ipcMain.once('player-save-queue', async (_event, data: Record) => { const queueLocation = join(app.getPath('userData'), 'queue'); const serialized = JSON.stringify(data); @@ -457,12 +452,19 @@ async function createWindow(first = true): Promise { } catch (error) { console.error('error saving queue state: ', error); } finally { - mainWindow?.close(); + if (!isMacOS()) { + mainWindow?.close(); + } if (forceQuit) { app.exit(); } } }); + getMainWindow()?.webContents.send('renderer-save-queue'); + } else { + if (forceQuit) { + app.exit(); + } } }); From a5f28e49eb638421e6ff580638d5aa15b42f5b8b Mon Sep 17 00:00:00 2001 From: jeffvli Date: Mon, 7 Jul 2025 23:20:05 -0700 Subject: [PATCH 04/45] fix click propagation on PlayButton --- src/renderer/features/player/components/player-button.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/renderer/features/player/components/player-button.tsx b/src/renderer/features/player/components/player-button.tsx index 9071c8a0..120fed9e 100644 --- a/src/renderer/features/player/components/player-button.tsx +++ b/src/renderer/features/player/components/player-button.tsx @@ -61,7 +61,7 @@ interface PlayButtonProps extends Omit { } export const PlayButton = forwardRef( - ({ isPaused, ...props }: PlayButtonProps, ref) => { + ({ isPaused, onClick, ...props }: PlayButtonProps, ref) => { return ( ( iconProps={{ size: 'lg', }} + onClick={(e) => { + e.stopPropagation(); + onClick?.(e); + }} ref={ref} tooltip={{ label: isPaused From 1ec6176b77ed935e1c4bfa62852fb92d25be2776 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 8 Jul 2025 06:14:26 +0200 Subject: [PATCH 05/45] Translated using Weblate (Portuguese (Brazil)) Currently translated at 61.6% (419 of 680 strings) Co-authored-by: Hosted Weblate Co-authored-by: Renan Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/ Translation: feishin/Translation --- src/i18n/locales/pt-BR.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json index 13795ee2..ccd45ced 100644 --- a/src/i18n/locales/pt-BR.json +++ b/src/i18n/locales/pt-BR.json @@ -93,7 +93,9 @@ "albumPeak": "pico do álbum", "trackGain": "ganho da faixa", "additionalParticipants": "participantes adicionais", - "tags": "tags" + "tags": "tags", + "newVersion": "uma nova versão foi instalada ({{version}})", + "viewReleaseNotes": "ver notas de lançamento" }, "action": { "goToPage": "vá para página", @@ -216,7 +218,9 @@ "crossfadeDuration_description": "define a duração do efeito crossfade", "customCssNotice": "Aviso: apesar de existir alguma higienização (url() e content: não são permitidas), o uso de CSS personalizado ainda pode representar riscos ao alterar a interface.", "crossfadeStyle": "estilo do crossfade", - "crossfadeStyle_description": "seleciona qual estilo de crossfade usado no player de áudio" + "crossfadeStyle_description": "seleciona qual estilo de crossfade usado no player de áudio", + "disableAutomaticUpdates": "desabilitar atualizações automáticas", + "disableLibraryUpdateOnStartup": "desabilitar a verificação de novas versões na inicialização" }, "table": { "config": { @@ -273,7 +277,8 @@ "nowPlaying": "tocando agora", "playlists": "$t(entity.playlist_other)", "search": "$t(common.search)", - "settings": "$t(common.setting_other)" + "settings": "$t(common.setting_other)", + "myLibrary": "minha biblioteca" }, "playlistList": { "title": "$t(entity.playlist_other)" From 587ce68018a3b2681b5ddb69f4dd5325078fd775 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 8 Jul 2025 06:14:26 +0200 Subject: [PATCH 06/45] Translated using Weblate (Italian) Currently translated at 100.0% (680 of 680 strings) Translated using Weblate (Italian) Currently translated at 100.0% (680 of 680 strings) Translated using Weblate (Italian) Currently translated at 100.0% (680 of 680 strings) Translated using Weblate (Italian) Currently translated at 100.0% (680 of 680 strings) Translated using Weblate (Italian) Currently translated at 100.0% (680 of 680 strings) Co-authored-by: Daivy Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/ Translation: feishin/Translation --- src/i18n/locales/it.json | 228 ++++++++++++++++++++++++++++++++++----- 1 file changed, 203 insertions(+), 25 deletions(-) diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index adfb919d..4c3f25f0 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -16,7 +16,12 @@ "toggleSmartPlaylistEditor": "attiva/disattiva editor $t(entity.smartPlaylist)", "removeFromFavorites": "rimuovi da $t(entity.favorite_other)", "moveToTop": "sposta in cima", - "moveToBottom": "sposta in fondo" + "moveToBottom": "sposta in fondo", + "moveToNext": "passa al successivo", + "openIn": { + "lastfm": "Apri in Last.fm", + "musicbrainz": "Apri in MusicBrainz" + } }, "common": { "backward": "indietro", @@ -99,7 +104,22 @@ "yes": "si", "random": "casuale", "size": "dimensione", - "note": "nota" + "note": "nota", + "additionalParticipants": "partecipanti aggiuntivi", + "newVersion": "è stata installata una nuova versione ({{version}})", + "viewReleaseNotes": "mostra le note di rilascio", + "albumGain": "guadagno (gain) dell'album", + "albumPeak": "picco di volume dell'album", + "close": "chiudi", + "codec": "codec", + "mbid": "MusicBrainz ID", + "preview": "anteprima", + "reload": "ricarica", + "share": "condividi", + "tags": "tags", + "trackGain": "normalizzazione (gain) del brano", + "trackPeak": "picco di volume del brano", + "translation": "traduzione" }, "player": { "repeat_all": "ripeti coda", @@ -113,7 +133,7 @@ "skip_back": "salta indietro", "favorite": "preferito", "next": "successivo", - "shuffle": "mescola", + "shuffle": "riproduzione casuale", "playbackFetchNoResults": "nessuna canzone trovata", "playbackFetchInProgress": "caricamento canzoni…", "addNext": "aggiungi successivo", @@ -130,7 +150,9 @@ "shuffle_off": "non mescolare", "addLast": "aggiungi in coda", "mute": "silenzia", - "skip_forward": "salta avanti" + "skip_forward": "salta avanti", + "playSimilarSongs": "riproduci brani simili", + "viewQueue": "visualizza coda" }, "setting": { "crossfadeStyle_description": "seleziona lo stile dissolvenza da usare per il player audio", @@ -150,7 +172,7 @@ "skipDuration_description": "imposta la durata da saltare quando vengono usati i pulsanti di salto nella barra del player", "enableRemote_description": "abilita il controllo remoto del server per permettere ad altri dispositivi di controllare l'applicazione", "fontType_optionSystem": "font di sistema", - "mpvExecutablePath_description": "imposta il percorso dell'eseguibile di mpv", + "mpvExecutablePath_description": "imposta il percorso dell'eseguibile mpv. se lasciato vuoto, verrà utilizzato il percorso predefinito", "hotkey_favoriteCurrentSong": "$t(common.currentSong) preferita", "crossfadeStyle": "stile dissolvenza", "sidebarConfiguration": "configurazione barra laterale", @@ -268,7 +290,7 @@ "replayGainMode_description": "aggiusta il volume secondo i valori {{ReplayGain}} salvati nei metadati del file", "showSkipButtons": "mostra pulsanti per saltare", "sampleRate": "frequenza di campionamento", - "sampleRate_description": "seleziona la frequenza di campionamento di output da usare se la frequenza di campionamento selezionata è diversa da quella della del media attuale", + "sampleRate_description": "seleziona la frequenza di campionamento di output da utilizzare se quella selezionata è diversa da quella del file sorgente in riproduzione. Un valore inferiore a 8000 utilizzerà la frequenza predefinita", "hotkey_togglePreviousSongFavorite": "imposta/rimuovi $t(common.previousSong) favorito", "hotkey_unfavoritePreviousSong": "rimuovi $t(common.previousSong) dai preferiti", "showSkipButton_description": "mostra o nascondi i pulsanti per saltare nella barra del player", @@ -293,7 +315,85 @@ "clearQueryCache": "pulisci cache di feishin", "buttonSize_description": "Dimensione bottoni nella barra di riproduzione", "clearCache": "pulisci la cache del browser", - "clearQueryCache_description": "\"leggera\" pulizia di feishin. verranno aggiornate le playlist, metadata delle tracce e i testi salvati. impostazioni, credenziali del server e le immagini salvate saranno mantenute" + "clearQueryCache_description": "\"leggera\" pulizia di feishin. verranno aggiornate le playlist, metadata delle tracce e i testi salvati. impostazioni, credenziali del server e le immagini salvate saranno mantenute", + "albumBackground": "immagine di sfondo dell'album", + "albumBackground_description": "aggiunge un'immagine di sfondo per le pagine degli album contenenti l'album art", + "albumBackgroundBlur": "intensità sfocatura immagine di sfondo dell'album", + "albumBackgroundBlur_description": "regola la quantità di sfocatura applicata all'immagine di sfondo dell'album", + "artistConfiguration": "configurazione della pagina artista dell’album", + "artistConfiguration_description": "configurare quali elementi vengono visualizzati, e in quale ordine, nella pagina dell'artista dell'album", + "buttonSize": "dimensione del bottone nella barra di riproduzione", + "clearCacheSuccess": "cache pulita correttamente", + "contextMenu": "configurazione menu contestuale (clic destro)", + "contextMenu_description": "consente di nascondere gli elementi che vengono visualizzati nel menu quando si fa clic destro su un elemento. gli oggetti non selezionati saranno nascosti", + "customCssEnable": "abilita css personalizzato", + "customCssEnable_description": "consente di scrivere css personalizzati.", + "customCssNotice": "Attenzione: sebbene ci sia una certa sanitizzazione (vengono bloccati url() e content:), l’uso di CSS personalizzati può comunque comportare dei rischi modificando l’interfaccia.", + "customCss": "css personalizzato", + "customCss_description": "contenuto CSS personalizzato. Nota: le proprietà content e gli URL remoti non sono consentiti. Di seguito è mostrata un’anteprima del tuo contenuto. Sono presenti anche altri campi non impostati da te a causa della sanitizzazione.", + "discordPausedStatus": "mostra rich presence di Discord quando la riproduzione è in pausa", + "discordPausedStatus_description": "quando abilitato, verrà mostrato lo stato del lettore in standby/pausa (nessun brano in riproduzione)", + "discordListening": "mostra stato come in ascolto", + "discordListening_description": "mostra lo stato come in ascolto invece che in riproduzione", + "discordServeImage": "recupera le immagini di {{discord}} dal server", + "discordServeImage_description": "condividi la copertina per la rich presence di {{discord}} direttamente dal server, disponibile solo per Jellyfin e Navidrome", + "doubleClickBehavior": "aggiungi alla coda tutte le tracce cercate, con un doppio clic", + "doubleClickBehavior_description": "se attivato, tutte le tracce corrispondenti alla ricerca verranno aggiunte alla coda. altrimenti, verrà aggiunta alla coda solo la traccia selezionata", + "externalLinks": "mostra link esterni", + "externalLinks_description": "consente di visualizzare link esterni (Last.fm, MusicBrainz) sulle pagine di artista/album", + "preferLocalLyrics": "utilizza i testi locali", + "preferLocalLyrics_description": "usa i testi locali anziché quelli online, quando disponibili", + "genreBehavior": "comportamento predefinito della pagina genere", + "genreBehavior_description": "determina se cliccando su un genere si apre di default la lista dei brani o degli album", + "homeConfiguration": "configurazione della home page", + "homeConfiguration_description": "configura quali elementi vengono mostrati e in quale ordine nella home page", + "homeFeature": "carosello in evidenza nella home page", + "homeFeature_description": "controlla se mostrare il grande carosello in evidenza nella pagina principale", + "imageAspectRatio": "usa dimensioni originali(aspect ratio) della copertina", + "imageAspectRatio_description": "se abilitato, la copertina verrà mostrata utilizzando le dimesioni originali. per le immagini con rapporto diverso da 1:1, lo spazio residuo resterà vuoto", + "lastfm": "mostra links last.fm", + "lastfm_description": "mostra i link per last.fm sulle pagine di artista/album", + "lastfmApiKey": "{{lastfm}} chiave API", + "lastfmApiKey_description": "chiave API per {{lastfm}}. necessaria per visualizzare le copertine", + "mpvExtraParameters_help": "uno per linea", + "musicbrainz": "mostra links musicbrainz", + "musicbrainz_description": "mostra link a musicbrainz sulle pagine degli artisti/album, se è disponibile un mbid", + "neteaseTranslation": "Abilita traduzioni di NetEase", + "neteaseTranslation_description": "Se abilitato, recupera e mostra i testi tradotti da NetEase, se disponibili.", + "passwordStore": "Archivio di password/segreti", + "passwordStore_description": "specifica quale archivio di password e segreti utilizzare. modificalo in caso di problemi nel salvataggio delle credenziali.", + "playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)", + "playerAlbumArtResolution": "risoluzione della copertina nel lettore", + "playerAlbumArtResolution_description": "la risoluzione dell’anteprima della copertina nel lettore in formato grande. valori più alti la rendono più nitida, ma possono rallentare il caricamento. Il valore predefinito è 0, che indica la modalità automatica", + "sidePlayQueueStyle_optionAttached": "fissata", + "sidePlayQueueStyle_optionDetached": "sganciata", + "startMinimized": "avvia minimizzato", + "startMinimized_description": "avvia l'app nella barra di sistema", + "transcodeNote": "ha effetto dopo 1 brano (web) - 2 brani (mpv)", + "transcode": "abilita la transcodifica", + "transcode_description": "abilita la transcodifica in formati diversi", + "playerbarOpenDrawer": "attiva/disattiva schermo intero", + "playerbarOpenDrawer_description": "consente di cliccare sulla barra del lettore per aprire il lettore a schermo intero", + "replayGainClipping": "clipping di {{ReplayGain}}", + "replayGainFallback": "metodo alternativo di {{ReplayGain}}", + "transcodeBitrate": "bitrate per la transcodifica", + "transcodeBitrate_description": "seleziona il bitrate per la transcodifica. 0 significa lasciare che sia il server a scegliere", + "transcodeFormat": "formato per la transcodifica", + "transcodeFormat_description": "seleziona il formato per la transcodifica. se vuoto viene decisco dal server", + "translationApiProvider": "translation api provider", + "translationApiProvider_description": "api provider for translation", + "translationApiKey": "chiave api translation", + "translationApiKey_description": "chiave api per la traduzione (supporta solo endpoint di servizio globali)", + "translationTargetLanguage": "lingua di destinazione della traduzione", + "translationTargetLanguage_description": "lingua di destinazione per la traduzione", + "trayEnabled": "Mostra icona app nella barra di sistema", + "trayEnabled_description": "mostra/nascondi icona app nella barra si sistema. se disabilitato, disattiva anche minimizza/chiudi nella barra di sistema", + "volumeWidth": "larghezza della barra del volume", + "webAudio": "use audio web", + "webAudio_description": "usa audio web. abilita funzionalità avanzate come ReplayGain. disabilita se riscontri problemi", + "preservePitch": "mantieni tono (pitch)", + "preservePitch_description": "mantiene il tono (pitch) durante la modifica della velocità di riproduzione", + "volumeWidth_description": "larghezza del cursore del volume" }, "error": { "remotePortWarning": "riavvia il server per applicare la nuova porta", @@ -314,7 +414,11 @@ "mpvRequired": "MPV richiesto", "audioDeviceFetchError": "si è verificato un errore nel provare ad ottenre i device audio", "invalidServer": "server non valido", - "loginRateError": "troppi tentativi di accesso, per favore riprova tra qualche secondo" + "loginRateError": "troppi tentativi di accesso, per favore riprova tra qualche secondo", + "badAlbum": "stai visualizzando questa pagina perché questa canzone non fa parte di un album. probabilmente vedi questo messaggio perché hai una canzone posizionata direttamente nella cartella principale della tua libreria musicale. jellyfin raggruppa le tracce solo se si trovano all’interno di una cartella.", + "badValue": "opzione non valida \"{{value}}\". valore inesistente", + "networkError": "si è verificato un errore di rete", + "openError": "impossibile aprire il file" }, "filter": { "mostPlayed": "più riprodotti", @@ -372,7 +476,9 @@ "settings": "$t(common.setting_other)", "home": "$t(common.home)", "artists": "$t(entity.artist_other)", - "albumArtists": "$t(entity.albumArtist_other)" + "albumArtists": "$t(entity.albumArtist_other)", + "myLibrary": "la mia libreria", + "shared": "condivisa $t(entity.playlist_other)" }, "fullscreenPlayer": { "config": { @@ -386,11 +492,16 @@ "unsynchronized": "non sinncronizzato", "lyricAlignment": "allineamento testo", "useImageAspectRatio": "usa le proporzioni dell'immagine", - "lyricGap": "gap testo" + "lyricGap": "gap testo", + "dynamicImageBlur": "intensità sfocatura immagine", + "dynamicIsImage": "abilita immagine di sfondo", + "lyricOffset": "ritardo testi (ms)" }, "upNext": "successivamente", "lyrics": "testi", - "related": "correlati" + "related": "correlati", + "visualizer": "visualizzatore audio", + "noLyrics": "nessun testo trovato" }, "appMenu": { "selectServer": "seleziona server", @@ -420,7 +531,13 @@ "addFavorite": "$t(action.addToFavorites)", "play": "$t(player.play)", "numberSelected": "{{count}} selezionati", - "removeFromQueue": "$t(action.removeFromQueue)" + "removeFromQueue": "$t(action.removeFromQueue)", + "download": "download", + "moveToNext": "$t(action.moveToNext)", + "playSimilarSongs": "$t(player.playSimilarSongs)", + "playShuffled": "$t(player.shuffle)", + "shareItem": "condividi elemento", + "showDetails": "mostra info" }, "home": { "mostPlayed": "più riprodotti", @@ -431,22 +548,28 @@ }, "albumDetail": { "moreFromArtist": "di più da questo $t(entity.artist_one)", - "moreFromGeneric": "di più da {{item}}" + "moreFromGeneric": "di più da {{item}}", + "released": "rilasciato" }, "setting": { "playbackTab": "riproduzione", "generalTab": "generale", "hotkeysTab": "tasti a scelta rapida", - "windowTab": "finestra" + "windowTab": "finestra", + "advanced": "avanzate" }, "albumArtistList": { "title": "$t(entity.albumArtist_other)" }, "genreList": { - "title": "$t(entity.genre_other)" + "title": "$t(entity.genre_other)", + "showAlbums": "mostra $t(entity.genre_one) $t(entity.album_other)", + "showTracks": "mostra $t(entity.genre_one) $t(entity.track_other)" }, "trackList": { - "title": "$t(entity.track_other)" + "title": "$t(entity.track_other)", + "artistTracks": "tracce di {{artist}}", + "genreTracks": "\"{{genre}}\" $t(entity.track_other)" }, "globalSearch": { "commands": { @@ -460,7 +583,36 @@ "title": "$t(entity.playlist_other)" }, "albumList": { - "title": "$t(entity.album_other)" + "title": "$t(entity.album_other)", + "artistAlbums": "albums di {{artist}}", + "genreAlbums": "\"{{genre}}\" $t(entity.album_other)" + }, + "albumArtistDetail": { + "about": "Info {{artist}}", + "appearsOn": "compare su", + "recentReleases": "uscite recenti", + "viewDiscography": "mostra discografia", + "relatedArtists": "correlati $t(entity.artist_other)", + "topSongs": "brani migliori", + "topSongsFrom": "brani migliori da {{title}}", + "viewAll": "mostra tutto", + "viewAllTracks": "mostra tutto $t(entity.track_other)" + }, + "manageServers": { + "title": "gestisci servers", + "serverDetails": "dettagli server", + "url": "URL", + "username": "nome utente", + "editServerDetailsTooltip": "modifica dettagli server", + "removeServer": "rimuovi server" + }, + "itemDetail": { + "copyPath": "copia percorso negli appunti", + "copiedPath": "percorso copiato con successo", + "openFile": "mostra traccia nel gestore file" + }, + "playlist": { + "reorder": "riordino abilitato solo quando si ordina per id" } }, "form": { @@ -491,7 +643,7 @@ "error_savePassword": "si è verificato un errore quando si è provato a salvare la password" }, "addToPlaylist": { - "success": "aggiunto {{message}} $t(entity.track_other) a {{numOfPlaylists}} $t(entity.playlist_other)", + "success": "aggiunto $t(entity.trackWithCount, {\"count\": {{message}} }) a $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })", "title": "aggiungi a $t(entity.playlist_one)", "input_skipDuplicates": "salta duplicati", "input_playlists": "$t(entity.playlist_other)" @@ -502,7 +654,8 @@ }, "queryEditor": { "input_optionMatchAll": "soddisfa tutti", - "input_optionMatchAny": "soddisfa qualsiasi" + "input_optionMatchAny": "soddisfa qualsiasi", + "title": "editor di query" }, "lyricSearch": { "input_name": "$t(common.name)", @@ -510,7 +663,17 @@ "title": "cerca testi" }, "editPlaylist": { - "title": "modifica $t(entity.playlist_one)" + "title": "modifica $t(entity.playlist_one)", + "publicJellyfinNote": "Jellyfin non mostra se una playlist è pubblica o meno. Se vuoi che rimanga pubblica, assicurati di selezionare l’opzione seguente", + "success": "$t(entity.playlist_one) aggiornato con successo" + }, + "shareItem": { + "allowDownloading": "consentire il download", + "description": "descrizione", + "setExpiration": "imposta scadenza", + "success": "link di condivisione copiato negli appunti (o clicca qui per aprirlo)", + "expireInvalid": "la scadenza deve essere nel futuro", + "createFailed": "condivisione fallita (è abilitata la condivisione?)" } }, "table": { @@ -520,11 +683,17 @@ "gap": "$t(common.gap)", "tableColumns": "tabella colonne", "autoFitColumns": "adatta colonne automaticamente", - "size": "$t(common.size)" + "size": "$t(common.size)", + "followCurrentSong": "segui il brano corrente", + "itemGap": "spaziatura tra gli elementi (px)", + "itemSize": "dimensione dell’elemento (px)" }, "view": { "table": "tabella", - "card": "Scheda" + "card": "Scheda", + "grid": "griglia", + "list": "lista", + "poster": "poster" }, "label": { "releaseDate": "data rilascio", @@ -552,7 +721,9 @@ "discNumber": "numero disco", "favorite": "$t(common.favorite)", "year": "$t(common.year)", - "albumArtist": "$t(entity.albumArtist_one)" + "albumArtist": "$t(entity.albumArtist_one)", + "codec": "$t(common.codec)", + "songCount": "$t(entity.track_other)" } }, "column": { @@ -578,7 +749,8 @@ "path": "percorso", "discNumber": "disco", "channels": "$t(common.channel_other)", - "size": "$t(common.size)" + "size": "$t(common.size)", + "codec": "$t(common.codec)" } }, "entity": { @@ -627,6 +799,12 @@ "genreWithCount_other": "{{count}} generi", "trackWithCount_one": "{{count}} traccia", "trackWithCount_many": "{{count}} tracce", - "trackWithCount_other": "{{count}} tracce" + "trackWithCount_other": "{{count}} tracce", + "play_one": "{{count}} riproduzione", + "play_many": "{{count}} riproduzioni", + "play_other": "{{count}} riproduzioni", + "song_one": "traccia", + "song_many": "tracce", + "song_other": "tracce" } } From 196b9be65b122e9be1941e3cf5f7da3d4e2bebb4 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 8 Jul 2025 06:14:26 +0200 Subject: [PATCH 07/45] Translated using Weblate (French) Currently translated at 100.0% (680 of 680 strings) Co-authored-by: Hosted Weblate Co-authored-by: KosmoMoustache Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/ Translation: feishin/Translation --- src/i18n/locales/fr.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 0feb4e0e..b882d37e 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -101,6 +101,7 @@ "forceRestartRequired": "redémarrer pour appliquer les changements… fermer la notification pour redémarrer", "setting": "paramètre", "setting_one": "paramètre", + "setting_many": "", "setting_other": "paramètres", "version": "version", "title": "titre", @@ -400,7 +401,7 @@ "discordIdleStatus_description": "quand activé, mettre à jour le status pendant que le lecteur est inactif", "showSkipButtons": "affiche les boutons suivants et précédents", "minimumScrobblePercentage": "durée minimal du scobble (pourcentage)", - "lyricFetch": "récupère les paroles depuis internet", + "lyricFetch": "récupérer les paroles depuis internet", "scrobble": "scrobble", "enableRemote_description": "activer le serveur de contrôle à distance, qui permet à d'autres appareils de contrôler l'application", "fontType_optionSystem": "police système", @@ -578,7 +579,7 @@ "artistConfiguration": "page de configuration de l'artiste de l'album", "artistConfiguration_description": "configurer les éléments et l'ordre à afficher, sur la page de l'artiste de l'album", "doubleClickBehavior": "mettre en file d'attente toutes les pistes recherchées lors d'un double clic", - "contextMenu": "configuration du menu contexte (clic droit)", + "contextMenu": "configuration du menu contextuel (clic droit)", "contextMenu_description": "permet de masquer les éléments qui s'affichent dans le menu lorsque vous cliquez avec le bouton droit de la souris sur un élément. les éléments qui ne sont pas cochés seront masqués", "albumBackground": "image d'arrière-plan de l'album", "albumBackground_description": "ajoute une image d'arrière-plan pour les pages de l'album contenant les illustrations de l'album", From 62f9d064d9279f603c3948111458431874c3a4aa Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 8 Jul 2025 06:14:26 +0200 Subject: [PATCH 08/45] Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 74.8% (509 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 9.1% (62 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 9.1% (62 of 680 strings) Translated using Weblate (Slovenian) Currently translated at 9.1% (62 of 680 strings) Added translation using Weblate (Slovenian) Co-authored-by: Hosted Weblate Co-authored-by: Martin Stojanoski Co-authored-by: mytja Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sl/ Translation: feishin/Translation --- src/i18n/locales/sl.json | 647 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 647 insertions(+) create mode 100644 src/i18n/locales/sl.json diff --git a/src/i18n/locales/sl.json b/src/i18n/locales/sl.json new file mode 100644 index 00000000..dc637665 --- /dev/null +++ b/src/i18n/locales/sl.json @@ -0,0 +1,647 @@ +{ + "action": { + "addToFavorites": "dodaj na $t(entity.favorite_other)", + "addToPlaylist": "dodaj na $t(entity.playlist_one)", + "clearQueue": "počisti čakalno vrsto", + "createPlaylist": "ustvari $t(entity.playlist_one)", + "deletePlaylist": "izbriši $t(entity.playlist_one)", + "deselectAll": "odizberi vse", + "editPlaylist": "uredi $t(entity.playlist_one)", + "goToPage": "pojdi na stran", + "moveToNext": "pojdi na naslednjo", + "moveToBottom": "pojdi na dno", + "moveToTop": "pojdi na vrh", + "refresh": "$t(common.refresh)", + "removeFromFavorites": "odstrani iz $t(entity.favorite_other)", + "removeFromPlaylist": "odstrani iz seznama predvajanja", + "removeFromQueue": "odstrani iz čakalne vrste", + "setRating": "nastavi oceno", + "toggleSmartPlaylistEditor": "preklopi urejevalnik $t(entity.smartPlaylist)", + "viewPlaylists": "poglej $t(entity.playlist_other)", + "openIn": { + "lastfm": "Odpri v Last.fm", + "musicbrainz": "Odpri v MusicBrainz" + } + }, + "common": { + "action_one": "dejanje", + "action_two": "dejanji", + "action_few": "dejanja", + "action_other": "dejanj", + "add": "dodaj", + "additionalParticipants": "dodatni udeleženci", + "newVersion": "nova verzija je bila nameščena ({{version}})", + "viewReleaseNotes": "poglej zapiske o različici", + "albumGain": "ojačitev albuma", + "albumPeak": "vrh albuma", + "areYouSure": "ali si prepričan?", + "ascending": "naraščajoče", + "backward": "nazaj", + "biography": "biografija", + "bitrate": "bitna hitrost", + "bpm": "unm", + "cancel": "prekliči", + "center": "center", + "channel_one": "kanal", + "channel_two": "kanala", + "channel_few": "kanali", + "channel_other": "kanalov", + "clear": "počisti", + "close": "zapri", + "codec": "kodek", + "collapse": "strni", + "comingSoon": "prihaja kmalu …", + "configure": "prilagodi", + "confirm": "potrdi", + "create": "ustvari", + "currentSong": "trenutna $t(entity.track_one)", + "decrease": "zmanjšaj", + "delete": "izbriši", + "descending": "padajoče", + "description": "opis", + "disable": "onemogoči", + "disc": "disk", + "dismiss": "spreglej", + "duration": "trajanje", + "edit": "uredi", + "enable": "omogoči", + "expand": "razširi", + "favorite": "najljubša", + "filter_one": "filter", + "filter_two": "filtra", + "filter_few": "filtri", + "filter_other": "filtrov", + "filters": "filtri", + "forceRestartRequired": "znova zaženi, da potrdiš spremembe ... zapri obvestilo, da znova zaženeš", + "forward": "naprej", + "gap": "reža", + "home": "domov", + "increase": "povišaj", + "limit": "omeji", + "manage": "upravljaj", + "maximize": "maksimiziraj", + "menu": "meni", + "minimize": "pomanjšaj", + "modified": "spremenjeno", + "mbid": "MusicBrainz identifikator (ID)", + "left": "levo", + "no": "ne", + "none": "noben", + "noResultsFromQuery": "poizvedba ni vrnila rezultatov", + "note": "opomba", + "ok": "ok", + "owner": "lastnik", + "path": "pot", + "playerMustBePaused": "predvajalnik mora biti ustavljen", + "preview": "predogled", + "previousSong": "prejšnja $t(entity.track_one)", + "quit": "izhod", + "random": "naključno", + "rating": "ocena", + "refresh": "osveži", + "reload": "ponovno naloži", + "reset": "ponastavi", + "resetToDefault": "ponastavi na privzeto", + "restartRequired": "zahtevan je ponovni zagon", + "right": "desno", + "save": "shrani", + "saveAndReplace": "shrani in zamenjaj", + "saveAs": "shrani kot", + "search": "išči", + "setting": "nastavitev", + "share": "deli", + "size": "velikost", + "sortOrder": "vrstni red", + "tags": "oznake", + "title": "naslov", + "trackNumber": "skladba", + "trackGain": "glasnost skladbe", + "trackPeak": "vrhunec skladbe", + "translation": "prevod", + "unknown": "neznan", + "version": "verzija", + "year": "leto", + "yes": "da", + "name": "ime" + }, + "entity": { + "album_one": "album", + "album_two": "albuma", + "album_few": "albumi", + "album_other": "albumov", + "albumArtist_one": "izvajalec albuma", + "albumArtist_two": "izvajalec albumov", + "albumArtist_few": "izvajalec albumov", + "albumArtist_other": "izvajalec albumov", + "albumArtistCount_one": "{{count}} izvajalec albuma", + "albumArtistCount_two": "{{count}} izvajalca albuma", + "albumArtistCount_few": "{{count}} izvajalci albuma", + "albumArtistCount_other": "{{count}} izvajalcev albuma", + "albumWithCount_one": "{{count}} album", + "albumWithCount_two": "{{count}} albuma", + "albumWithCount_few": "{{count}} albumi", + "albumWithCount_other": "{{count}} albumov", + "artist_one": "izvajalec", + "artist_two": "izvajalca", + "artist_few": "izvajalci", + "artist_other": "izvajalcev", + "artistWithCount_one": "{{count}} izvajalec", + "artistWithCount_two": "{{count}} izvajalca", + "artistWithCount_few": "{{count}} izvajalci", + "artistWithCount_other": "{{count}} izvajalcev", + "favorite_one": "priljubljen", + "favorite_two": "priljubljena", + "favorite_few": "priljubljeni", + "favorite_other": "priljubljenih", + "folder_one": "mapa", + "folder_two": "mapi", + "folder_few": "mape", + "folder_other": "map", + "folderWithCount_one": "{{count}} mapa", + "folderWithCount_two": "{{count}} mapi", + "folderWithCount_few": "{{count}} mape", + "folderWithCount_other": "{{count}} map", + "genre_one": "zvrst", + "genre_two": "zvrsti", + "genre_few": "zvrsti", + "genre_other": "zvrsti", + "genreWithCount_one": "{{count}} zvrst", + "genreWithCount_two": "{{count}} zvrsti", + "genreWithCount_few": "{{count}} zvrsti", + "genreWithCount_other": "{{count}} zvrsti", + "playlist_one": "seznam predvajanja", + "playlist_two": "seznama predvajanja", + "playlist_few": "seznami predvajanja", + "playlist_other": "seznamov predvajanja", + "play_one": "{{count}} predvajanje", + "play_two": "{{count}} predvajanji", + "play_few": "{{count}} predvajanja", + "play_other": "{{count}} predvajanj", + "playlistWithCount_one": "{{count}} seznam predvajanja", + "playlistWithCount_two": "{{count}} seznama predvajanja", + "playlistWithCount_few": "{{count}} seznami predvajanja", + "playlistWithCount_other": "{{count}} seznamov predvajanja", + "smartPlaylist": "pametni $t(entity.playlist_one)", + "track_one": "skladba", + "track_two": "skladbi", + "track_few": "skladbe", + "track_other": "skladb", + "song_one": "pesem", + "song_two": "pesmi", + "song_few": "pesmi", + "song_other": "pesmi", + "trackWithCount_one": "{{count}} skladba", + "trackWithCount_two": "{{count}} skladbi", + "trackWithCount_few": "{{count}} skladbe", + "trackWithCount_other": "{{count}} skladb" + }, + "error": { + "apiRouteError": "preusmeritev zahteve ni bila mogoča", + "audioDeviceFetchError": "napaka pri poskusu pridobivanja avdio naprav", + "authenticationFailed": "napaka pri avtentikaciji", + "badAlbum": "ta stran je prikazana ker skladba ne pripada nobenemu albumu. skladba se verjetno nahaja na vrhu datotečne strukture direktorija z glasbo. jellyfin razporedi skladbe v skupine samo v primeru, ko se nahajajo v direktoriju.", + "badValue": "neveljavna možnost \"{{value}}\". ta vrednost ne obstaja več", + "credentialsRequired": "zahtevana prijava", + "endpointNotImplementedError": "{{serverType}} ne implementira končne točke {{endpoint}}", + "genericError": "prišlo je do napake", + "invalidServer": "neveljaven strežnik", + "localFontAccessDenied": "dostop do lokalnih pisav je bil zavrnjen", + "loginRateError": "preveč poskusov prijave, prosimo, poskusite čez nekaj sekund", + "mpvRequired": "obvezen MPV", + "networkError": "prišlo je do mrežne napake", + "openError": "datoteke ni mogoče odpreti", + "playbackError": "prišlo je do napake pri poskusu predvajanja skladbe", + "remoteDisableError": "oddaljenega strežnika ni bilo mogoče $t(common.disable)ti", + "remoteEnableError": "oddaljenega strežnika ni bilo mogoče $t(common.enable)ti", + "remotePortError": "pri nastavljanju vrat oddaljenega strežnika je prišlo do napake", + "remotePortWarning": "ponovno zaženite strežnik da aplicirate spremembo strežniških vrat", + "serverNotSelectedError": "izbran ni bil noben strežnik", + "serverRequired": "strežnik zahtevan", + "sessionExpiredError": "vaša seja se je iztekla", + "systemFontError": "napaka pri pridobivanju sistemskih pisav" + }, + "filter": { + "album": "$t(entity.album_one)", + "albumArtist": "$t(entity.albumArtist_one)", + "albumCount": "število $t(entity.album_other)", + "artist": "$t(entity.artist_one)", + "biography": "biografija", + "bitrate": "bitna hitrost", + "bpm": "bpm", + "channels": "$t(common.channel_other)", + "comment": "komentar", + "communityRating": "ocena skupnosti", + "criticRating": "ocena kritikov", + "dateAdded": "dodano", + "disc": "disk", + "duration": "trajanje", + "favorited": "priljubljeno", + "fromYear": "od leta", + "genre": "$t(entity.genre_one)", + "id": "identifikator", + "isCompilation": "je kompilacija", + "isFavorited": "je dodan med priljubljene", + "isPublic": "je javno", + "isRated": "je ocenjen", + "isRecentlyPlayed": "je bil nedavno predvajan", + "lastPlayed": "zadnje predvajano", + "mostPlayed": "najpogosteje predvajano", + "name": "ime", + "note": "opomba", + "owner": "$t(common.owner)", + "path": "pot", + "playCount": "število predvajanj", + "random": "naključno", + "rating": "ocena", + "recentlyAdded": "nedavno dodano", + "recentlyPlayed": "nedavno predvajano", + "recentlyUpdated": "nedavno posodobljeno", + "releaseDate": "datum izida", + "releaseYear": "leto izida", + "search": "išči", + "songCount": "število pesmi", + "title": "naslov", + "toYear": "do leta", + "trackNumber": "skladba" + }, + "form": { + "addServer": { + "error_savePassword": "pri shranjevanju gesla je prišlo do napake", + "ignoreCors": "ignoriraj cors $t(common.restartRequired)", + "ignoreSsl": "ignoriraj ssl $t(common.restartRequired)", + "input_legacyAuthentication": "omogoči legacy avtentikacijo", + "input_name": "ime strežnika", + "input_password": "geslo", + "input_savePassword": "shrani geslo", + "input_url": "url", + "input_username": "uporabniško ime", + "success": "dodajanje strežnika uspešno", + "title": "dodaj strežnik" + }, + "addToPlaylist": { + "input_playlists": "$t(entity.playlist_other)", + "input_skipDuplicates": "preskoči duplikate", + "success": "$t(entity.trackWithCount, {\"count\": {{message}} }) dodan v $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })", + "title": "dodaj v $t(entity.playlist_one)" + }, + "createPlaylist": { + "input_description": "$t(common.description)", + "input_name": "$t(common.name)", + "input_owner": "$t(common.owner)", + "input_public": "javno", + "success": "$t(entity.playlist_one) je bil uspešno ustvarjen", + "title": "ustvari $t(entity.playlist_one)" + }, + "deletePlaylist": { + "input_confirm": "vpišite ime $t(entity.playlist_one) za potrditev", + "success": "$t(entity.playlist_one) uspešno izbrisan", + "title": "izbriši $t(entity.playlist_one)" + }, + "editPlaylist": { + "publicJellyfinNote": "Jellyfin ne poda informacij o tem, ali gre za javni ali zasebni seznam predvajanja. Če želite, da seznam predvajanja ostane javen, izberite naslednji vnos", + "success": "$t(entity.playlist_one) uspešno posodobljen", + "title": "uredi $t(entity.playlist_one)" + }, + "lyricSearch": { + "input_artist": "$t(entity.artist_one)", + "input_name": "$t(common.name)", + "title": "iskanje po besedilu" + }, + "queryEditor": { + "title": "urejevalnik poizvedb", + "input_optionMatchAll": "ujemanje vseh", + "input_optionMatchAny": "ujemanje z najmanj enim" + }, + "shareItem": { + "allowDownloading": "dovoli prenašanje", + "description": "opis", + "setExpiration": "nastavi datum poteka veljavnosti", + "success": "deli povezavo v odložišču (ali klikni tukaj za odpiranje)", + "expireInvalid": "datum poteka veljavnosti mora biti v prihodnosti", + "createFailed": "deljenje ni uspelo (je deljenje omogočeno?)" + }, + "updateServer": { + "success": "strežnik uspešno posodobljen", + "title": "posodobi strežnik" + } + }, + "page": { + "albumArtistDetail": { + "about": "O izvajalcu", + "appearsOn": "se pojavi na", + "recentReleases": "zadnje izdaje", + "viewDiscography": "poglej diskografijo", + "relatedArtists": "sorodni $t(entity.artist_other)", + "topSongs": "najboljše skladbe", + "topSongsFrom": "najboljše skladbe iz {{title}}", + "viewAll": "poglej vse", + "viewAllTracks": "poglej vse $t(entity.track_other)" + }, + "albumArtistList": { + "title": "$t(entity.albumArtist_other)" + }, + "albumDetail": { + "moreFromArtist": "več od $t(entity.artist_one)", + "moreFromGeneric": "več iz {{item}}", + "released": "izdano" + }, + "albumList": { + "artistAlbums": "albumi izvajalca {{artist}}", + "genreAlbums": "\"{{genre}}\" $t(entity.album_other)", + "title": "$t(entity.album_other)" + }, + "appMenu": { + "collapseSidebar": "skrij stransko vrstico", + "expandSidebar": "razširi stransko vrstico", + "goBack": "nazaj", + "goForward": "naprej", + "manageServers": "urejanje strežnikov", + "openBrowserDevtools": "odpri orodja za razvijalce brskalnika", + "quit": "$t(common.quit)", + "selectServer": "izberi strežnik", + "settings": "$t(common.setting_other)", + "version": "verzija {{version}}" + }, + "manageServers": { + "title": "urejanje strežnikov", + "serverDetails": "podrobosti o strežniku", + "url": "URL", + "username": "uporabniško ime", + "editServerDetailsTooltip": "urejanje podrobnosti strežnika", + "removeServer": "odstrani strežnik" + }, + "contextMenu": { + "addFavorite": "$t(action.addToFavorites)", + "addLast": "$t(player.addLast)", + "addNext": "$t(player.addNext)", + "addToFavorites": "$t(action.addToFavorites)", + "addToPlaylist": "$t(action.addToPlaylist)", + "createPlaylist": "$t(action.createPlaylist)", + "deletePlaylist": "$t(action.deletePlaylist)", + "deselectAll": "$t(action.deselectAll)", + "download": "prenesi", + "moveToNext": "$t(action.moveToNext)", + "moveToBottom": "$t(action.moveToBottom)", + "moveToTop": "$t(action.moveToTop)", + "numberSelected": "{{count}} izbranih", + "play": "$t(player.play)", + "playSimilarSongs": "$t(player.playSimilarSongs)", + "removeFromFavorites": "$t(action.removeFromFavorites)", + "removeFromPlaylist": "$t(action.removeFromPlaylist)", + "removeFromQueue": "$t(action.removeFromQueue)", + "setRating": "$t(action.setRating)", + "playShuffled": "$t(player.shuffle)", + "shareItem": "deli", + "showDetails": "pridobi informacije" + }, + "fullscreenPlayer": { + "config": { + "dynamicBackground": "dinamično ozadje", + "dynamicImageBlur": "velikost zameglitve slike", + "dynamicIsImage": "omogoči sliko v ozadju", + "followCurrentLyric": "sledi besedilu", + "lyricAlignment": "poravnava besedila", + "lyricOffset": "zamik besedila (ms)", + "lyricGap": "razmik besedila", + "lyricSize": "velikost besedila", + "opacity": "prosojnost", + "showLyricMatch": "prikaži ujemanje besedila", + "showLyricProvider": "pokaži ponudnika besedila", + "synchronized": "sinhronizirano", + "unsynchronized": "nesinhronizirano", + "useImageAspectRatio": "uporabi razmerje stranic slike" + }, + "lyrics": "besedilo", + "related": "sorodno", + "upNext": "sledi", + "visualizer": "vizualizator", + "noLyrics": "ni bilo najdenih besedil" + }, + "genreList": { + "showAlbums": "prikaži $t(entity.genre_one) $t(entity.album_other)", + "showTracks": "prikaži $t(entity.genre_one) $t(entity.track_other)", + "title": "$t(entity.genre_other)" + }, + "globalSearch": { + "commands": { + "goToPage": "pojdi na stran", + "searchFor": "išči {{query}}", + "serverCommands": "strežniški ukazi" + }, + "title": "ukazi" + }, + "home": { + "explore": "razišči knjižnico", + "mostPlayed": "najpogosteje predvajano", + "newlyAdded": "zadnje dodane izdaje", + "recentlyPlayed": "nedavno predvajano", + "title": "$t(common.home)" + }, + "itemDetail": { + "copyPath": "kopiraj v odložišče", + "copiedPath": "kopiranje poti uspešno", + "openFile": "prikaži skladbo v upravitelju datotek" + }, + "playlist": { + "reorder": "preurejanje je omogočeno samo pri razvrščanju po identifikatorju" + }, + "playlistList": { + "title": "$t(entity.playlist_other)" + }, + "setting": { + "advanced": "napredno", + "generalTab": "splošno", + "hotkeysTab": "blžnjice", + "playbackTab": "predvajanje", + "windowTab": "okno" + }, + "sidebar": { + "albumArtists": "$t(entity.albumArtist_other)", + "albums": "$t(entity.album_other)", + "artists": "$t(entity.artist_other)", + "folders": "$t(entity.folder_other)", + "genres": "$t(entity.genre_other)", + "home": "$t(common.home)", + "myLibrary": "moja knjižnica", + "nowPlaying": "trenutno se predvaja", + "playlists": "$t(entity.playlist_other)", + "search": "$t(common.search)", + "settings": "$t(common.setting_other)", + "shared": "deljen $t(entity.playlist_other)", + "tracks": "$t(entity.track_other)" + }, + "trackList": { + "artistTracks": "skladbe po {{artist}}", + "genreTracks": "\"{{genre}}\" $t(entity.track_other)", + "title": "$t(entity.track_other)" + } + }, + "player": { + "addLast": "dodaj zadnje", + "addNext": "dodaj naslednje", + "favorite": "dodaj med priljubljene", + "mute": "utišaj", + "muted": "utišano", + "next": "naslednje", + "play": "predvajaj", + "playbackFetchCancel": "akcija traja dlje časa... zaprite obvestilo za preklic", + "playbackFetchInProgress": "nalaganje pesmi…", + "playbackFetchNoResults": "nobena pesem ni bila najdena", + "playbackSpeed": "hitrost predvajanja", + "playRandom": "predvajaj naključno", + "playSimilarSongs": "predvajaj sorodne pesmi", + "previous": "prejšnje", + "queue_clear": "počisti čakalno vrsto", + "queue_moveToBottom": "premakni izbrano na vrh", + "queue_moveToTop": "premakni izbrano na dno", + "queue_remove": "odstrani izbrano", + "repeat": "ponovi", + "repeat_all": "ponovi vse", + "repeat_off": "ne ponavljaj", + "shuffle": "predvajaj v naključnem vrstnem redu", + "shuffle_off": "prevajanje v naključnem vrstnem redu izključeno", + "skip": "preskoči", + "skip_back": "preskoči nazaj", + "skip_forward": "preskoči naprej", + "stop": "ustavi", + "toggleFullscreenPlayer": "preklopi predvajalnik v celozaslonski način", + "unfavorite": "odstrani iz priljubljenih", + "pause": "premor", + "viewQueue": "poglej čakalno vrsto" + }, + "setting": { + "accentColor": "barva poudarka", + "accentColor_description": "nastavi barva poudarka aplikacije", + "albumBackground": "slika ozadja albuma", + "albumBackground_description": "doda sliko ozadja za strani albuma", + "albumBackgroundBlur": "velikost zameglitve slike ozadja albuma", + "albumBackgroundBlur_description": "spremeni moč zameglitve slike ozadja albuma", + "applicationHotkeys": "bližnjične tipke aplikacije", + "applicationHotkeys_description": "konfigurira bližnjične tipke aplikacije. obkljukajte da nastavite globalne bližnjico na tipkovnici (samo na namizju)", + "artistConfiguration": "konfiguracija strani izvajalca albuma", + "artistConfiguration_description": "konfiguriranje vsebine in vrstnega reda prikaza na strani izvajalca albuma", + "audioDevice": "avdio naprava", + "audioDevice_description": "izberite avdio napravo za predvajanje (samo v spletnem predvajalniku)", + "audioExclusiveMode": "avdio način", + "audioExclusiveMode_description": "omogoči način ekskluzivnega predvajanja. V tem načinu je sistem običajno zaklenjen in samo mpv lahko oddaja zvok", + "audioPlayer": "avdio predvajalnik", + "audioPlayer_description": "izberite avdio predvajalnik za predvajanje", + "buttonSize": "velikost gumbov vrstice predvajalnika", + "buttonSize_description": "velikost gumbov v vrstici predvajalnika", + "clearCache": "izbriši začasni pomnilnik", + "clearCache_description": "poleg brisanja feishinovega začasnega pomnilnika bo izbrisan tudi začasni pomnilnik brskalnika. nastavitve in prijavni podatki strežnikov se ohranijo", + "clearQueryCache": "počisti feishinov začasni pomnilnik", + "clearQueryCache_description": "osveži sezname predvajanja, metapodatke in ponastavi shranjena besedila. nastavitve, prijavni podatki za strežnike in slike se ohranijo", + "clearCacheSuccess": "začasni pomnilnik uspešno izbrisan", + "contextMenu": "konfiguracija kontekstnega menija (desni klik)", + "contextMenu_description": "omogoči skrivanje vrstic v meniju, prikazanem ob desnem kliku. odznačeni predmeti bodo skriti", + "crossfadeDuration": "trajanje prehoda", + "crossfadeDuration_description": "nastavi čas trajanja prehoda med pesmimi", + "crossfadeStyle": "tip prehoda", + "crossfadeStyle_description": "izbira tipa efekta prehoda", + "customCssEnable": "omogoči css po meri", + "customCssEnable_description": "omogoča urejanje css-ja po meri.", + "customCssNotice": "Opozorilo: kljub določenim varnostnim ukrepom (prepoved url() in content:) lahko uporaba CSS po meri s spreminjanjem vmesnika še vedno predstavlja tveganje.", + "customCss": "css po meri", + "customCss_description": "vsebina css po meri. Opomba: vsebina in oddaljeni url-ji so prepovedane lastnosti. Spodaj je prikazan predogled vaše vsebine. Dodatna polja, ki jih niste nastavili, so prisotna zaradi prečiščevanja.", + "customFontPath": "pot za pisavo po meri", + "customFontPath_description": "nastavi pot do pisave po meri", + "disableAutomaticUpdates": "onemogoči samodejne posodobitve", + "disableLibraryUpdateOnStartup": "onemogoči prevejranje novih verzij ob zagonu", + "discordApplicationId": "{{discord}} identifikator aplikacije", + "discordApplicationId_description": "identifikator aplikacije za {{discord}} bogato prezenco (privzeto {{defaultId}})", + "discordPausedStatus": "prikaži bogato prezenco med ustavljenim predvajanjem", + "discordPausedStatus_description": "ko je nastavitev omogočena, se bo status prikazal tudi ko je predvajanje začasno zaustavljeno", + "discordIdleStatus": "prikaže stanje mirovanja v bogati prezenci", + "discordIdleStatus_description": "ko je nastavitev omogočena, se bo status posodabljal ko predvajalnik miruje", + "discordListening": "prikaži status poslušanja", + "discordListening_description": "prikaži status poslušanja namesto predvajanja", + "discordRichPresence": "{{discord}} bogata prezenca", + "discordRichPresence_description": "omogoči prikaz statusa predvajanja v {{discord}} bogati prezenci. Oznake slike so: {{icon}}, {{playing}} in {{paused}}", + "discordServeImage": "pošiljaj {{discord}} u slike iz strežnika", + "discordServeImage_description": "deli naslovne slike za {{discord}} bogato prisotnost iz samega strežnika, na voljo samo za jellyfin in navidrome", + "discordUpdateInterval": "interval posodabljanja {{discord}} bogate prezence", + "discordUpdateInterval_description": "čas v sekundah med posameznimi posodobitvami (najmanj 15 sekund)", + "doubleClickBehavior": "dvojni klik doda vse iskane skladbe v čakalno vrsto", + "doubleClickBehavior_description": "če je nastavitev vklopljena se bodo v čakalno vrsto dodale vse skladbe, ki ustrezajo iskanju. v nasprotnem primeru se v čakalno vrsto doda samo izbrana skladba", + "enableRemote": "omogoči oddaljeno upravljanje strežnika", + "enableRemote_description": "omogoči oddaljeno nadzorovanje strežnika in s tem dovoli drugim napravam da upravljajo aplikacijo", + "externalLinks": "prikaži zunanje povezave", + "externalLinks_description": "omogoči prikaz zunanjih povezav (Last.fm, MusicBrainz) na straneh albumov,izvajalcev", + "exitToTray": "minimiziraj", + "exitToTray_description": "ob izhodu se aplikacija minimizira v opravilno vrstico", + "floatingQueueArea": "prikaži območje plavajoče čakalne vrste", + "floatingQueueArea_description": "na desni strani zaslona prikažite ikono za ogled čakalne vrste predvajanja", + "followLyric": "sledenje besedilu", + "followLyric_description": "pomaknite besedilo pesmi do trenutnega položaja predvajanja", + "preferLocalLyrics": "prioritiziraj lokalna besedila", + "preferLocalLyrics_description": "prioritiziraj lokalna besedila pred oddaljenimi, kadar so na voljo", + "font": "pisava", + "font_description": "nastavi pisavo, ki jo bo aplikacija uporabljala", + "fontType": "tip pisave", + "fontType_description": "vgrajena pisava izbere eno od pisav, ki jih ponuja Feishin. sistemska pisava vam omogoča, da izberete katero koli pisavo, ki jo ponuja vaš operacijski sistem. po meri lahko izberete svojo pisavo", + "fontType_optionBuiltIn": "vgrajena pisava", + "fontType_optionCustom": "pisava po meri", + "fontType_optionSystem": "sistemska pisava", + "gaplessAudio": "neprekinjen avdio", + "gaplessAudio_description": "nastavi neprekinjen avdio za mpv", + "gaplessAudio_optionWeak": "šibko (priporočeno)", + "genreBehavior": "privzeto vedenje strani z zvrstmi", + "genreBehavior_description": "določa, ali se ob kliku na zvrst privzeto odpre seznam skladb ali albumov", + "globalMediaHotkeys": "globalne bližnjične tipke za vsebino", + "globalMediaHotkeys_description": "omogočite ali onemogočite uporabo bližnjic za sistemske medije za nadzor predvajanja", + "homeConfiguration": "konfiguracija domače strani", + "homeConfiguration_description": "konfigurirajte, kateri elementi so prikazani na domači strani in v kakšnem vrstnem redu", + "homeFeature": "tekoči trak na domači strani", + "homeFeature_description": "nadzoruje, ali naj se na domači strani prikaže velik tekoči trak", + "hotkey_browserBack": "nazaj (brskalnik)", + "hotkey_browserForward": "naprej (brskalnik)", + "hotkey_favoriteCurrentSong": "dodaj $t(common.currentSong) med priljubljene", + "hotkey_favoritePreviousSong": "dodaj $t(common.previousSong) med priljubljene", + "hotkey_globalSearch": "globalno iskanje", + "hotkey_localSearch": "iskanje na strani", + "hotkey_playbackNext": "naslednja skladba", + "hotkey_playbackPause": "pavza", + "hotkey_playbackPlay": "predvajaj", + "hotkey_playbackPlayPause": "predvajaj / pavza", + "hotkey_playbackPrevious": "prejšnja skladba", + "hotkey_playbackStop": "ustavi", + "hotkey_rate0": "počisti oceno", + "hotkey_rate1": "oceni z 1 zvezdico", + "hotkey_rate2": "oceni z 2 zvezdicama", + "hotkey_rate3": "oceni s 3 zvezdicami", + "hotkey_rate4": "oceni s 4 zvezdicami", + "hotkey_rate5": "oceni s 5 zvezdicami", + "hotkey_skipBackward": "preskoči nazaj", + "hotkey_skipForward": "preskoči naprej", + "hotkey_toggleCurrentSongFavorite": "dodaj/odstrani $t(common.currentSong) iz seznama priljubljenih", + "hotkey_toggleFullScreenPlayer": "preklopi predvajalnik na celozaslonski način", + "hotkey_togglePreviousSongFavorite": "dodaj/odstrani $t(common.previousSong) iz seznama priljubljenih", + "hotkey_toggleQueue": "preklopi čakalno vrsto", + "hotkey_toggleRepeat": "preklopi ponovitve", + "hotkey_toggleShuffle": "preklopi naključni vrstni red predvajanja", + "hotkey_unfavoriteCurrentSong": "odstrani $t(common.currentSong) iz seznama priljubljenih", + "hotkey_unfavoritePreviousSong": "odstrani $t(common.previousSong) iz seznama priljubljenih", + "hotkey_volumeDown": "znižaj glasnost", + "hotkey_volumeMute": "utišaj", + "hotkey_volumeUp": "povišaj glasnost", + "hotkey_zoomIn": "povečaj", + "hotkey_zoomOut": "pomanjšaj", + "imageAspectRatio": "uporabi razmerje stranic izvorne naslovnice", + "imageAspectRatio_description": "če je omogočeno, bo naslovnica prikazana z izvornim razmerjem stranic. za slike, ki niso 1:1, bo preostali prostor prazen", + "language": "jezik", + "language_description": "nastavi jezik aplikacije ($t(common.restartRequired))", + "lastfm": "prikaži last.fm povezave", + "lastfm_description": "prikaži povezave do last.fm na straneh izvajalcev/albumov", + "lastfmApiKey": "API ključ {{lastfm}}", + "lastfmApiKey_description": "API ključ za {{lastfm}}. potreben za naslovnico albuma", + "lyricFetch": "pridobi besedila iz interneta", + "lyricFetch_description": "pridobivanje besedil iz različnih internetnih virov", + "lyricFetchProvider": "ponudniki za pridobivanje besedil", + "lyricFetchProvider_description": "izberite ponudnike, od katerih želite pridobiti besedila. vrstni red ponudnikov je vrstni red, v katerem bodo poizvedovani", + "lyricOffset": "zamik besedila (ms)", + "lyricOffset_description": "zamakni besedilo za določeno število milisekund", + "minimizeToTray": "minimiziraj v sistemsko vrstico", + "minimizeToTray_description": "minimizirajte aplikacijo v sistemsko vrstico" + } +} From 60d3eec8f77836097f6c96d3c93a12622ba0bb8b Mon Sep 17 00:00:00 2001 From: jeffvli Date: Tue, 8 Jul 2025 00:11:20 -0700 Subject: [PATCH 09/45] add sl to i18n config --- src/i18n/i18n.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/i18n/i18n.ts b/src/i18n/i18n.ts index 0656d426..651efabd 100644 --- a/src/i18n/i18n.ts +++ b/src/i18n/i18n.ts @@ -19,6 +19,7 @@ import nl from './locales/nl.json'; import pl from './locales/pl.json'; import ptBr from './locales/pt-BR.json'; import ru from './locales/ru.json'; +import sl from './locales/sl.json'; import sr from './locales/sr.json'; import sv from './locales/sv.json'; import ta from './locales/ta.json'; @@ -43,6 +44,7 @@ const resources = { pl: { translation: pl }, 'pt-BR': { translation: ptBr }, ru: { translation: ru }, + sl: { translation: sl }, sr: { translation: sr }, sv: { translation: sv }, ta: { translation: ta }, @@ -119,6 +121,10 @@ export const languages = [ label: 'Русский', value: 'ru', }, + { + label: 'Slovenščina', + value: 'sl', + }, { label: 'Srpski', value: 'sr', From e28dad3f84693443fd132f869a3defb0ac5e0dbe Mon Sep 17 00:00:00 2001 From: jeffvli Date: Tue, 8 Jul 2025 00:11:37 -0700 Subject: [PATCH 10/45] add code to language select label --- .../settings/components/general/application-settings.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/renderer/features/settings/components/general/application-settings.tsx b/src/renderer/features/settings/components/general/application-settings.tsx index c9c8ee7d..5ef8d815 100644 --- a/src/renderer/features/settings/components/general/application-settings.tsx +++ b/src/renderer/features/settings/components/general/application-settings.tsx @@ -165,7 +165,10 @@ export const ApplicationSettings = () => { { control: ( - + - } + leftSection={} onClick={onResetFilters} > Reset to default - } + leftSection={} onClick={onClearFilters} > Clear filters diff --git a/src/renderer/components/query-builder/query-builder-option.tsx b/src/renderer/components/query-builder/query-builder-option.tsx index b7503534..f78e2afe 100644 --- a/src/renderer/components/query-builder/query-builder-option.tsx +++ b/src/renderer/components/query-builder/query-builder-option.tsx @@ -48,13 +48,7 @@ const QueryValueInput = ({ data, onChange, type, ...props }: any) => { /> ); case 'date': - return ( - - ); + return ; case 'dateRange': return ( <> @@ -92,21 +86,9 @@ const QueryValueInput = ({ data, onChange, type, ...props }: any) => { /> ); case 'playlist': - return ( - ; case 'string': - return ( - - ); + return ; default: return <>; @@ -188,10 +170,7 @@ export const QueryBuilderOption = ({ const ml = (level + 1) * 10; return ( - + + {onSave && onSaveAs && ( - - - @@ -512,12 +490,7 @@ export const PlaylistQueryBuilder = forwardRef( - } + leftSection={} onClick={handleSave} > {t('common.saveAndReplace', { postProcess: 'titleCase' })} diff --git a/src/renderer/features/playlists/components/save-as-playlist-form.tsx b/src/renderer/features/playlists/components/save-as-playlist-form.tsx index 945f6a30..304b1a8f 100644 --- a/src/renderer/features/playlists/components/save-as-playlist-form.tsx +++ b/src/renderer/features/playlists/components/save-as-playlist-form.tsx @@ -103,10 +103,7 @@ export const SaveAsPlaylistForm = ({ /> )} - @@ -267,10 +260,7 @@ export const CommandPalette = ({ modalProps }: CommandPaletteProps) => { )} - + {isHome && isLoading && query !== '' && } diff --git a/src/renderer/features/search/components/library-command-item.tsx b/src/renderer/features/search/components/library-command-item.tsx index 4c44a1b5..3aabd892 100644 --- a/src/renderer/features/search/components/library-command-item.tsx +++ b/src/renderer/features/search/components/library-command-item.tsx @@ -56,10 +56,7 @@ export const LibraryCommandItem = ({ onMouseLeave={() => setIsHovered(false)} style={{ height: '40px', width: '100%' }} > -
+
cover
{title} - + {subtitle}
{isHovered && ( - + { }, 200); return ( - + - + Search diff --git a/src/renderer/features/search/routes/search-route.tsx b/src/renderer/features/search/routes/search-route.tsx index 8d620282..96ae5c67 100644 --- a/src/renderer/features/search/routes/search-route.tsx +++ b/src/renderer/features/search/routes/search-route.tsx @@ -16,14 +16,8 @@ const SearchRoute = () => { return ( - - + + ); }; diff --git a/src/renderer/features/servers/components/add-server-form.tsx b/src/renderer/features/servers/components/add-server-form.tsx index bb4d8916..c9768e0d 100644 --- a/src/renderer/features/servers/components/add-server-form.tsx +++ b/src/renderer/features/servers/components/add-server-form.tsx @@ -31,15 +31,8 @@ interface AddServerFormProps { function ServerIconWithLabel({ icon, label }: { icon: string; label: string }) { return ( - - + + {label} ); @@ -47,30 +40,15 @@ function ServerIconWithLabel({ icon, label }: { icon: string; label: string }) { const SERVER_TYPES = [ { - label: ( - - ), + label: , value: ServerType.JELLYFIN, }, { - label: ( - - ), + label: , value: ServerType.NAVIDROME, }, { - label: ( - - ), + label: , value: ServerType.SUBSONIC, }, ]; @@ -174,10 +152,7 @@ export const AddServerForm = ({ onCancel }: AddServerFormProps) => { return (
- + { {...form.getInputProps('legacyAuth', { type: 'checkbox' })} /> )} - + {onCancel && ( - )} diff --git a/src/renderer/features/servers/components/edit-server-form.tsx b/src/renderer/features/servers/components/edit-server-form.tsx index bd547fa9..8765b33e 100644 --- a/src/renderer/features/servers/components/edit-server-form.tsx +++ b/src/renderer/features/servers/components/edit-server-form.tsx @@ -33,10 +33,7 @@ interface EditServerFormProps { const ModifiedFieldIndicator = () => { return ( - + ); }; @@ -193,17 +190,10 @@ export const EditServerForm = ({ isUpdate, onCancel, password, server }: EditSer /> )} - - diff --git a/src/renderer/features/servers/components/server-list-item.tsx b/src/renderer/features/servers/components/server-list-item.tsx index 134ae61e..112263c1 100644 --- a/src/renderer/features/servers/components/server-list-item.tsx +++ b/src/renderer/features/servers/components/server-list-item.tsx @@ -66,11 +66,7 @@ export const ServerListItem = ({ server }: ServerListItemProps) => { /> ) : ( - +
diff --git a/src/renderer/features/servers/components/server-list.tsx b/src/renderer/features/servers/components/server-list.tsx index f88e2b44..0e1423a0 100644 --- a/src/renderer/features/servers/components/server-list.tsx +++ b/src/renderer/features/servers/components/server-list.tsx @@ -73,10 +73,7 @@ export const ServerList = () => { {Object.keys(serverListQuery)?.map((serverId) => { const server = serverListQuery[serverId]; return ( - + { ); })} - + } diff --git a/src/renderer/features/settings/components/general/draggable-item.tsx b/src/renderer/features/settings/components/general/draggable-item.tsx index 5879ce49..1a13d47c 100644 --- a/src/renderer/features/settings/components/general/draggable-item.tsx +++ b/src/renderer/features/settings/components/general/draggable-item.tsx @@ -35,17 +35,8 @@ export const DraggableItem = ({ handleChangeDisabled, item, value }: DraggableIt const dragControls = useDragControls(); return ( - - + + handleChangeDisabled(item.id, e.target.checked)} diff --git a/src/renderer/features/settings/components/general/remote-settings.tsx b/src/renderer/features/settings/components/general/remote-settings.tsx index a982e7c1..828c2719 100644 --- a/src/renderer/features/settings/components/general/remote-settings.tsx +++ b/src/renderer/features/settings/components/general/remote-settings.tsx @@ -73,20 +73,12 @@ export const RemoteSettings = () => { /> ), description: ( - + {t('setting.enableRemote', { context: 'description', postProcess: 'sentenceCase', })}{' '} - + {url} diff --git a/src/renderer/features/settings/components/hotkeys/hotkey-manager-settings.tsx b/src/renderer/features/settings/components/hotkeys/hotkey-manager-settings.tsx index 0b3eddb0..1a126569 100644 --- a/src/renderer/features/settings/components/hotkeys/hotkey-manager-settings.tsx +++ b/src/renderer/features/settings/components/hotkeys/hotkey-manager-settings.tsx @@ -240,10 +240,7 @@ export const HotkeyManagerSettings = () => { />
{filteredBindings.map((binding) => ( - + }, ]; - return ( - - ); + return ; }; diff --git a/src/renderer/features/settings/components/playback/lyric-settings.tsx b/src/renderer/features/settings/components/playback/lyric-settings.tsx index 972f7d46..30fc8d45 100644 --- a/src/renderer/features/settings/components/playback/lyric-settings.tsx +++ b/src/renderer/features/settings/components/playback/lyric-settings.tsx @@ -215,10 +215,5 @@ export const LyricSettings = () => { }, ]; - return ( - - ); + return ; }; diff --git a/src/renderer/features/settings/components/playback/mpv-settings.tsx b/src/renderer/features/settings/components/playback/mpv-settings.tsx index 55f518cb..354e07d7 100644 --- a/src/renderer/features/settings/components/playback/mpv-settings.tsx +++ b/src/renderer/features/settings/components/playback/mpv-settings.tsx @@ -218,11 +218,7 @@ export const MpvSettings = () => { ), description: ( - + {t('setting.mpvExtraParameters', { context: 'description', postProcess: 'sentenceCase', diff --git a/src/renderer/features/settings/components/playback/transcode-settings.tsx b/src/renderer/features/settings/components/playback/transcode-settings.tsx index bc8a8843..080cb54a 100644 --- a/src/renderer/features/settings/components/playback/transcode-settings.tsx +++ b/src/renderer/features/settings/components/playback/transcode-settings.tsx @@ -86,10 +86,5 @@ export const TranscodeSettings = () => { }, ]; - return ( - - ); + return ; }; diff --git a/src/renderer/features/settings/components/settings-header.tsx b/src/renderer/features/settings/components/settings-header.tsx index 4ca8c1d5..ecf24145 100644 --- a/src/renderer/features/settings/components/settings-header.tsx +++ b/src/renderer/features/settings/components/settings-header.tsx @@ -44,16 +44,9 @@ export const SettingsHeader = ({ setSearch }: SettingsHeaderProps) => { - + - + {t('common.setting', { count: 2, postProcess: 'titleCase' })} @@ -65,10 +58,7 @@ export const SettingsHeader = ({ setSearch }: SettingsHeaderProps) => { setSearch(event.target.value.toLocaleLowerCase()) } /> - diff --git a/src/renderer/features/settings/components/settings-option.tsx b/src/renderer/features/settings/components/settings-option.tsx index 545b2881..85b7b890 100644 --- a/src/renderer/features/settings/components/settings-option.tsx +++ b/src/renderer/features/settings/components/settings-option.tsx @@ -16,11 +16,7 @@ interface SettingsOptionProps { export const SettingsOptions = ({ control, description, note, title }: SettingsOptionProps) => { return ( <> - + - + {title} {note && ( - + )} @@ -48,11 +38,7 @@ export const SettingsOptions = ({ control, description, note, title }: SettingsO {React.isValidElement(description) ? ( description ) : ( - + {description} )} diff --git a/src/renderer/features/settings/components/settings-section.tsx b/src/renderer/features/settings/components/settings-section.tsx index 32441a58..0e555976 100644 --- a/src/renderer/features/settings/components/settings-section.tsx +++ b/src/renderer/features/settings/components/settings-section.tsx @@ -28,10 +28,7 @@ export const SettingsSection = ({ divider, options }: SettingsSectionProps) => { return ( <> {values.map((option) => ( - + ))} {divider !== false && values.length > 0 && } diff --git a/src/renderer/features/settings/components/window/cache-settngs.tsx b/src/renderer/features/settings/components/window/cache-settngs.tsx index a32138da..23d2e1f2 100644 --- a/src/renderer/features/settings/components/window/cache-settngs.tsx +++ b/src/renderer/features/settings/components/window/cache-settngs.tsx @@ -94,10 +94,5 @@ export const CacheSettings = () => { }, ]; - return ( - - ); + return ; }; diff --git a/src/renderer/features/settings/components/window/password-settings.tsx b/src/renderer/features/settings/components/window/password-settings.tsx index cfe76611..e01b79ad 100644 --- a/src/renderer/features/settings/components/window/password-settings.tsx +++ b/src/renderer/features/settings/components/window/password-settings.tsx @@ -52,10 +52,5 @@ export const PasswordSettings = () => { }, ]; - return ( - - ); + return ; }; diff --git a/src/renderer/features/settings/components/window/update-settings.tsx b/src/renderer/features/settings/components/window/update-settings.tsx index f090a570..6a0bf4fc 100644 --- a/src/renderer/features/settings/components/window/update-settings.tsx +++ b/src/renderer/features/settings/components/window/update-settings.tsx @@ -44,10 +44,5 @@ export const UpdateSettings = () => { }, ]; - return ( - - ); + return ; }; diff --git a/src/renderer/features/settings/routes/settings-route.tsx b/src/renderer/features/settings/routes/settings-route.tsx index 3d25f6d7..4255b225 100644 --- a/src/renderer/features/settings/routes/settings-route.tsx +++ b/src/renderer/features/settings/routes/settings-route.tsx @@ -12,11 +12,7 @@ const SettingsRoute = () => { return ( - + diff --git a/src/renderer/features/shared/components/animated-page.tsx b/src/renderer/features/shared/components/animated-page.tsx index dfac2095..54d0e56b 100644 --- a/src/renderer/features/shared/components/animated-page.tsx +++ b/src/renderer/features/shared/components/animated-page.tsx @@ -14,11 +14,7 @@ interface AnimatedPageProps { export const AnimatedPage = forwardRef( ({ children }: AnimatedPageProps, ref: Ref) => { return ( - + {children} ); diff --git a/src/renderer/features/shared/components/filter-bar.tsx b/src/renderer/features/shared/components/filter-bar.tsx index d87c0a9d..eeca504c 100644 --- a/src/renderer/features/shared/components/filter-bar.tsx +++ b/src/renderer/features/shared/components/filter-bar.tsx @@ -2,10 +2,7 @@ import styles from './filter-bar.module.css'; export const FilterBar = ({ children, ...props }: React.HTMLAttributes) => { return ( -
+
{children}
); diff --git a/src/renderer/features/shared/components/library-background-overlay.tsx b/src/renderer/features/shared/components/library-background-overlay.tsx index 66246720..0c0b3010 100644 --- a/src/renderer/features/shared/components/library-background-overlay.tsx +++ b/src/renderer/features/shared/components/library-background-overlay.tsx @@ -5,10 +5,5 @@ interface LibraryBackgroundOverlayProps { } export const LibraryBackgroundOverlay = ({ backgroundColor }: LibraryBackgroundOverlayProps) => { - return ( -
- ); + return
; }; diff --git a/src/renderer/features/shared/components/library-header-bar.tsx b/src/renderer/features/shared/components/library-header-bar.tsx index 11074723..7eded7ad 100644 --- a/src/renderer/features/shared/components/library-header-bar.tsx +++ b/src/renderer/features/shared/components/library-header-bar.tsx @@ -22,21 +22,14 @@ interface TitleProps { const HeaderPlayButton = ({ className, ...props }: PlayButtonProps) => { return (
- +
); }; const Title = ({ children }: TitleProps) => { return ( - + {children} ); diff --git a/src/renderer/features/shared/components/library-header.tsx b/src/renderer/features/shared/components/library-header.tsx index 2b53c2ea..5518f733 100644 --- a/src/renderer/features/shared/components/library-header.tsx +++ b/src/renderer/features/shared/components/library-header.tsx @@ -84,10 +84,7 @@ export const LibraryHeader = forwardRef( }, [imageUrl, isImageError]); return ( -
+

- + {title}

diff --git a/src/renderer/features/shared/components/list-config-menu.tsx b/src/renderer/features/shared/components/list-config-menu.tsx index 7e448abc..463dc31a 100644 --- a/src/renderer/features/shared/components/list-config-menu.tsx +++ b/src/renderer/features/shared/components/list-config-menu.tsx @@ -16,14 +16,8 @@ import { ListDisplayType } from '/@/shared/types/types'; const DISPLAY_TYPES = [ { label: ( - - + + {i18n.t('table.config.view.table', { postProcess: 'sentenceCase' }) as string} ), @@ -31,14 +25,8 @@ const DISPLAY_TYPES = [ }, { label: ( - - + + {i18n.t('table.config.view.card', { postProcess: 'sentenceCase' }) as string} ), @@ -47,14 +35,8 @@ const DISPLAY_TYPES = [ { disabled: true, label: ( - - + + {i18n.t('table.config.view.list', { postProcess: 'sentenceCase' }) as string} ), @@ -79,10 +61,7 @@ interface ListConfigMenuProps { export const ListConfigMenu = (props: ListConfigMenuProps) => { return ( - + @@ -161,12 +140,7 @@ const TableConfig = ({ return ( <> -
+
@@ -199,10 +173,7 @@ const TableConfig = ({
- + - +
diff --git a/src/renderer/features/shared/components/search-input.tsx b/src/renderer/features/shared/components/search-input.tsx index c9980d7c..75a1b2ce 100644 --- a/src/renderer/features/shared/components/search-input.tsx +++ b/src/renderer/features/shared/components/search-input.tsx @@ -46,11 +46,7 @@ export const SearchInput = ({ onChange, ...props }: SearchInputProps) => { {...props} rightSection={ ref.current?.value ? ( - + ) : null } /> diff --git a/src/renderer/features/sharing/components/share-item-context-modal.tsx b/src/renderer/features/sharing/components/share-item-context-modal.tsx index cc5683a5..532643a8 100644 --- a/src/renderer/features/sharing/components/share-item-context-modal.tsx +++ b/src/renderer/features/sharing/components/share-item-context-modal.tsx @@ -128,18 +128,10 @@ export const ShareItemContextModal = ({ - - diff --git a/src/renderer/features/sidebar/components/action-bar.tsx b/src/renderer/features/sidebar/components/action-bar.tsx index d772ed06..8732a85a 100644 --- a/src/renderer/features/sidebar/components/action-bar.tsx +++ b/src/renderer/features/sidebar/components/action-bar.tsx @@ -20,16 +20,8 @@ export const ActionBar = () => { const { open } = useCommandPalette(); return ( -
- +
+ } @@ -44,11 +36,7 @@ export const ActionBar = () => { /> - + - diff --git a/src/renderer/features/sidebar/components/collapsed-sidebar-button.tsx b/src/renderer/features/sidebar/components/collapsed-sidebar-button.tsx index 4fbdce41..3d3b1e33 100644 --- a/src/renderer/features/sidebar/components/collapsed-sidebar-button.tsx +++ b/src/renderer/features/sidebar/components/collapsed-sidebar-button.tsx @@ -9,12 +9,7 @@ interface CollapsedSidebarButtonProps extends ActionIconProps {} export const CollapsedSidebarButton = forwardRef( ({ children, ...props }: CollapsedSidebarButtonProps, ref) => { return ( - + {children} ); diff --git a/src/renderer/features/sidebar/components/collapsed-sidebar.tsx b/src/renderer/features/sidebar/components/collapsed-sidebar.tsx index c6139249..6193daba 100644 --- a/src/renderer/features/sidebar/components/collapsed-sidebar.tsx +++ b/src/renderer/features/sidebar/components/collapsed-sidebar.tsx @@ -69,21 +69,12 @@ export const CollapsedSidebar = () => { > {sidebarCollapsedNavigation && ( - + navigate(-1)}> - + navigate(1)}> - + )} @@ -92,13 +83,7 @@ export const CollapsedSidebar = () => { - } + icon={} label={t('common.menu', { postProcess: 'titleCase' })} style={{ cursor: 'pointer', @@ -112,20 +97,9 @@ export const CollapsedSidebar = () => { {sidebarItemsWithRoute.map((item) => ( - } + activeIcon={} component={NavLink} - icon={ - - } + icon={} key={item.id} label={item.label} route={item.route} diff --git a/src/renderer/features/sidebar/components/sidebar-playlist-list.tsx b/src/renderer/features/sidebar/components/sidebar-playlist-list.tsx index 7fa78d80..89423078 100644 --- a/src/renderer/features/sidebar/components/sidebar-playlist-list.tsx +++ b/src/renderer/features/sidebar/components/sidebar-playlist-list.tsx @@ -53,12 +53,7 @@ const PlaylistRowButton = ({ name, onPlay, to, ...props }: PlaylistRowButtonProp > {name} - {isHovered && ( - - )} + {isHovered && }
); }; @@ -73,11 +68,7 @@ const RowControls = ({ const { t } = useTranslation(); return ( - + { return ( - - + + {t('page.sidebar.playlists', { postProcess: 'titleCase', @@ -323,10 +307,7 @@ export const SidebarSharedPlaylistList = () => { return ( - + {t('page.sidebar.shared', { postProcess: 'titleCase', })} diff --git a/src/renderer/features/sidebar/components/sidebar.tsx b/src/renderer/features/sidebar/components/sidebar.tsx index 8bc361f1..3a0dea0e 100644 --- a/src/renderer/features/sidebar/components/sidebar.tsx +++ b/src/renderer/features/sidebar/components/sidebar.tsx @@ -109,10 +109,7 @@ export const Sidebar = () => { })} id="left-sidebar" > - + { > - + {t('page.sidebar.myLibrary', { postProcess: 'titleCase', })} @@ -146,10 +140,7 @@ export const Sidebar = () => { {sidebarItemsWithRoute.map((item) => { return ( - + { )} - + {showImage && ( + ) : ( diff --git a/src/renderer/features/songs/components/jellyfin-song-filters.tsx b/src/renderer/features/songs/components/jellyfin-song-filters.tsx index a516f13a..e1130a67 100644 --- a/src/renderer/features/songs/components/jellyfin-song-filters.tsx +++ b/src/renderer/features/songs/components/jellyfin-song-filters.tsx @@ -175,16 +175,9 @@ export const JellyfinSongFilters = ({ return ( {yesNoFilters.map((filter) => ( - + {filter.label} - + ))} diff --git a/src/renderer/features/songs/components/navidrome-song-filters.tsx b/src/renderer/features/songs/components/navidrome-song-filters.tsx index ad882f72..824f1a41 100644 --- a/src/renderer/features/songs/components/navidrome-song-filters.tsx +++ b/src/renderer/features/songs/components/navidrome-song-filters.tsx @@ -133,16 +133,9 @@ export const NavidromeSongFilters = ({ return ( {toggleFilters.map((filter) => ( - + {filter.label} - + ))} @@ -170,10 +163,7 @@ export const NavidromeSongFilters = ({ {tagsQuery.data?.enumTags?.length && tagsQuery.data.enumTags.length > 0 && tagsQuery.data.enumTags.map((tag) => ( - + }> {isGrid ? ( - + ) : ( - + )} ); diff --git a/src/renderer/features/songs/components/song-list-header-filters.tsx b/src/renderer/features/songs/components/song-list-header-filters.tsx index 4afe9281..d019fa01 100644 --- a/src/renderer/features/songs/components/song-list-header-filters.tsx +++ b/src/renderer/features/songs/components/song-list-header-filters.tsx @@ -484,11 +484,7 @@ export const SongListHeaderFilters = ({ return ( - + @@ -534,10 +530,7 @@ export const SongListHeaderFilters = ({ )} - + @@ -578,10 +571,7 @@ export const SongListHeaderFilters = ({ - + + - + handlePlay?.({ playType: playButtonBehavior })} @@ -93,10 +87,7 @@ export const SongListHeader = ({ - + diff --git a/src/renderer/features/songs/components/subsonic-song-filter.tsx b/src/renderer/features/songs/components/subsonic-song-filter.tsx index 1b508d4c..3c15aec3 100644 --- a/src/renderer/features/songs/components/subsonic-song-filter.tsx +++ b/src/renderer/features/songs/components/subsonic-song-filter.tsx @@ -84,10 +84,7 @@ export const SubsonicSongFilters = ({ return ( {toggleFilters.map((filter) => ( - + {filter.label} { tableRef={tableRef} title={title} /> - + ); diff --git a/src/renderer/features/titlebar/components/app-menu.tsx b/src/renderer/features/titlebar/components/app-menu.tsx index ec2b41fc..1d0733ae 100644 --- a/src/renderer/features/titlebar/components/app-menu.tsx +++ b/src/renderer/features/titlebar/components/app-menu.tsx @@ -144,10 +144,7 @@ export const AppMenu = () => { key={`server-${server.id}`} leftSection={ isSessionExpired ? ( - + ) : ( { > {t('page.appMenu.openBrowserDevtools', { postProcess: 'sentenceCase' })} - } - onClick={handleQuit} - > + } onClick={handleQuit}> {t('page.appMenu.quit', { postProcess: 'sentenceCase' })} diff --git a/src/renderer/is-updated-dialog.tsx b/src/renderer/is-updated-dialog.tsx index 85f4136b..02b10266 100644 --- a/src/renderer/is-updated-dialog.tsx +++ b/src/renderer/is-updated-dialog.tsx @@ -34,10 +34,7 @@ export function IsUpdatedDialog() { > {t('common.newVersion', { postProcess: 'sentenceCase', version })} - + - diff --git a/src/renderer/layouts/default-layout/left-sidebar.tsx b/src/renderer/layouts/default-layout/left-sidebar.tsx index 49d53049..6a406a2b 100644 --- a/src/renderer/layouts/default-layout/left-sidebar.tsx +++ b/src/renderer/layouts/default-layout/left-sidebar.tsx @@ -17,10 +17,7 @@ export const LeftSidebar = ({ isResizing, startResizing }: LeftSidebarProps) => const { collapsed } = useSidebarStore(); return ( -