Merge branch 'master' into dependabot/npm_and_yarn/ui/lodash-4.17.23

This commit is contained in:
Deluan Quintão 2026-02-03 19:00:52 +01:00 committed by GitHub
commit 7dcfac76a4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 123 additions and 33 deletions

View File

@ -643,7 +643,8 @@ func setViperDefaults() {
viper.SetDefault("subsonic.artistparticipations", false)
viper.SetDefault("subsonic.defaultreportrealpath", false)
viper.SetDefault("subsonic.enableaveragerating", true)
viper.SetDefault("subsonic.legacyclients", "DSub,SubMusic")
viper.SetDefault("subsonic.legacyclients", "DSub")
viper.SetDefault("subsonic.minimalclients", "SubMusic")
viper.SetDefault("agents", "lastfm,spotify,deezer")
viper.SetDefault("lastfm.enabled", true)
viper.SetDefault("lastfm.language", consts.DefaultInfoLanguage)

View File

@ -95,11 +95,11 @@
"lists": {
"all": "Tot",
"random": "Aleatori",
"recentlyAdded": "Afegit fa poc",
"recentlyPlayed": "Reproduït fa poc",
"mostPlayed": "Més reproduït",
"recentlyAdded": "Afegits recentment",
"recentlyPlayed": "Reproduïts recentment",
"mostPlayed": "Més reproduïts",
"starred": "Preferits",
"topRated": "Més ben valorades"
"topRated": "Més ben valorats"
}
},
"artist": {
@ -119,7 +119,7 @@
"albumartist": "Artista de l'Àlbum |||| Artistes de l'Àlbum",
"artist": "Artista |||| Artistes",
"composer": "Compositor |||| Compositors",
"conductor": "Conductor |||| Conductors",
"conductor": "Director |||| Directors",
"lyricist": "Lletrista |||| Lletristes",
"arranger": "Arranjador |||| Arranjadors",
"producer": "Productor |||| Productors",
@ -127,7 +127,7 @@
"engineer": "Enginyer |||| Enginyers",
"mixer": "Mesclador |||| Mescladors",
"remixer": "Remesclador |||| Remescladors",
"djmixer": "DJ Mesclador |||| DJ Mescladors",
"djmixer": "Mesclador DJ |||| Mescladors DJ",
"performer": "Intèrpret |||| Intèrprets",
"maincredit": "Artista de l'àlbum or Artista |||| Artistes de l'àlbum or Artistes"
},
@ -654,7 +654,7 @@
"links": {
"homepage": "Inici",
"source": "Codi font",
"featureRequests": "Sol·licitud de funcionalitats",
"featureRequests": "Sol·licita funcionalitats",
"lastInsightsCollection": "Última recolecció d'informació",
"insights": {
"disabled": "Desactivada",

View File

@ -48,7 +48,7 @@
"playNext": "Als nächstes abspielen",
"info": "Mehr Informationen",
"showInPlaylist": "In Wiedergabeliste anzeigen",
"instantMix": ""
"instantMix": "Sofort-Mix"
}
},
"album": {
@ -588,7 +588,7 @@
"remove_all_missing_content": "Möchtest du wirklich alle Fehlenden Dateien aus der Datenbank entfernen? Alle Referenzen zu den Dateien wie Anzahl Wiedergaben und Bewertungen werden permanent gelöscht.",
"noSimilarSongsFound": "Keine ähnlichen Titel gefunden",
"noTopSongsFound": "Keine beliebten Titel gefunden",
"startingInstantMix": ""
"startingInstantMix": "Lade Sofort-Mix..."
},
"menu": {
"library": "Bibliothek",

View File

@ -48,7 +48,7 @@
"playNext": "Siguiente",
"info": "Obtener información",
"showInPlaylist": "Mostrar en la lista de reproducción",
"instantMix": ""
"instantMix": "Mezcla instantánea"
}
},
"album": {
@ -588,7 +588,7 @@
"remove_all_missing_content": "¿Realmente desea eliminar todos los archivos faltantes de la base de datos? Esto eliminará permanentemente cualquier referencia a ellos, incluidas sus reproducciones y valoraciones.",
"noSimilarSongsFound": "No se encontraron canciones similares",
"noTopSongsFound": "No se encontraron canciones destacadas",
"startingInstantMix": ""
"startingInstantMix": "Cargando la mezcla instantánea..."
},
"menu": {
"library": "Biblioteca",

View File

@ -48,7 +48,7 @@
"playNext": "Jouer ensuite",
"info": "Plus d'informations",
"showInPlaylist": "Montrer dans la playlist",
"instantMix": ""
"instantMix": "Mix instantanné"
}
},
"album": {
@ -588,7 +588,7 @@
"remove_all_missing_content": "Êtes-vous sûr(e) de vouloir supprimer tous les fichiers manquants de la base de données ? Cette action est permanente et supprimera leurs nombres d'écoutes, leur notations et tout ce qui y fait référence.",
"noSimilarSongsFound": "Aucun titre similaire n'a été trouvé",
"noTopSongsFound": "Aucun meilleur titre n'a été trouvé",
"startingInstantMix": ""
"startingInstantMix": "Chargement du mix instantanné..."
},
"menu": {
"library": "Bibliothèque",

View File

@ -36,7 +36,8 @@
"bitDepth": "Bit depth",
"sampleRate": "Sample rate",
"missing": "Hilang",
"libraryName": "Pustaka"
"libraryName": "Pustaka",
"composer": "Komposer"
},
"actions": {
"addToQueue": "Tambah ke antrean",
@ -46,7 +47,8 @@
"download": "Unduh",
"playNext": "Putar Berikutnya",
"info": "Lihat Info",
"showInPlaylist": "Tampilkan di Playlist"
"showInPlaylist": "Tampilkan di Playlist",
"instantMix": "Mix Instan"
}
},
"album": {
@ -301,14 +303,19 @@
"actions": {
"scan": "Pindai Pustaka",
"manageUsers": "Kelola Akses Pengguna",
"viewDetails": "Lihat Detail"
"viewDetails": "Lihat Detail",
"quickScan": "Pindai Cepat",
"fullScan": "Pindai Keseluruhan"
},
"notifications": {
"created": "Pustaka berhasil dibuat",
"updated": "Pustaka berhasil dibuat",
"deleted": "Berhasil menghapus pustaka",
"scanStarted": "Memindai pustaka dimulai",
"scanCompleted": "Memindai pustaka selesai"
"scanCompleted": "Memindai pustaka selesai",
"quickScanStarted": "Pemindaian cepat dimulai",
"fullScanStarted": "Pemindaian keseluruhan dimulai",
"scanError": "Kesalahan saat memulai pemindaian. Periksa log"
},
"validation": {
"nameRequired": "Nama pustaka diperlukan",
@ -323,6 +330,80 @@
"scanInProgress": "Pemindaian sedang berlangsung...",
"noLibrariesAssigned": "Tidak ada pustaka yang ditugaskan ke pengguna ini"
}
},
"plugin": {
"name": "Plugin |||| Plugin",
"fields": {
"id": "ID",
"name": "Nama",
"description": "Deskripsi",
"version": "Versi",
"author": "Pembuat",
"website": "Situs Web",
"permissions": "Perizinan",
"enabled": "Diaktifkan",
"status": "Status",
"path": "Jalur",
"lastError": "Kesalahan",
"hasError": "Kesalahan",
"updatedAt": "Diperbarui",
"createdAt": "Terinstal",
"configKey": "Key",
"configValue": "Value",
"allUsers": "Izinkan semua pengguna",
"selectedUsers": "Pengguna yang dipilih",
"allLibraries": "Izinkan semua pustaka",
"selectedLibraries": "Pustaka dipilih"
},
"sections": {
"status": "Status",
"info": "Informasi plugin",
"configuration": "Konfigurasi",
"manifest": "Manifes",
"usersPermission": "Pengguna yang Diizinkan",
"libraryPermission": "Pustaka yang Diizinkan"
},
"status": {
"enabled": "Diaktifkan",
"disabled": "Dinonaktifkan"
},
"actions": {
"enable": "Aktifkan",
"disable": "Nonaktifkan",
"disabledDueToError": "Perbaiki kesalahan sebelum diaktifkan",
"disabledUsersRequired": "Pilih pengguna sebelum diaktifkan",
"disabledLibrariesRequired": "Pilih pustaka sebelum diaktifkan",
"addConfig": "Tambahkan Konfigurasi",
"rescan": "Pindai ulang"
},
"notifications": {
"enabled": "Plugin diaktifkan",
"disabled": "Plugin dinonaktifkan",
"updated": "Plugin diperbarui",
"error": "Kesalahan saat memperbarui plugin"
},
"validation": {
"invalidJson": "Konfigurasi harus berupa JSON yang valid"
},
"messages": {
"configHelp": "Konfigurasikan plugin menggunakan key-value pairs. Biarkan kosong jika plugin tidak membutuhkan konfigurasi.",
"clickPermissions": "Klik perizinan untuk detail",
"noConfig": "Konfigurasi tidak diatur",
"allUsersHelp": "Ketika diaktifkan, plugin akan mengakses untuk semua pengguna, termasuk yang akan dibuat di masa depan.",
"noUsers": "Tidak ada pengguna yang dipilih",
"permissionReason": "Alasan",
"usersRequired": "Plugin ini membutuhkan akses ke informasi pengguna. Pilih pengguna yang bisa mengakses plugin, atau aktifkan 'Izinkan semua pengguna'.",
"allLibrariesHelp": "Ketika diaktifkan, plugin akan memiliki akses ke semua pustaka, termasuk yang dibuat di masa depan.",
"noLibraries": "Tidak ada pustaka yang dipilih",
"librariesRequired": "Plugin ini membutuhkan akses ke informasi pustaka. Pilih beberapa pustaka yang bisa diakses, atau aktifkan 'Izinkan semua pustaka'.",
"requiredHosts": "Hosts diperlukan",
"configValidationError": "Validasi konfigurasi gagal:",
"schemaRenderError": "Tidak dapat menampilkan form konfigurasi. Skema plugin mungkin tidak valid."
},
"placeholders": {
"configKey": "key",
"configValue": "value"
}
}
},
"ra": {
@ -506,7 +587,8 @@
"remove_all_missing_title": "Hapus semua file yang hilang",
"remove_all_missing_content": "Apa kamu yakin ingin menghapus semua file dari database? Ini akan menghapus permanen dan apapun referensi ke mereka, termasuk hitungan pemutaran dan rating mereka.",
"noSimilarSongsFound": "Tidak ada lagu yang serupa ditemukan",
"noTopSongsFound": "Tidak ada lagu teratas ditemukan"
"noTopSongsFound": "Tidak ada lagu teratas ditemukan",
"startingInstantMix": "Memuat Mix Instan..."
},
"menu": {
"library": "Pustaka",
@ -604,7 +686,8 @@
"serverDown": "LURING",
"scanType": "Tipe",
"status": "Kesalahan Memindai",
"elapsedTime": "Waktu Berakhir"
"elapsedTime": "Waktu Berakhir",
"selectiveScan": "Selektif"
},
"help": {
"title": "Tombol Pintasan Navidrome",

View File

@ -48,7 +48,7 @@
"playNext": "Odtwarzaj Następny",
"info": "Zdobądź Informacje",
"showInPlaylist": "Pokaż w Liście Odtwarzania",
"instantMix": ""
"instantMix": "Natychmiastowy Miks"
}
},
"album": {
@ -588,7 +588,7 @@
"remove_all_missing_content": "Czy chcesz usunąć wszystkie brakujące pliki z bazy danych? Spowoduje to trwałe usunięcie wszelkich odniesień do tych plików, takich jak liczba odtworzeń, czy oceny.",
"noSimilarSongsFound": "Brak podobnych utworów",
"noTopSongsFound": "Brak najlepszych utworów",
"startingInstantMix": ""
"startingInstantMix": "Ładowanie Natychmiastowego Miksu..."
},
"menu": {
"library": "Biblioteka",

View File

@ -351,7 +351,9 @@ const AlbumDetails = (props) => {
variant={'body1'}
onClick={() => setExpanded(!expanded)}
>
<span><SafeHTML>{notes}</SafeHTML></span>
<span>
<SafeHTML>{notes}</SafeHTML>
</span>
</Typography>
</Collapse>
)}
@ -371,7 +373,9 @@ const AlbumDetails = (props) => {
variant={'body1'}
onClick={() => setExpanded(!expanded)}
>
<span><SafeHTML>{notes}</SafeHTML></span>
<span>
<SafeHTML>{notes}</SafeHTML>
</span>
</Typography>
</Collapse>
</div>

View File

@ -71,7 +71,9 @@ const ArtistDetails = (props) => {
}, [record.id])
const Component = isDesktop ? DesktopArtistDetails : MobileArtistDetails
return <Component artistInfo={artistInfo} record={record} biography={biography} />
return (
<Component artistInfo={artistInfo} record={record} biography={biography} />
)
}
const ArtistShowLayout = (props) => {

View File

@ -173,7 +173,9 @@ const DesktopArtistDetails = ({ artistInfo, record, biography }) => {
variant={'body1'}
onClick={() => setExpanded(!expanded)}
>
<span><SafeHTML>{biography}</SafeHTML></span>
<span>
<SafeHTML>{biography}</SafeHTML>
</span>
</Typography>
</Collapse>
</CardContent>

View File

@ -169,7 +169,9 @@ const MobileArtistDetails = ({ artistInfo, biography, record }) => {
<div className={classes.biography}>
<Collapse collapsedHeight={'1.5em'} in={expanded} timeout={'auto'}>
<Typography variant={'body1'} onClick={() => setExpanded(!expanded)}>
<span><SafeHTML>{biography}</SafeHTML></span>
<span>
<SafeHTML>{biography}</SafeHTML>
</span>
</Typography>
</Collapse>
</div>

View File

@ -28,9 +28,7 @@ export const MultiLineTextField = memo(
component="span"
{...sanitizeFieldRestProps(rest)}
>
{lines.length === 0 && emptyText
? emptyText
: lines}
{lines.length === 0 && emptyText ? emptyText : lines}
</Typography>
)
},

View File

@ -1,9 +1,7 @@
import DOMPurify from 'dompurify'
import { Fragment, useMemo } from 'react'
export const SafeHTML = ({
children,
}) => {
export const SafeHTML = ({ children }) => {
const purified = useMemo(() => {
const purify = DOMPurify()