Merge branch 'master' into dlna-spike

This commit is contained in:
Rob Emery 2025-04-19 10:19:21 +01:00
commit 88cb5bf38e
12 changed files with 1045 additions and 917 deletions

55
core/common_test.go Normal file
View File

@ -0,0 +1,55 @@
package core
import (
"context"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/navidrome/navidrome/model"
"github.com/navidrome/navidrome/model/request"
"github.com/navidrome/navidrome/tests"
)
var _ = Describe("common.go", func() {
Describe("userName", func() {
It("returns the username from context", func() {
ctx := request.WithUser(context.Background(), model.User{UserName: "testuser"})
Expect(userName(ctx)).To(Equal("testuser"))
})
It("returns 'UNKNOWN' if no user in context", func() {
ctx := context.Background()
Expect(userName(ctx)).To(Equal("UNKNOWN"))
})
})
Describe("AbsolutePath", func() {
var (
ds *tests.MockDataStore
libId int
path string
)
BeforeEach(func() {
ds = &tests.MockDataStore{}
libId = 1
path = "music/file.mp3"
mockLib := &tests.MockLibraryRepo{}
mockLib.SetData(model.Libraries{{ID: libId, Path: "/library/root"}})
ds.MockedLibrary = mockLib
})
It("returns the absolute path when library exists", func() {
ctx := context.Background()
abs := AbsolutePath(ctx, ds, libId, path)
Expect(abs).To(Equal("/library/root/music/file.mp3"))
})
It("returns the original path if library not found", func() {
ctx := context.Background()
abs := AbsolutePath(ctx, ds, 999, path)
Expect(abs).To(Equal(path))
})
})
})

View File

@ -77,7 +77,7 @@ func NewMediaFileRepository(ctx context.Context, db dbx.Builder) model.MediaFile
"title": "order_title", "title": "order_title",
"artist": "order_artist_name, order_album_name, release_date, disc_number, track_number", "artist": "order_artist_name, order_album_name, release_date, disc_number, track_number",
"album_artist": "order_album_artist_name, order_album_name, release_date, disc_number, track_number", "album_artist": "order_album_artist_name, order_album_name, release_date, disc_number, track_number",
"album": "order_album_name, release_date, disc_number, track_number, order_artist_name, title", "album": "order_album_name, album_id, disc_number, track_number, order_artist_name, title",
"random": "random", "random": "random",
"created_at": "media_file.created_at", "created_at": "media_file.created_at",
"starred_at": "starred, starred_at", "starred_at": "starred, starred_at",
@ -242,7 +242,7 @@ func (r *mediaFileRepository) MarkMissingByFolder(missing bool, folderIDs ...str
// GetMissingAndMatching returns all mediafiles that are missing and their potential matches (comparing PIDs) // GetMissingAndMatching returns all mediafiles that are missing and their potential matches (comparing PIDs)
// that were added/updated after the last scan started. The result is ordered by PID. // that were added/updated after the last scan started. The result is ordered by PID.
// It does not need to load bookmarks, annotations and participnts, as they are not used by the scanner. // It does not need to load bookmarks, annotations and participants, as they are not used by the scanner.
func (r *mediaFileRepository) GetMissingAndMatching(libId int) (model.MediaFileCursor, error) { func (r *mediaFileRepository) GetMissingAndMatching(libId int) (model.MediaFileCursor, error) {
subQ := r.newSelect().Columns("pid"). subQ := r.newSelect().Columns("pid").
Where(And{ Where(And{

View File

@ -18,6 +18,9 @@
"size": "Mida del fitxer", "size": "Mida del fitxer",
"updatedAt": "Actualitzat", "updatedAt": "Actualitzat",
"bitRate": "Taxa de bits", "bitRate": "Taxa de bits",
"bitDepth": "Bits",
"sampleRate": "Freqüencia de mostreig",
"channels": "Canals",
"discSubtitle": "Subtítol del disc", "discSubtitle": "Subtítol del disc",
"starred": "Preferit", "starred": "Preferit",
"comment": "Comentari", "comment": "Comentari",
@ -25,8 +28,13 @@
"quality": "Qualitat", "quality": "Qualitat",
"bpm": "tempo", "bpm": "tempo",
"playDate": "Darrer resproduït", "playDate": "Darrer resproduït",
"channels": "Canals", "createdAt": "Creat el",
"createdAt": "" "grouping": "Agrupació",
"mood": "Sentiment",
"participants": "Participants",
"tags": "Etiquetes",
"mappedTags": "Etiquetes assignades",
"rawTags": "Etiquetes sense processar"
}, },
"actions": { "actions": {
"addToQueue": "Reprodueix després", "addToQueue": "Reprodueix després",
@ -46,6 +54,7 @@
"duration": "Durada", "duration": "Durada",
"songCount": "Cançons", "songCount": "Cançons",
"playCount": "Reproduccions", "playCount": "Reproduccions",
"size": "Mida",
"name": "Nom", "name": "Nom",
"genre": "Gènere", "genre": "Gènere",
"compilation": "Compilació", "compilation": "Compilació",
@ -53,22 +62,28 @@
"updatedAt": "Actualitzat ", "updatedAt": "Actualitzat ",
"comment": "Comentari", "comment": "Comentari",
"rating": "Valoració", "rating": "Valoració",
"createdAt": "", "createdAt": "Creat el",
"size": "", "size": "Mida",
"originalDate": "", "originalDate": "Original",
"releaseDate": "", "releaseDate": "Publicat",
"releases": "", "releases": "LLançament |||| Llançaments",
"released": "" "released": "Publicat",
"recordLabel": "Discogràfica",
"catalogNum": "Número de catàleg",
"releaseType": "Tipus de publicació",
"grouping": "Agrupació",
"media": "Mitjà",
"mood": "Sentiment"
}, },
"actions": { "actions": {
"playAll": "Reprodueix", "playAll": "Reprodueix",
"playNext": "Reprodueix la següent", "playNext": "Reprodueix la següent",
"addToQueue": "Reprodueix després", "addToQueue": "Reprodueix després",
"share": "Compartir",
"shuffle": "Aleatori", "shuffle": "Aleatori",
"addToPlaylist": "Afegeix a la llista", "addToPlaylist": "Afegeix a la llista",
"download": "Descarrega", "download": "Descarrega",
"info": "Obtén informació", "info": "Obtén informació"
"share": ""
}, },
"lists": { "lists": {
"all": "Tot", "all": "Tot",
@ -85,11 +100,27 @@
"fields": { "fields": {
"name": "Nom", "name": "Nom",
"albumCount": "Nombre d'àlbums", "albumCount": "Nombre d'àlbums",
"songCount": "Compte de cançons", "songCount": "Nombre de cançons",
"size": "Mida",
"playCount": "Reproduccions", "playCount": "Reproduccions",
"rating": "Valoració", "rating": "Valoració",
"genre": "Gènere", "genre": "Gènere",
"size": "" "role": "Rol"
},
"roles": {
"albumartist": "Artista de l'Àlbum |||| Artistes de l'Àlbum",
"artist": "Artista |||| Artistes",
"composer": "Compositor |||| Compositors",
"conductor": "Conductor |||| Conductors",
"lyricist": "Lletrista |||| Lletristes",
"arranger": "Arranjador |||| Arranjadors",
"producer": "Productor |||| Productors",
"director": "Director |||| Directors",
"engineer": "Enginyer |||| Enginyers",
"mixer": "Mesclador |||| Mescladors",
"remixer": "Remesclador |||| Remescladors",
"djmixer": "DJ Mesclador |||| DJ Mescladors",
"performer": "Intèrpret |||| Intèrprets"
} }
}, },
"user": { "user": {
@ -98,6 +129,7 @@
"userName": "Nom d'usuari", "userName": "Nom d'usuari",
"isAdmin": "És admin", "isAdmin": "És admin",
"lastLoginAt": "Última connexió", "lastLoginAt": "Última connexió",
"lastAccessAt": "Últim Accés",
"updatedAt": "Actualitzat", "updatedAt": "Actualitzat",
"name": "Nom", "name": "Nom",
"password": "Contrasenya", "password": "Contrasenya",
@ -169,33 +201,50 @@
} }
}, },
"radio": { "radio": {
"name": "", "name": "Ràdio |||| Ràdios",
"fields": { "fields": {
"name": "", "name": "Nom",
"streamUrl": "", "streamUrl": "URL del flux",
"homePageUrl": "", "homePageUrl": "URL principal",
"updatedAt": "", "updatedAt": "Actualitzat",
"createdAt": "" "createdAt": "Creat"
}, },
"actions": { "actions": {
"playNow": "" "playNow": "Reprodueix"
} }
}, },
"share": { "share": {
"name": "", "name": "Compartir |||| Compartits",
"fields": { "fields": {
"username": "", "username": "Compartit per",
"url": "", "url": "URL",
"description": "", "description": "Descripció",
"contents": "", "downloadable": "Permet descarregar?",
"expiresAt": "", "contents": "Continguts",
"lastVisitedAt": "", "expiresAt": "Caduca",
"visitCount": "", "lastVisitedAt": "Última Visita",
"format": "", "visitCount": "Visites",
"maxBitRate": "", "format": "Format",
"updatedAt": "", "maxBitRate": "Taxa de bits màx.",
"createdAt": "", "updatedAt": "Actualitzat",
"downloadable": "" "createdAt": "Creat"
},
"notifications": {},
"actions": {}
},
"missing": {
"name": "Fitxer faltant |||| Fitxers Faltants",
"empty": "No falten fitxers",
"fields": {
"path": "Directori",
"size": "Mida",
"updatedAt": "Desaparegut"
},
"actions": {
"remove": "Eliminar"
},
"notifications": {
"removed": "Fitxers faltants eliminats"
} }
} }
}, },
@ -211,28 +260,30 @@
"password": "Contrasenya", "password": "Contrasenya",
"sign_in": "Inicia sessió", "sign_in": "Inicia sessió",
"sign_in_error": "L'autenticació ha fallat, torneu-ho a intentar", "sign_in_error": "L'autenticació ha fallat, torneu-ho a intentar",
"logout": "Sortida" "logout": "Sortida",
"insightsCollectionNote": "Navidrome recull dades d'us anonimitzades per\najudar a millorar el projecte. Clica [aquí] per a saber-ne\nmés i no participar-hi si no vols"
}, },
"validation": { "validation": {
"invalidChars": "Si us plau, useu solament lletres i nombres", "invalidChars": "Si us plau, useu només lletres i nombres",
"passwordDoesNotMatch": "Les contrasenyes no coincideixen", "passwordDoesNotMatch": "Les contrasenyes no coincideixen",
"required": "Obligatori", "required": "Obligatori",
"minLength": "Ha de tenir, si més no, %{min} caràcters", "minLength": "Ha de tenir, si més no, %{min} caràcters",
"maxLength": "Ha de tenir %{max} caràcter o menys", "maxLength": "Ha de tenir %{max} caràcters o menys",
"minValue": "Ha de ser si més no %{min}", "minValue": "Ha de ser com a mínim %{min}",
"maxValue": "Ha de ser %{max} o menys", "maxValue": "Ha de ser %{max} o menys",
"number": "Ha de ser un nombre", "number": "Ha de ser un nombre",
"email": "Ha de ser un correu vàlid", "email": "Ha de ser un correu vàlid",
"oneOf": "Ha de ser un de: %{options}", "oneOf": "Ha de ser un de: %{options}",
"regex": "Ha de tenir el format (regexp): %{pattern}", "regex": "Ha de tenir el format (regexp): %{pattern}",
"unique": "Ha de ser únic", "unique": "Ha de ser únic",
"url": "" "url": "Ha de ser una URL vàlida"
}, },
"action": { "action": {
"add_filter": "Afegeix un filtre", "add_filter": "Afegeix un filtre",
"add": "Afegeix", "add": "Afegeix",
"back": "Enrere", "back": "Enrere",
"bulk_actions": "1 element seleccionat |||| %{smart_count} elements seleccionats", "bulk_actions": "1 element seleccionat |||| %{smart_count} elements seleccionats",
"bulk_actions_mobile": "1 |||| %{smart_count}",
"cancel": "Cancel·la", "cancel": "Cancel·la",
"clear_input_value": "Neteja el valor", "clear_input_value": "Neteja el valor",
"clone": "Clona", "clone": "Clona",
@ -256,9 +307,8 @@
"close_menu": "Tanca el menú", "close_menu": "Tanca el menú",
"unselect": "Anul·la la selecció", "unselect": "Anul·la la selecció",
"skip": "Omet", "skip": "Omet",
"bulk_actions_mobile": "", "share": "Compartir",
"share": "", "download": "Descarregar"
"download": ""
}, },
"boolean": { "boolean": {
"true": "Sí", "true": "Sí",
@ -334,7 +384,7 @@
"i18n_error": "No ha estat possible carregar les traduccions per a l'idioma indicat", "i18n_error": "No ha estat possible carregar les traduccions per a l'idioma indicat",
"canceled": "Acció cancel·lada", "canceled": "Acció cancel·lada",
"logged_out": "La sessió ha acabat, si us plau reconnecteu", "logged_out": "La sessió ha acabat, si us plau reconnecteu",
"new_version": "Hi ha una versió nova disponible! Si us plau refresqueu aquesta finestra." "new_version": "Hi ha una versió nova disponible! Si us plau actualitzeu aquesta finestra."
}, },
"toggleFieldsMenu": { "toggleFieldsMenu": {
"columnsToDisplay": "Columnes a mostrar", "columnsToDisplay": "Columnes a mostrar",
@ -351,29 +401,31 @@
"noPlaylistsAvailable": "No n'hi ha cap disponible", "noPlaylistsAvailable": "No n'hi ha cap disponible",
"delete_user_title": "Esborra usuari '%{nom}'", "delete_user_title": "Esborra usuari '%{nom}'",
"delete_user_content": "Segur que voleu eliminar aquest usuari i les seues dades\n(incloent-hi llistes i preferències)", "delete_user_content": "Segur que voleu eliminar aquest usuari i les seues dades\n(incloent-hi llistes i preferències)",
"remove_missing_title": "Eliminar fitxers faltants",
"remove_missing_content": "Segur que vols eliminar els fitxers faltants seleccionats de la base de dades? Això eliminarà permanentment les referències a ells, incloent-hi el nombre de reproduccions i les valoracions.",
"notifications_blocked": "Heu blocat les notificacions d'escriptori en les preferències del navegador", "notifications_blocked": "Heu blocat les notificacions d'escriptori en les preferències del navegador",
"notifications_not_available": "El navegador no suporta les notificacions o no heu connectat a Navidrome per https", "notifications_not_available": "El navegador no suporta les notificacions o no heu connectat a Navidrome per https",
"lastfmLinkSuccess": "Ha reexit la vinculació amb Last.fm i se n'ha activat el seguiment", "lastfmLinkSuccess": "Ha reexit la vinculació amb Last.fm i se n'ha activat el seguiment",
"lastfmLinkFailure": "No ha estat possible la vinculació amb Last.fm", "lastfmLinkFailure": "No ha estat possible la vinculació amb Last.fm",
"lastfmUnlinkSuccess": "Desvinculat de Last.fm i desactivat el seguiment", "lastfmUnlinkSuccess": "Desvinculat de Last.fm i desactivat el seguiment",
"lastfmUnlinkFailure": "No s'ha pogut desvincular de Last.fm", "lastfmUnlinkFailure": "No s'ha pogut desvincular de Last.fm",
"listenBrainzLinkSuccess": "Connectat correctament a ListenBrainz i seguiment activat com a: %{user}",
"listenBrainzLinkFailure": "No s'ha pogut connectar a ListenBrainz: %{error}",
"listenBrainzUnlinkSuccess": "ListenBrainz desconnectat i seguiment desactivat",
"listenBrainzUnlinkFailure": "No s'ha pogut desconnectar de ListenBrainz",
"openIn": { "openIn": {
"lastfm": "Obri en Last.fm", "lastfm": "Obri en Last.fm",
"musicbrainz": "Obri en MusicBrainz" "musicbrainz": "Obri en MusicBrainz"
}, },
"lastfmLink": "Llegeix més...", "lastfmLink": "Llegeix més...",
"listenBrainzLinkSuccess": "Ha reexit la vinculació amb ListenBrainz i se n'ha activat el seguiment com a usuari: %{user}", "shareOriginalFormat": "Compartir en format original",
"listenBrainzLinkFailure": "No ha estat possible vincular-se a ListenBrainz: %{error}", "shareDialogTitle": "Compartir %{resource} '%{name}'",
"listenBrainzUnlinkSuccess": "Desvinculat de ListenBrainz i desactivat el seguiment", "shareBatchDialogTitle": "Compartir 1 %{resource} |||| Compartir %{smart_count} %{resource}",
"listenBrainzUnlinkFailure": "No s'ha pogut desvincular de ListenBrainz", "shareCopyToClipboard": "Copiar al porta-retalls: Ctrl+C, Enter",
"downloadOriginalFormat": "", "shareSuccess": "URL copiada al porta-retalls: %{url}",
"shareOriginalFormat": "", "shareFailure": "Error copiant URL %{url} al porta-retalls",
"shareDialogTitle": "", "downloadDialogTitle": "Deascarregar %{resource} '%{name}' (%{size})",
"shareBatchDialogTitle": "", "downloadOriginalFormat": "Descarregar en format original"
"shareSuccess": "",
"shareFailure": "",
"downloadDialogTitle": "",
"shareCopyToClipboard": ""
}, },
"menu": { "menu": {
"library": "Discoteca", "library": "Discoteca",
@ -387,14 +439,15 @@
"language": "Llengua", "language": "Llengua",
"defaultView": "Vista per defecte", "defaultView": "Vista per defecte",
"desktop_notifications": "Notificacions d'escriptori", "desktop_notifications": "Notificacions d'escriptori",
"lastfmNotConfigured": "No s'ha configurat l'API de Last.fm",
"lastfmScrobbling": "Activa el seguiment de Last.fm", "lastfmScrobbling": "Activa el seguiment de Last.fm",
"listenBrainzScrobbling": "Activa el seguiment de ListenBrainz", "listenBrainzScrobbling": "Activa el seguiment de ListenBrainz",
"replaygain": "", "replaygain": "Mode ReplayGain",
"preAmp": "", "preAmp": "PreAmp de ReplayGain (dB)",
"gain": { "gain": {
"none": "", "none": "Cap",
"album": "", "album": "Guany de l'àlbum",
"track": "" "track": "Guany de la pista"
} }
} }
}, },
@ -432,7 +485,12 @@
"links": { "links": {
"homepage": "Inici", "homepage": "Inici",
"source": "Codi font", "source": "Codi font",
"featureRequests": "Sol·licitud de funcionalitats" "featureRequests": "Sol·licitud de funcionalitats",
"lastInsightsCollection": "Última recolecció d'informació",
"insights": {
"disabled": "Desactivada",
"waiting": "Esperant"
}
} }
}, },
"activity": { "activity": {
@ -454,7 +512,7 @@
"vol_up": "Apuja el volum", "vol_up": "Apuja el volum",
"vol_down": "Abaixa el volum", "vol_down": "Abaixa el volum",
"toggle_love": "Afegeix la pista a favorits", "toggle_love": "Afegeix la pista a favorits",
"current_song": "" "current_song": "Anar a la cançó actual"
} }
} }
} }

View File

@ -1,8 +1,8 @@
{ {
"languageName": "Engelsk", "languageName": "Norsk",
"resources": { "resources": {
"song": { "song": {
"name": "Låt |||| Låter", "name": "Sang |||| Sanger",
"fields": { "fields": {
"albumArtist": "Album Artist", "albumArtist": "Album Artist",
"duration": "Tid", "duration": "Tid",
@ -11,164 +11,165 @@
"title": "Tittel", "title": "Tittel",
"artist": "Artist", "artist": "Artist",
"album": "Album", "album": "Album",
"path": "Filbane", "path": "Filsti",
"genre": "Sjanger", "genre": "Sjanger",
"compilation": "Samling", "compilation": "Samlingg",
"year": "År", "year": "År",
"size": "Filstørrelse", "size": "Filstørrelse",
"updatedAt": "Oppdatert kl", "updatedAt": "Oppdatert",
"bitRate": "Bithastighet", "bitRate": "Bit rate",
"discSubtitle": "Diskundertekst", "bitDepth": "Bit depth",
"channels": "Kanaler",
"discSubtitle": "Disk Undertittel",
"starred": "Favoritt", "starred": "Favoritt",
"comment": "Kommentar", "comment": "Kommentar",
"rating": "Vurdering", "rating": "Rangering",
"quality": "Kvalitet", "quality": "Kvalitet",
"bpm": "BPM", "bpm": "BPM",
"playDate": "Sist spilt", "playDate": "Sist Avspilt",
"channels": "Kanaler", "createdAt": "Lagt til",
"createdAt": "", "grouping": "Gruppering",
"grouping": "", "mood": "Stemning",
"mood": "", "participants": "Ytterlige deltakere",
"participants": "", "tags": "Ytterlige Tags",
"tags": "", "mappedTags": "Kartlagte tags",
"mappedTags": "", "rawTags": "Rå tags"
"rawTags": "",
"bitDepth": ""
}, },
"actions": { "actions": {
"addToQueue": "Spill Senere", "addToQueue": "Avspill senere",
"playNow": "Leke nå", "playNow": "Avspill nå",
"addToPlaylist": "Legg til i spilleliste", "addToPlaylist": "Legg til i spilleliste",
"shuffleAll": "Bland alle", "shuffleAll": "Shuffle Alle",
"download": "nedlasting", "download": "Last ned",
"playNext": "Spill Neste", "playNext": "Avspill neste",
"info": "Få informasjon" "info": "Få Info"
} }
}, },
"album": { "album": {
"name": "Album", "name": "Album |||| Album",
"fields": { "fields": {
"albumArtist": "Album Artist", "albumArtist": "Album Artist",
"artist": "Artist", "artist": "Artist",
"duration": "Tid", "duration": "Tid",
"songCount": "Sanger", "songCount": "Sanger",
"playCount": "Avspillinger", "playCount": "Avspillinger",
"size": "Størrelse",
"name": "Navn", "name": "Navn",
"genre": "Sjanger", "genre": "Sjanger",
"compilation": "Samling", "compilation": "Samling",
"year": "År", "year": "År",
"updatedAt": "Oppdatert kl", "date": "Inspillingsdato",
"originalDate": "Original",
"releaseDate": "Utgitt",
"releases": "Utgivelse |||| Utgivelser",
"released": "Utgitt",
"updatedAt": "Oppdatert",
"comment": "Kommentar", "comment": "Kommentar",
"rating": "Vurdering", "rating": "Rangering",
"createdAt": "", "createdAt": "Lagt Til",
"size": "", "recordLabel": "Plateselskap",
"originalDate": "", "catalogNum": "Katalognummer",
"releaseDate": "", "releaseType": "Type",
"releases": "", "grouping": "Gruppering",
"released": "", "media": "Media",
"recordLabel": "", "mood": "Stemning"
"catalogNum": "",
"releaseType": "",
"grouping": "",
"media": "",
"mood": ""
}, },
"actions": { "actions": {
"playAll": "Spill", "playAll": "Avspill",
"playNext": "Spill neste", "playNext": "Avspill Neste",
"addToQueue": "Spille senere", "addToQueue": "Avspill Senere",
"shuffle": "Bland", "share": "Del",
"shuffle": "Shuffle",
"addToPlaylist": "Legg til i spilleliste", "addToPlaylist": "Legg til i spilleliste",
"download": "nedlasting", "download": "Last ned",
"info": "Få informasjon", "info": "Få Info"
"share": ""
}, },
"lists": { "lists": {
"all": "Alle", "all": "Alle",
"random": "Tilfeldig", "random": "Tilfeldig",
"recentlyAdded": "Nylig lagt til", "recentlyAdded": "Nylig lagt til",
"recentlyPlayed": "Nylig spilt", "recentlyPlayed": "Nylig Avspilt",
"mostPlayed": "Mest spilte", "mostPlayed": "Mest Avspilt",
"starred": "Favoritter", "starred": "Favoritter",
"topRated": "Topp rangert" "topRated": "Top Rangert"
} }
}, },
"artist": { "artist": {
"name": "Artist |||| Artister", "name": "Artist |||| Artister",
"fields": { "fields": {
"name": "Navn", "name": "Navn",
"albumCount": "Antall album", "albumCount": "Album Antall",
"songCount": "Antall sanger", "songCount": "Song Antall",
"playCount": "Spiller", "size": "Størrelse",
"rating": "Vurdering", "playCount": "Avspillinger",
"rating": "Rangering",
"genre": "Sjanger", "genre": "Sjanger",
"size": "", "role": "Rolle"
"role": ""
}, },
"roles": { "roles": {
"albumartist": "", "albumartist": "Album Artist |||| Album Artister",
"artist": "", "artist": "Artist |||| Artister",
"composer": "", "composer": "Composer |||| Composers",
"conductor": "", "conductor": "Conductor |||| Conductors",
"lyricist": "", "lyricist": "Lyriker |||| Lyriker",
"arranger": "", "arranger": "Arranger |||| Arrangers",
"producer": "", "producer": "Produsent |||| Produsenter",
"director": "", "director": "Director |||| Directors",
"engineer": "", "engineer": "Engineer |||| Engineers",
"mixer": "", "mixer": "Mixer |||| Mixers",
"remixer": "", "remixer": "Remixer |||| Remixers",
"djmixer": "", "djmixer": "DJ Mixer |||| DJ Mixers",
"performer": "" "performer": "Performer |||| Performers"
} }
}, },
"user": { "user": {
"name": "Bruker |||| Brukere", "name": "Bruker |||| Brukere",
"fields": { "fields": {
"userName": "Brukernavn", "userName": "Brukernavn",
"isAdmin": "er admin", "isAdmin": "Admin",
"lastLoginAt": "Siste pålogging kl", "lastLoginAt": "Sist Pålogging",
"updatedAt": "Oppdatert kl", "lastAccessAt": "Sist Tilgang",
"updatedAt": "Oppdatert",
"name": "Navn", "name": "Navn",
"password": "Passord", "password": "Passord",
"createdAt": "Opprettet kl", "createdAt": "Opprettet",
"changePassword": "Bytte Passord", "changePassword": "Bytt Passord?",
"currentPassword": "Nåværende Passord", "currentPassword": "Nåværende Passord",
"newPassword": "Nytt Passord", "newPassword": "Nytt Passord",
"token": "Token", "token": "Token"
"lastAccessAt": ""
}, },
"helperTexts": { "helperTexts": {
"name": "Endringer i navnet ditt vil kun gjenspeiles ved neste pålogging" "name": "Navnendringer vil ikke være synlig før neste pålogging"
}, },
"notifications": { "notifications": {
"created": "Bruker opprettet", "created": "Bruker opprettet",
"updated": "Bruker oppdatert", "updated": "Bruker oppdatert",
"deleted": "Bruker fjernet" "deleted": "Bruker slettet"
}, },
"message": { "message": {
"listenBrainzToken": "Skriv inn ListenBrainz-brukertokenet ditt.", "listenBrainzToken": "Fyll inn din ListenBrainz bruker token.",
"clickHereForToken": "Klikk her for å få tokenet ditt" "clickHereForToken": "Klikk her for å hente din token"
} }
}, },
"player": { "player": {
"name": "Avspiller |||| Avspillere", "name": "Musikkavspiller |||| Musikkavspillere",
"fields": { "fields": {
"name": "Navn", "name": "Navn",
"transcodingId": "Omkoding", "transcodingId": "Transkoding",
"maxBitRate": "Maks. Bithastighet", "maxBitRate": "Maks. Bit Rate",
"client": "Klient", "client": "Klient",
"userName": "Brukernavn", "userName": "Brukernavn",
"lastSeen": "Sist sett kl", "lastSeen": "Sist sett",
"reportRealPath": "Rapporter ekte sti", "reportRealPath": "Rapporter ekte filsti",
"scrobbleEnabled": "Send Scrobbles til eksterne tjenester" "scrobbleEnabled": "Send Scrobbles til eksterne tjenester"
} }
}, },
"transcoding": { "transcoding": {
"name": "Omkoding |||| Omkodinger", "name": "Transkoding |||| Transkodinger",
"fields": { "fields": {
"name": "Navn", "name": "Navn",
"targetFormat": "Målformat", "targetFormat": "Mål Format",
"defaultBitRate": "Standard bithastighet", "defaultBitRate": "Default Bit Rate",
"command": "Kommando" "command": "Kommando"
} }
}, },
@ -176,135 +177,137 @@
"name": "Spilleliste |||| Spillelister", "name": "Spilleliste |||| Spillelister",
"fields": { "fields": {
"name": "Navn", "name": "Navn",
"duration": "Varighet", "duration": "Lengde",
"ownerName": "Eieren", "ownerName": "Eier",
"public": "Offentlig", "public": "Offentlig",
"updatedAt": "Oppdatert kl", "updatedAt": "Oppdatert",
"createdAt": "Opprettet kl", "createdAt": "Opprettet",
"songCount": "Sanger", "songCount": "Sanger",
"comment": "Kommentar", "comment": "Kommentar",
"sync": "Autoimport", "sync": "Auto-importer",
"path": "Import fra" "path": "Importer fra"
}, },
"actions": { "actions": {
"selectPlaylist": "Velg en spilleliste:", "selectPlaylist": "Velg en spilleliste:",
"addNewPlaylist": "Opprett \"%{name}\"", "addNewPlaylist": "Opprett \"%{name}\"",
"export": "Eksport", "export": "Eksporter",
"makePublic": "Gjør offentlig", "makePublic": "Gjør Offentlig",
"makePrivate": "Gjør privat" "makePrivate": "Gjør Privat"
}, },
"message": { "message": {
"duplicate_song": "Legg til dupliserte sanger", "duplicate_song": "Legg til Duplikater",
"song_exist": "Det legges til duplikater i spillelisten. Vil du legge til duplikatene eller hoppe over dem?" "song_exist": "Duplikater har blitt lagt til i spillelisten. Ønsker du å legge til duplikater eller hoppe over de?"
} }
}, },
"radio": { "radio": {
"name": "", "name": "Radio |||| Radio",
"fields": { "fields": {
"name": "", "name": "Navn",
"streamUrl": "", "streamUrl": "Stream URL",
"homePageUrl": "", "homePageUrl": "Hjemmeside URL",
"updatedAt": "", "updatedAt": "Oppdatert",
"createdAt": "" "createdAt": "Opprettet"
}, },
"actions": { "actions": {
"playNow": "" "playNow": "Avspill"
} }
}, },
"share": { "share": {
"name": "", "name": "Del |||| Delinger",
"fields": { "fields": {
"username": "", "username": "Delt Av",
"url": "", "url": "URL",
"description": "", "description": "Beskrivelse",
"contents": "", "downloadable": "Tillat Nedlastinger?",
"expiresAt": "", "contents": "Innhold",
"lastVisitedAt": "", "expiresAt": "Utløper",
"visitCount": "", "lastVisitedAt": "Sist Besøkt",
"format": "", "visitCount": "Visninger",
"maxBitRate": "", "format": "Format",
"updatedAt": "", "maxBitRate": "Maks. Bit Rate",
"createdAt": "", "updatedAt": "Oppdatert",
"downloadable": "" "createdAt": "Opprettet"
} },
"notifications": {},
"actions": {}
}, },
"missing": { "missing": {
"name": "", "name": "Manglende Fil|||| Manglende Filer",
"empty": "Ingen Manglende Filer",
"fields": { "fields": {
"path": "", "path": "Filsti",
"size": "", "size": "Størrelse",
"updatedAt": "" "updatedAt": "Ble borte"
}, },
"actions": { "actions": {
"remove": "" "remove": "Fjern"
}, },
"notifications": { "notifications": {
"removed": "" "removed": "Manglende fil(er) fjernet"
}, }
"empty": ""
} }
}, },
"ra": { "ra": {
"auth": { "auth": {
"welcome1": "Takk for at du installerte Navidrome!", "welcome1": "Takk for at du installerte Navidrome!",
"welcome2": "Opprett en admin -bruker for å starte", "welcome2": "La oss begynne med å lage en admin bruker.",
"confirmPassword": "Bekreft Passord", "confirmPassword": "Bekreft Passord",
"buttonCreateAdmin": "Opprett Admin", "buttonCreateAdmin": "Opprett Admin",
"auth_check_error": "Vennligst Logg inn for å fortsette", "auth_check_error": "Logg inn for å fortsette",
"user_menu": "Profil", "user_menu": "Profil",
"username": "Brukernavn", "username": "Brukernavn",
"password": "Passord", "password": "Passord",
"sign_in": "Logg inn", "sign_in": "Logg inn",
"sign_in_error": "Autentisering mislyktes. Prøv på nytt", "sign_in_error": "Autentiseringsfeil, vennligst prøv igjen",
"logout": "Logg ut", "logout": "Logg ut",
"insightsCollectionNote": "" "insightsCollectionNote": "Navidrome innhenter anonymisert forbruksdata\nfor å hjelpe og forbedre prosjektet.\nTrykk [her] for å lære mer og for å melde deg av hvis ønskelig."
}, },
"validation": { "validation": {
"invalidChars": "Bruk bare bokstaver og tall", "invalidChars": "Det er kun bokstaver og tall som støttes",
"passwordDoesNotMatch": "Passordet er ikke like", "passwordDoesNotMatch": "Passord samstemmer ikke",
"required": "Obligatorisk", "required": "Kreves",
"minLength": "Må være minst %{min} tegn", "minLength": "Må være minst %{min} karakterer.",
"maxLength": "Må være %{max} tegn eller færre", "maxLength": "Må være %{max} karakterer eller mindre",
"minValue": "Må være minst %{min}", "minValue": "Må være minst %{min}",
"maxValue": "Må være %{max} eller mindre", "maxValue": "Må være %{max} eller mindre",
"number": "Må være et tall", "number": "Må være et tall",
"email": "Må være en gyldig e-post", "email": "Må være en gyldig epost",
"oneOf": "Må være en av: %{options}", "oneOf": "Må være en av: %{options}",
"regex": "Må samsvare med et spesifikt format (regexp): %{pattern}", "regex": "Må samstemme med et spesifikt format (regexp): %{pattern}",
"unique": "Må være unik", "unique": "Må være unikt",
"url": "" "url": "Må være en gyldig URL"
}, },
"action": { "action": {
"add_filter": "Legg til filter", "add_filter": "Legg til filter",
"add": "Legge til", "add": "Legg Til",
"back": "Gå tilbake", "back": "Tilbake",
"bulk_actions": "1 element valgt |||| %{smart_count} elementer er valgt", "bulk_actions": "1 element valgt |||| %{smart_count} elementer valgt",
"bulk_actions_mobile": "1 |||| %{smart_count}",
"cancel": "Avbryt", "cancel": "Avbryt",
"clear_input_value": "Klar verdi", "clear_input_value": "Nullstill verdi",
"clone": "Klone", "clone": "Klone",
"confirm": "Bekrefte", "confirm": "Bekreft",
"create": "Skape", "create": "Opprett",
"delete": "Slett", "delete": "Slett",
"edit": "Redigere", "edit": "Rediger",
"export": "Eksport", "export": "Eksporter",
"list": "Liste", "list": "Liste",
"refresh": "oppdater", "refresh": "Oppdater",
"remove_filter": "Fjern dette filteret", "remove_filter": "Fjern dette filteret",
"remove": "Fjerne", "remove": "Fjern",
"save": "Lagre", "save": "Lagre",
"search": "Søk", "search": "Søk",
"show": "Vis", "show": "Vis",
"sort": "Sortere", "sort": "Sorter",
"undo": "Angre", "undo": "Angre",
"expand": "Utvide", "expand": "Utvid",
"close": "Lukk", "close": "Lukk",
"open_menu": "Åpne menyen", "open_menu": "Åpne meny",
"close_menu": "Lukk menyen", "close_menu": "Lukk meny",
"unselect": "Fjern valget", "unselect": "Avvelg",
"skip": "Hopp over", "skip": "Hopp over",
"bulk_actions_mobile": "", "share": "Del",
"share": "", "download": "Last Ned"
"download": ""
}, },
"boolean": { "boolean": {
"true": "Ja", "true": "Ja",
@ -312,29 +315,29 @@
}, },
"page": { "page": {
"create": "Opprett %{name}", "create": "Opprett %{name}",
"dashboard": "Dashbord", "dashboard": "Dashboard",
"edit": "%{name} #%{id}", "edit": "%{name} #%{id}",
"error": "Noe gikk galt", "error": "Noe gikk galt",
"list": "%{Navn}", "list": "%{name}",
"loading": "Laster", "loading": "Laster",
"not_found": "Ikke funnet", "not_found": "Ikke Funnet",
"show": "%{name} #%{id}", "show": "%{name} #%{id}",
"empty": "Ingen %{name} en.", "empty": "Ingen %{name} enda.",
"invite": "Vil du legge til en?" "invite": "Ønsker du å legge til en?"
}, },
"input": { "input": {
"file": { "file": {
"upload_several": "Slipp noen filer for å laste opp, eller klikk for å velge en.", "upload_several": "Dra filer hit for å laste opp, eller klikk for å velge en.",
"upload_single": "Slipp en fil for å laste opp, eller klikk for å velge den." "upload_single": "Dra en fil hit for å laste opp, eller klikk for å velge den."
}, },
"image": { "image": {
"upload_several": "Slipp noen bilder for å laste opp, eller klikk for å velge ett.", "upload_several": "Dra bilder hit for å laste opp, eller klikk for å velge en.",
"upload_single": "Slipp et bilde for å laste opp, eller klikk for å velge det." "upload_single": "Dra et bilde hit for å laste opp, eller klikk for å velge den."
}, },
"references": { "references": {
"all_missing": "Kan ikke finne referansedata.", "all_missing": "Finner ikke referansedata.",
"many_missing": "Minst én av de tilknyttede referansene ser ikke ut til å være tilgjengelig lenger.", "many_missing": "Minst en av de tilhørende referansene ser ikke lenger ut til å være tilgjengelig.",
"single_missing": "Tilknyttet referanse ser ikke lenger ut til å være tilgjengelig." "single_missing": "Tilhørende referanse ser ikke lenger ut til å være tilgjengelig."
}, },
"password": { "password": {
"toggle_visible": "Skjul passord", "toggle_visible": "Skjul passord",
@ -346,86 +349,86 @@
"are_you_sure": "Er du sikker?", "are_you_sure": "Er du sikker?",
"bulk_delete_content": "Er du sikker på at du vil slette denne %{name}? |||| Er du sikker på at du vil slette disse %{smart_count} elementene?", "bulk_delete_content": "Er du sikker på at du vil slette denne %{name}? |||| Er du sikker på at du vil slette disse %{smart_count} elementene?",
"bulk_delete_title": "Slett %{name} |||| Slett %{smart_count} %{name}", "bulk_delete_title": "Slett %{name} |||| Slett %{smart_count} %{name}",
"delete_content": "Er du sikker på at du vil slette dette elementet?", "delete_content": "Er du sikker på at du ønsker å slette dette elementet?",
"delete_title": "Slett %{name} #%{id}", "delete_title": "Slett %{name} #%{id}",
"details": "Detaljer", "details": "Detaljer",
"error": "Det oppstod en klientfeil og forespørselen din kunne ikke fullføres.", "error": "En klient feil har oppstått og din forespørsel lot seg ikke gjennomføre.",
"invalid_form": "Skjemaet er ikke gyldig. Vennligst se etter feil", "invalid_form": "Skjemaet er ikke gyldig. Vennligst se etter feil.",
"loading": "Siden lastes, bare et øyeblikk", "loading": "Siden laster, vennligst vent.",
"no": "Nei", "no": "Nei",
"not_found": "Enten skrev du inn feil URL, eller så fulgte du en dårlig lenke.", "not_found": "Enten skrev du feil URL, eller så har du fulgt en dårlig link.",
"yes": "Ja", "yes": "Ja",
"unsaved_changes": "Noen av endringene dine ble ikke lagret. Er du sikker på at du vil ignorere dem?" "unsaved_changes": "Noen av dine endringer ble ikke lagret. Er du sikker på at du ønsker å ignorere de?"
}, },
"navigation": { "navigation": {
"no_results": "Ingen resultater", "no_results": "Ingen resultater",
"no_more_results": "Sidetallet %{page} er utenfor grensene. Prøv forrige side.", "no_more_results": "Sidenummeret %{page} er utenfor grensene. Prøv forrige side.",
"page_out_of_boundaries": "Sidetall %{page} utenfor grensene", "page_out_of_boundaries": "Sidenummer %{page} er utenfor grensene",
"page_out_from_end": "Kan ikke etter siste side", "page_out_from_end": "Kan ikke være etter siste side",
"page_out_from_begin": "Kan ikke før side 1", "page_out_from_begin": "Kan ikke være før side 1",
"page_range_info": "%{offsetBegin}-%{offsetEnd} av %{total}", "page_range_info": "%{offsetBegin}-%{offsetEnd} av %{total}",
"page_rows_per_page": "Elementer per side:", "page_rows_per_page": "Elementer per side:",
"next": "Neste", "next": "Neste",
"prev": "Forrige", "prev": "Forrige",
"skip_nav": "Hopp til innholdet" "skip_nav": "Hopp til innhold"
}, },
"notification": { "notification": {
"updated": "Element oppdatert |||| %{smart_count} elementer er oppdatert", "updated": "Element oppdatert |||| %{smart_count} elementer oppdatert",
"created": "Element opprettet", "created": "Element opprettet",
"deleted": "Element slettet |||| %{smart_count} elementer slettet", "deleted": "Element slettet |||| %{smart_count} elementer slettet",
"bad_item": "Feil element", "bad_item": "Feil element",
"item_doesnt_exist": "Elementet eksisterer ikke", "item_doesnt_exist": "Element eksisterer ikke",
"http_error": "Serverkommunikasjonsfeil", "http_error": "Kommunikasjonsfeil mot server",
"data_provider_error": "dataleverandørfeil. Sjekk konsollen for detaljer.", "data_provider_error": "dataProvider feil. Sjekk konsollet for feil.",
"i18n_error": "Kan ikke laste oversettelsene for det angitte språket", "i18n_error": "Klarte ikke laste oversettelser for valgt språk.",
"canceled": "Handlingen avbrutt", "canceled": "Handling avbrutt",
"logged_out": "Økten din er avsluttet. Koble til på nytt.", "logged_out": "Din sesjon er avsluttet, vennligst koble til på nytt.",
"new_version": "Ny versjon tilgjengelig! Trykk Oppdater " "new_version": "Ny versjon tilgjengelig! Vennligst last siden på nytt."
}, },
"toggleFieldsMenu": { "toggleFieldsMenu": {
"columnsToDisplay": "Kolonner som skal vises", "columnsToDisplay": "Vis følgende kolonner",
"layout": "Oppsett", "layout": "Layout",
"grid": "Nett", "grid": "Rutenett",
"table": "Bord" "table": "Tabell"
} }
}, },
"message": { "message": {
"note": "Info", "note": "NOTAT",
"transcodingDisabled": "Endring av transkodingskonfigurasjonen gjennom webgrensesnittet er deaktivert av sikkerhetsgrunner. Hvis du ønsker å endre (redigere eller legge til) transkodingsalternativer, start serveren på nytt med %{config}-konfigurasjonsalternativet.", "transcodingDisabled": "Endringer på transkodingkonfigurasjon fra web grensesnittet er deaktivert grunnet sikkerhet. Hvis du ønsker å endre eller legge til transkodingsmuligheter, restart serveren med %{config} konfigurasjonsalternativ.",
"transcodingEnabled": "Navidrome kjører for øyeblikket med %{config}, noe som gjør det mulig å kjøre systemkommandoer fra transkodingsinnstillingene ved å bruke nettgrensesnittet. Vi anbefaler å deaktivere den av sikkerhetsgrunner og bare aktivere den når du konfigurerer alternativer for omkoding.", "transcodingEnabled": "Navidrome kjører for øyeblikket med %{config}, som gjør det mulig å kjøre systemkommandoer fra transkodingsinstillinger i web grensesnittet. Vi anbefaler å deaktivere denne muligheten av sikkerhetsårsaker og heller kun ha det aktivert under konfigurasjon av transkodingsmuligheter.",
"songsAddedToPlaylist": "Lagt til 1 sang i spillelisten |||| Lagt til %{smart_count} sanger i spillelisten", "songsAddedToPlaylist": "Lagt til 1 sang i spillelisten |||| Lagt til %{smart_count} sanger i spillelisten",
"noPlaylistsAvailable": "Ingen tilgjengelig", "noPlaylistsAvailable": "Ingen tilgjengelig",
"delete_user_title": "Slett bruker «%{name}»", "delete_user_title": "Slett bruker '%{name}'",
"delete_user_content": "Er du sikker på at du vil slette denne brukeren og alle dataene deres (inkludert spillelister og preferanser)?", "delete_user_content": "Er du sikker på at du vil slette denne brukeren og all tilhørlig data (inkludert spillelister og preferanser)?",
"notifications_blocked": "Du har blokkert varsler for dette nettstedet i nettleserens innstillinger", "remove_missing_title": "Fjern manglende filer",
"notifications_not_available": "Denne nettleseren støtter ikke skrivebordsvarsler, eller du har ikke tilgang til Navidrome over https", "remove_missing_content": "Er du sikker på at du ønsker å fjerne de valgte manglende filene fra databasen? Dette vil permanent fjerne alle referanser til de, inkludert antall avspillinger og rangeringer.",
"lastfmLinkSuccess": "Last.fm er vellykket koblet og scrobbling aktivert", "notifications_blocked": "Du har blokkert notifikasjoner for denne nettsiden i din nettleser.",
"lastfmLinkFailure": "Last.fm kunne ikke kobles til", "notifications_not_available": "Denne nettleseren støtter ikke skrivebordsnotifikasjoner, eller så er du ikke tilkoblet Navidrome via https.",
"lastfmUnlinkSuccess": "Last.fm koblet fra og scrobbling deaktivert", "lastfmLinkSuccess": "Last.fm er tilkoblet og scrobbling er aktivert",
"lastfmUnlinkFailure": "Last.fm kunne ikke kobles fra", "lastfmLinkFailure": "Last.fm kunne ikke koble til",
"lastfmUnlinkSuccess": "Last.fm er avkoblet og scrobbling er deaktivert",
"lastfmUnlinkFailure": "Last.fm kunne ikke avkobles",
"listenBrainzLinkSuccess": "ListenBrainz er koblet til og scrobbling er aktivert som bruker: %{user}",
"listenBrainzLinkFailure": "ListenBrainz kunne ikke koble til: %{error}",
"listenBrainzUnlinkSuccess": "ListenBrainz er avkoblet og scrobbling er deaktivert",
"listenBrainzUnlinkFailure": "ListenBrainz kunne ikke avkobles",
"openIn": { "openIn": {
"lastfm": "Åpne i Last.fm", "lastfm": "Åpne i Last.fm",
"musicbrainz": "Åpne i MusicBrainz" "musicbrainz": "Åpne i MusicBrainz"
}, },
"lastfmLink": "Les mer...", "lastfmLink": "Les Mer...",
"listenBrainzLinkSuccess": "ListenBrainz er vellykket koblet og scrobbling aktivert som bruker: %{user}", "shareOriginalFormat": "Del i originalformat",
"listenBrainzLinkFailure": "ListenBrainz kunne ikke kobles: %{error}", "shareDialogTitle": "Del %{resource} '%{name}'",
"listenBrainzUnlinkSuccess": "ListenBrainz koblet fra og scrobbling deaktivert", "shareBatchDialogTitle": "Del 1 %{resource} |||| Del %{smart_count} %{resource}",
"listenBrainzUnlinkFailure": "ListenBrainz kunne ikke fjernes", "shareCopyToClipboard": "Kopier til utklippstavle: Ctrl+C, Enter",
"downloadOriginalFormat": "", "shareSuccess": "URL kopiert til utklippstavle: %{url}",
"shareOriginalFormat": "", "shareFailure": "Error ved kopiering av URL %{url} til utklippstavle",
"shareDialogTitle": "", "downloadDialogTitle": "Last ned %{resource} '%{name}' (%{size})",
"shareBatchDialogTitle": "", "downloadOriginalFormat": "Last ned i originalformat"
"shareSuccess": "",
"shareFailure": "",
"downloadDialogTitle": "",
"shareCopyToClipboard": "",
"remove_missing_title": "",
"remove_missing_content": ""
}, },
"menu": { "menu": {
"library": "Bibliotek", "library": "Bibliotek",
"settings": "Innstillinger", "settings": "Instillinger",
"version": "Versjon", "version": "Versjon",
"theme": "Tema", "theme": "Tema",
"personal": { "personal": {
@ -434,81 +437,81 @@
"theme": "Tema", "theme": "Tema",
"language": "Språk", "language": "Språk",
"defaultView": "Standardvisning", "defaultView": "Standardvisning",
"desktop_notifications": "Skrivebordsvarsler", "desktop_notifications": "Skrivebordsnotifikasjoner",
"lastfmNotConfigured": "Last.fm API-Key er ikke konfigurert",
"lastfmScrobbling": "Scrobble til Last.fm", "lastfmScrobbling": "Scrobble til Last.fm",
"listenBrainzScrobbling": "Scrobble til ListenBrainz", "listenBrainzScrobbling": "Scrobble til ListenBrainz",
"replaygain": "", "replaygain": "ReplayGain Mode",
"preAmp": "", "preAmp": "ReplayGain PreAmp (dB)",
"gain": { "gain": {
"none": "", "none": "Deaktivert",
"album": "", "album": "Bruk Album Gain",
"track": "" "track": "Bruk Track Gain"
}, }
"lastfmNotConfigured": ""
} }
}, },
"albumList": "Album", "albumList": "Album",
"about": "Om", "playlists": "Spillelister",
"playlists": "Spilleliste", "sharedPlaylists": "Delte Spillelister",
"sharedPlaylists": "Delte spillelister" "about": "Om"
}, },
"player": { "player": {
"playListsText": "Spillekø", "playListsText": "Spill Av Kø",
"openText": "Åpne", "openText": "Åpne",
"closeText": "Lukk", "closeText": "Lukk",
"notContentText": "Ingen musikk", "notContentText": "Ingen musikk",
"clickToPlayText": "Klikk for å spille", "clickToPlayText": "Klikk for å avspille",
"clickToPauseText": "Klikk for å sette på pause", "clickToPauseText": "Klikk for å pause",
"nextTrackText": "Neste spor", "nextTrackText": "Neste spor",
"previousTrackText": "Forrige spor", "previousTrackText": "Forrige spor",
"reloadText": "Last inn på nytt", "reloadText": "Last på nytt",
"volumeText": "Volum", "volumeText": "Volum",
"toggleLyricText": "Veksle mellom tekster", "toggleLyricText": "Slå på/av sangtekster",
"toggleMiniModeText": "Minimer", "toggleMiniModeText": "Minimer",
"destroyText": "Ødelegge", "destroyText": "Ødelegg",
"downloadText": "nedlasting", "downloadText": "Last Ned",
"removeAudioListsText": "Slett lydlister", "removeAudioListsText": "Slett lydlister",
"clickToDeleteText": "Klikk for å slette %{name}", "clickToDeleteText": "Klikk for å slette %{name}",
"emptyLyricText": "Ingen sangtekster", "emptyLyricText": "Ingen sangtekster",
"playModeText": { "playModeText": {
"order": "I rekkefølge", "order": "I rekkefølge",
"orderLoop": "Gjenta", "orderLoop": "Repeat",
"singleLoop": "Gjenta engang", "singleLoop": "Repeat En",
"shufflePlay": "Tilfeldig rekkefølge" "shufflePlay": "Shuffle"
} }
}, },
"about": { "about": {
"links": { "links": {
"homepage": "Hjemmeside", "homepage": "Hjemmeside",
"source": "Kildekode", "source": "Kildekode",
"featureRequests": "Funksjonsforespørsler", "featureRequests": "Funksjonsforespørseler",
"lastInsightsCollection": "", "lastInsightsCollection": "Siste Innsamling av anonymisert forbruksdata",
"insights": { "insights": {
"disabled": "", "disabled": "Deaktivert",
"waiting": "" "waiting": "Venter"
} }
} }
}, },
"activity": { "activity": {
"title": "Aktivitet", "title": "Aktivitet",
"totalScanned": "Totalt skannede mapper", "totalScanned": "Antall mapper skannet",
"quickScan": "Rask skanning", "quickScan": "Hurtigskann",
"fullScan": "Full skanning", "fullScan": "Full Skann",
"serverUptime": "Serveroppetid", "serverUptime": "Server Oppetid",
"serverDown": "OFFLINE" "serverDown": "OFFLINE"
}, },
"help": { "help": {
"title": "Navidrome hurtigtaster", "title": "Navidrome Hurtigtaster",
"hotkeys": { "hotkeys": {
"show_help": "Vis denne hjelpen", "show_help": "Vis Hjelp",
"toggle_menu": "Bytt menysidelinje", "toggle_menu": "Åpne/Lukke Sidepanel",
"toggle_play": "Spill / Pause", "toggle_play": "Avspill / Pause",
"prev_song": "Forrige sang", "prev_song": "Forrige Sang",
"next_song": "Neste sang", "next_song": "Neste Sang",
"vol_up": "Volum opp", "current_song": "Gå til Nåværende Sang",
"vol_down": "Volum ned", "vol_up": "Volum Opp",
"toggle_love": "Legg til dette sporet i favoritter", "vol_down": "Volum Ned",
"current_song": "" "toggle_love": "Legg til spor i favoritter"
} }
} }
} }

View File

@ -33,7 +33,8 @@
"tags": "Дополнительные теги", "tags": "Дополнительные теги",
"mappedTags": "Сопоставленные теги", "mappedTags": "Сопоставленные теги",
"rawTags": "Исходные теги", "rawTags": "Исходные теги",
"bitDepth": "Битовая глубина" "bitDepth": "Битовая глубина",
"sampleRate": "Частота дискретизации (Гц)"
}, },
"actions": { "actions": {
"addToQueue": "В очередь", "addToQueue": "В очередь",
@ -72,7 +73,7 @@
"grouping": "Группирование", "grouping": "Группирование",
"media": "Медиа", "media": "Медиа",
"mood": "Настроение", "mood": "Настроение",
"date": "" "date": "Дата записи"
}, },
"actions": { "actions": {
"playAll": "Играть", "playAll": "Играть",

View File

@ -4,38 +4,45 @@
"song": { "song": {
"name": "Песма |||| Песме", "name": "Песма |||| Песме",
"fields": { "fields": {
"albumArtist": "Уметник албума",
"duration": "Трајање",
"trackNumber": "#",
"playCount": "Пуштано",
"title": "Наслов",
"artist": "Уметник",
"album": "Албум", "album": "Албум",
"path": "Путања фајла", "albumArtist": "Уметник албума",
"genre": "Жанр", "artist": "Уметник",
"compilation": "Компилација", "bitDepth": "Битова",
"year": "Година",
"size": "Величина фајла",
"updatedAt": "Ажурирано",
"bitRate": "Битски проток", "bitRate": "Битски проток",
"channels": "Канала",
"discSubtitle": "Поднаслов диска",
"starred": "Омиљено",
"comment": "Коментар",
"rating": "Рејтинг",
"quality": "Квалитет",
"bpm": "BPM", "bpm": "BPM",
"channels": "Канала",
"comment": "Коментар",
"compilation": "Компилација",
"createdAt": "Датум додавања",
"discSubtitle": "Поднаслов диска",
"duration": "Трајање",
"genre": "Жанр",
"grouping": "Груписање",
"mappedTags": "Мапиране ознаке",
"mood": "Расположење",
"participants": "Додатни учесници",
"path": "Путања фајла",
"playCount": "Пуштано",
"playDate": "Последње пуштано", "playDate": "Последње пуштано",
"createdAt": "Датум додавања" "quality": "Квалитет",
"rating": "Рејтинг",
"rawTags": "Сирове ознаке",
"size": "Величина фајла",
"starred": "Омиљено",
"tags": "Додатне ознаке",
"title": "Наслов",
"trackNumber": "#",
"updatedAt": "Ажурирано",
"year": "Година"
}, },
"actions": { "actions": {
"addToQueue": "Пусти касније",
"playNow": "Пусти одмах",
"addToPlaylist": "Додај у плејлисту", "addToPlaylist": "Додај у плејлисту",
"shuffleAll": "Измешај све", "addToQueue": "Пусти касније",
"download": "Преузми", "download": "Преузми",
"info": "Прикажи инфо",
"playNext": "Пусти наредно", "playNext": "Пусти наредно",
"info": "Прикажи инфо" "playNow": "Пусти одмах",
"shuffleAll": "Измешај све"
} }
}, },
"album": { "album": {
@ -43,39 +50,46 @@
"fields": { "fields": {
"albumArtist": "Уметник албума", "albumArtist": "Уметник албума",
"artist": "Уметник", "artist": "Уметник",
"duration": "Трајање", "catalogNum": "Каталошки број",
"songCount": "Песме",
"playCount": "Пуштано",
"size": "Величина",
"name": "Назив",
"genre": "Жанр",
"compilation": "Компилација",
"year": "Година",
"originalDate": "Оригинално",
"releaseDate": "Објављено",
"releases": "Издање|||| Издања",
"released": "Објављено",
"updatedAt": "Ажурирано",
"comment": "Коментар", "comment": "Коментар",
"compilation": "Компилација",
"createdAt": "Датум додавања",
"date": "Датум снимања",
"duration": "Трајање",
"genre": "Жанр",
"grouping": "Груписање",
"media": "Медијум",
"mood": "Расположење",
"name": "Назив",
"originalDate": "Оригинално",
"playCount": "Пуштано",
"rating": "Рејтинг", "rating": "Рејтинг",
"createdAt": "Датум додавања" "recordLabel": "Издавачка кућа",
"releaseDate": "Објављено",
"releaseType": "Тип",
"released": "Објављено",
"releases": "Издање|||| Издања",
"size": "Величина",
"songCount": "Песме",
"updatedAt": "Ажурирано",
"year": "Година"
}, },
"actions": { "actions": {
"addToPlaylist": "Додај у плејлисту",
"addToQueue": "Пусти касније",
"download": "Преузми",
"info": "Прикажи инфо",
"playAll": "Пусти", "playAll": "Пусти",
"playNext": "Пусти наредно", "playNext": "Пусти наредно",
"addToQueue": "Пусти касније",
"share": "Дели", "share": "Дели",
"shuffle": "Измешај", "shuffle": "Измешај"
"addToPlaylist": "Додај у плејлисту",
"download": "Преузми",
"info": "Прикажи инфо"
}, },
"lists": { "lists": {
"all": "Све", "all": "Све",
"mostPlayed": "Најчешће пуштано",
"random": "Насумично", "random": "Насумично",
"recentlyAdded": "Додато недавно", "recentlyAdded": "Додато недавно",
"recentlyPlayed": "Пуштано недавно", "recentlyPlayed": "Пуштано недавно",
"mostPlayed": "Најчешће пуштано",
"starred": "Омиљено", "starred": "Омиљено",
"topRated": "Најбоље рангирано" "topRated": "Најбоље рангирано"
} }
@ -83,86 +97,102 @@
"artist": { "artist": {
"name": "Уметник |||| Уметници", "name": "Уметник |||| Уметници",
"fields": { "fields": {
"name": "Име",
"albumCount": "Број албума", "albumCount": "Број албума",
"songCount": "Број песама", "genre": "Жанр",
"size": "Величина", "name": "Назив",
"playCount": "Пуштано", "playCount": "Пуштано",
"rating": "Рејтинг", "rating": "Рејтинг",
"genre": "Жанр" "role": "Улога",
"size": "Величина",
"songCount": "Број песама"
},
"roles": {
"albumartist": "Уметник албума |||| Уметници албума",
"arranger": "Аранжер |||| Аранжери",
"artist": "Уметник |||| Уметници",
"composer": "Композитор |||| Композитори",
"conductor": "Диригент |||| Диригенти",
"director": "Режисер |||| Режисери",
"djmixer": "Ди-џеј миксер |||| Ди-џеј миксер",
"engineer": "Инжењер |||| Инжењери",
"lyricist": "Текстописац |||| Текстописци",
"mixer": "Миксер |||| Миксери",
"performer": "Извођач |||| Извођачи",
"producer": "Продуцент |||| Продуценти",
"remixer": "Ремиксер |||| Ремиксери"
} }
}, },
"user": { "user": {
"name": "Корисник |||| Корисници", "name": "Корисник |||| Корисници",
"fields": { "fields": {
"userName": "Корисничко име",
"isAdmin": "Да ли је Админ",
"lastLoginAt": "Последња пријава",
"lastAccessAt": "Последњи приступ",
"updatedAt": "Ажурирано",
"name": "Име",
"password": "Лозинка",
"createdAt": "Креирана",
"changePassword": "Измени лозинку?", "changePassword": "Измени лозинку?",
"createdAt": "Креирана",
"currentPassword": "Текућа лозинка", "currentPassword": "Текућа лозинка",
"isAdmin": "Да ли је Админ",
"lastAccessAt": "Последњи приступ",
"lastLoginAt": "Последња пријава",
"name": "Назив",
"newPassword": "Нова лозинка", "newPassword": "Нова лозинка",
"token": "Жетон" "password": "Лозинка",
"token": "Жетон",
"updatedAt": "Ажурирано",
"userName": "Корисничко име"
}, },
"helperTexts": { "helperTexts": {
"name": "Измене вашег имена ће постати видљиве након следеће пријаве" "name": "Измене вашег имена ће постати видљиве након следеће пријаве"
}, },
"notifications": { "notifications": {
"created": "Корисник креиран", "created": "Корисник креиран",
"updated": "Корисник ажуриран", "deleted": "Корисник обрисан",
"deleted": "Корисник обрисан" "updated": "Корисник ажуриран"
}, },
"message": { "message": {
"listenBrainzToken": "Унесите свој ListenBrainz кориснички жетон.", "clickHereForToken": "Кликните овде да преузмете свој жетон",
"clickHereForToken": "Кликните овде да преузмете свој жетон" "listenBrainzToken": "Унесите свој ListenBrainz кориснички жетон."
} }
}, },
"player": { "player": {
"name": "Плејер |||| Плејери", "name": "Плејер |||| Плејери",
"fields": { "fields": {
"name": "Назив",
"transcodingId": "Транскодирање",
"maxBitRate": "Макс. битски проток",
"client": "Клијент", "client": "Клијент",
"userName": "Корисничко име", "lastSeen": "Последњи пут виђен",
"lastSeen": "последњи пут виђен", "maxBitRate": "Макс. битски проток",
"name": "Назив",
"reportRealPath": "Пријављуј реалну путању", "reportRealPath": "Пријављуј реалну путању",
"scrobbleEnabled": "Шаљи скроблове на спољне сервисе" "scrobbleEnabled": "Шаљи скроблове на спољне сервисе",
"transcodingId": "Транскодирање",
"userName": "Корисничко име"
} }
}, },
"transcoding": { "transcoding": {
"name": "Транскодирање |||| Транскодирања", "name": "Транскодирање |||| Транскодирања",
"fields": { "fields": {
"name": "Назив", "command": "Команда",
"targetFormat": "Циљни формат",
"defaultBitRate": "Подразумевани битски проток", "defaultBitRate": "Подразумевани битски проток",
"command": "Команда" "name": "Назив",
"targetFormat": "Циљни формат"
} }
}, },
"playlist": { "playlist": {
"name": "Плејлиста |||| Плејлисте", "name": "Плејлиста |||| Плејлисте",
"fields": { "fields": {
"name": "Назив",
"duration": "Трајање",
"ownerName": "Власник",
"public": "Јавна",
"updatedAt": "Ажурирана",
"createdAt": "Креирана",
"songCount": "Песме",
"comment": "Коментар", "comment": "Коментар",
"createdAt": "Креирана",
"duration": "Трајање",
"name": "Назив",
"ownerName": "Власник",
"path": "Увоз из",
"public": "Јавна",
"songCount": "Песме",
"sync": "Ауто-увоз", "sync": "Ауто-увоз",
"path": "Увоз из" "updatedAt": "Ажурирано"
}, },
"actions": { "actions": {
"selectPlaylist": "Изабери плејлисту",
"addNewPlaylist": "Креирај „%{name}”", "addNewPlaylist": "Креирај „%{name}”",
"export": "Извоз", "export": "Извези",
"makePrivate": "Учини приватном",
"makePublic": "Учини јавном", "makePublic": "Учини јавном",
"makePrivate": "Учини приватном" "selectPlaylist": "Изабери плејлисту"
}, },
"message": { "message": {
"duplicate_song": "Додај дуплиране песме", "duplicate_song": "Додај дуплиране песме",
@ -172,11 +202,11 @@
"radio": { "radio": {
"name": "Радио |||| Радији", "name": "Радио |||| Радији",
"fields": { "fields": {
"createdAt": "Креирана",
"homePageUrl": "URL почетне странице",
"name": "Назив", "name": "Назив",
"streamUrl": "URL тока", "streamUrl": "URL тока",
"homePageUrl": "URL почетне странице", "updatedAt": "Ажурирано"
"updatedAt": "Ажурирано",
"createdAt": "Креирано"
}, },
"actions": { "actions": {
"playNow": "Пусти одмах" "playNow": "Пусти одмах"
@ -185,101 +215,115 @@
"share": { "share": {
"name": "Дељење |||| Дељења", "name": "Дељење |||| Дељења",
"fields": { "fields": {
"username": "Поделио", "contents": "Садржај",
"url": "URL", "createdAt": "Креирано",
"description": "Опис", "description": "Опис",
"downloadable": "Допушта се преузимање?", "downloadable": "Допушта се преузимање?",
"contents": "Садржај",
"expiresAt": "Истиче", "expiresAt": "Истиче",
"lastVisitedAt": "Последњи пут посећено",
"visitCount": "Број посета",
"format": "Формат", "format": "Формат",
"lastVisitedAt": "Последњи пут посећено",
"maxBitRate": "Макс. битски проток", "maxBitRate": "Макс. битски проток",
"updatedAt": "Ажурирано", "updatedAt": "Ажурирано",
"createdAt": "Креирано" "url": "URL",
"username": "Поделио",
"visitCount": "Број посета"
}, },
"notifications": { "notifications": {},
"actions": {}
},
"missing": {
"name": "Фајл који недостаје|||| Фајлови који недостају",
"empty": "Нема фајлова који недостају",
"fields": {
"path": "Путања",
"size": "Величина",
"updatedAt": "Нестао дана"
}, },
"actions": { "actions": {
"remove": "Уклони"
},
"notifications": {
"removed": "Фајл који недостаје, или више њих, је уклоњен"
} }
} }
}, },
"ra": { "ra": {
"auth": { "auth": {
"welcome1": "Хвала што сте инсталирали Navidrome!",
"welcome2": "За почетак, креирајте админ корисника",
"confirmPassword": "Потврдите лозинку",
"buttonCreateAdmin": "Креирај админа",
"auth_check_error": "Ако желите да наставите, молимо вас да се пријавите", "auth_check_error": "Ако желите да наставите, молимо вас да се пријавите",
"user_menu": "Профил", "buttonCreateAdmin": "Креирај админа",
"username": "Корисничко име", "confirmPassword": "Потврдите лозинку",
"insightsCollectionNote": "Navidrome прикупља анонимне податке о коришћењу\nшто олакшава унапређење пројекта. Кликните [овде] да\nсазнате више и да одустанете од прикупљања ако желите",
"logout": "Одјави се",
"password": "Лозинка", "password": "Лозинка",
"sign_in": "Пријави се", "sign_in": "Пријави се",
"sign_in_error": "Потврда идентитета није успела, покушајте поново", "sign_in_error": "Потврда идентитета није успела, покушајте поново",
"logout": "Одјави се" "user_menu": "Профил",
"username": "Корисничко име",
"welcome1": "Хвала што сте инсталирали Navidrome!",
"welcome2": "За почетак, креирајте админ корисника"
}, },
"validation": { "validation": {
"invalidChars": "Молимо вас да користите само слова и цифре",
"passwordDoesNotMatch": "Лозинка се не подудара",
"required": "Неопходно",
"minLength": "Мора да буде барем %{min} карактера",
"maxLength": "Мора да буде %{max} карактера или мање",
"minValue": "Мора да буде барем %{min}",
"maxValue": "Мора да буде %{max} или мање",
"number": "Мора да буде број",
"email": "Мора да буде исправна и-мејл адреса", "email": "Мора да буде исправна и-мејл адреса",
"invalidChars": "Молимо вас да користите само слова и цифре",
"maxLength": "Мора да буде %{max} карактера или мање",
"maxValue": "Мора да буде %{max} или мање",
"minLength": "Мора да буде барем %{min} карактера",
"minValue": "Мора да буде барем %{min}",
"number": "Мора да буде број",
"oneOf": "Мора да буде једно од: %{options}", "oneOf": "Мора да буде једно од: %{options}",
"passwordDoesNotMatch": "Лозинка се не подудара",
"regex": "Мора да се подудара са одређеним форматом (регуларни израз): %{pattern}", "regex": "Мора да се подудара са одређеним форматом (регуларни израз): %{pattern}",
"required": "Неопходно",
"unique": "Мора да буде јединствено", "unique": "Мора да буде јединствено",
"url": "Мора да буде исправна URL адреса" "url": "Мора да буде исправна URL адреса"
}, },
"action": { "action": {
"add_filter": "Додај филтер",
"add": "Додај", "add": "Додај",
"add_filter": "Додај филтер",
"back": "Иди назад", "back": "Иди назад",
"bulk_actions": "изабрана је 1 ставка |||| изабрано је %{smart_count} ставки", "bulk_actions": "изабрана је 1 ставка |||| изабрано је %{smart_count} ставки",
"bulk_actions_mobile": "1 |||| %{smart_count}", "bulk_actions_mobile": "1 |||| %{smart_count}",
"cancel": "Откажи", "cancel": "Откажи",
"clear_input_value": "Обриши вредност", "clear_input_value": "Обриши вредност",
"clone": "Клонирај", "clone": "Клонирај",
"close": "Затвори",
"close_menu": "Затвори мени",
"confirm": "Потврди", "confirm": "Потврди",
"create": "Креирај", "create": "Креирај",
"delete": "Обриши", "delete": "Обриши",
"download": "Преузми",
"edit": "Уреди", "edit": "Уреди",
"expand": "Развиј",
"export": "Извези", "export": "Извези",
"list": "Листа", "list": "Листа",
"open_menu": "Отвори мени",
"refresh": "Освежи", "refresh": "Освежи",
"remove_filter": "Уклони овај филтер",
"remove": "Уклони", "remove": "Уклони",
"remove_filter": "Уклони овај филтер",
"save": "Сачувај", "save": "Сачувај",
"search": "Тражи", "search": "Тражи",
"share": "Дели",
"show": "Прикажи", "show": "Прикажи",
"skip": "Прескочи",
"sort": "Сортирај", "sort": "Сортирај",
"undo": "Поништи", "undo": "Поништи",
"expand": "Развиј", "unselect": "Уклони избор"
"close": "Затвори",
"open_menu": "Отвори мени",
"close_menu": "Затвори мени",
"unselect": "Уклони избор",
"skip": "Прескочи",
"share": "Подели",
"download": "Преузми"
}, },
"boolean": { "boolean": {
"true": "Да", "false": "Не",
"false": "Не" "true": "Да"
}, },
"page": { "page": {
"create": "Креирај %{name}", "create": "Креирај %{name}",
"dashboard": "Контролна табла", "dashboard": "Контролна табла",
"edit": "%{name} #%{id}", "edit": "%{name} #%{id}",
"empty": "Још увек нема %{name}.",
"error": "Нешто је пошло наопако", "error": "Нешто је пошло наопако",
"invite": "Желите ли да се дода?",
"list": "%{name}", "list": "%{name}",
"loading": "Учитава се", "loading": "Учитава се",
"not_found": "Није пронађено", "not_found": "Није пронађено",
"show": "%{name} #%{id}", "show": "%{name} #%{id}"
"empty": "Још увек нема %{name}.",
"invite": "Желите ли да се дода?"
}, },
"input": { "input": {
"file": { "file": {
@ -290,18 +334,18 @@
"upload_several": "Упустите слике да се отпреме, или кликните да их изаберете.", "upload_several": "Упустите слике да се отпреме, или кликните да их изаберете.",
"upload_single": "Упустите слику да се отпреми, или кликните да је изаберете." "upload_single": "Упустите слику да се отпреми, или кликните да је изаберете."
}, },
"password": {
"toggle_hidden": "Прикажи лозинку",
"toggle_visible": "Сакриј лозинку"
},
"references": { "references": {
"all_missing": "Не могу да се нађу подаци референци.", "all_missing": "Не могу да се нађу подаци референци.",
"many_missing": "Изгледа да барем једна од придружених референци више није доступна.", "many_missing": "Изгледа да барем једна од придружених референци више није доступна.",
"single_missing": "Изгледа да придружена референца више није доступна." "single_missing": "Изгледа да придружена референца више није доступна."
},
"password": {
"toggle_visible": "Сакриј лозинку",
"toggle_hidden": "Прикажи лозинку"
} }
}, },
"message": { "message": {
"about": "О програму", "about": "О",
"are_you_sure": "Да ли сте сигурни?", "are_you_sure": "Да ли сте сигурни?",
"bulk_delete_content": "Да ли заиста желите да обришете %{name}? |||| Да ли заиста желите да обришете %{smart_count} ставке?", "bulk_delete_content": "Да ли заиста желите да обришете %{name}? |||| Да ли заиста желите да обришете %{smart_count} ставке?",
"bulk_delete_title": "Брисање %{name} |||| Брисање %{smart_count} %{name}", "bulk_delete_title": "Брисање %{name} |||| Брисање %{smart_count} %{name}",
@ -313,153 +357,161 @@
"loading": "Страница се учитава, сачекајте мало", "loading": "Страница се учитава, сачекајте мало",
"no": "Не", "no": "Не",
"not_found": "Или сте откуцали погрешну URL адресу, или сте следили неисправан линк.", "not_found": "Или сте откуцали погрешну URL адресу, или сте следили неисправан линк.",
"yes": "Да", "unsaved_changes": "Неке од ваших измена нису сачуване. Да ли заиста желите да их одбаците?",
"unsaved_changes": "Неке од ваших измена нису сачуване. Да ли заиста желите да их одбаците?" "yes": "Да"
}, },
"navigation": { "navigation": {
"no_results": "Није пронађен ниједан резултат", "next": "Наредна",
"no_more_results": "Број странице %{page} је ван опсега. Покушајте претходну страницу.", "no_more_results": "Број странице %{page} је ван опсега. Покушајте претходну страницу.",
"page_out_of_boundaries": "Број странице %{page} је ван опсега", "no_results": "Није пронађен ниједан резултат",
"page_out_from_end": "Не може да се иде након последње странице",
"page_out_from_begin": "Не може да се иде испред странице 1", "page_out_from_begin": "Не може да се иде испред странице 1",
"page_out_from_end": "Не може да се иде након последње странице",
"page_out_of_boundaries": "Број странице %{page} је ван опсега",
"page_range_info": "%{offsetBegin}-%{offsetEnd} од %{total}", "page_range_info": "%{offsetBegin}-%{offsetEnd} од %{total}",
"page_rows_per_page": "Ставки по страници:", "page_rows_per_page": "Ставки по страници:",
"next": "Наредна",
"prev": "Претход", "prev": "Претход",
"skip_nav": "Прескочи на садржај" "skip_nav": "Прескочи на садржај"
}, },
"notification": { "notification": {
"updated": "Елемент је ажуриран |||| %{smart_count} елемената је ажурирано",
"created": "Елемент је креиран",
"deleted": "Елемент је обрисан |||| %{smart_count} елемената је обрисано",
"bad_item": "Неисправни елемент", "bad_item": "Неисправни елемент",
"item_doesnt_exist": "Елемент не постоји",
"http_error": "Грешка у комуникацији са сервером",
"data_provider_error": "dataProvider грешка. За више детаља погледајте конзолу.",
"i18n_error": "Не могу да се учитају преводи за наведени језик",
"canceled": "Акција је отказана", "canceled": "Акција је отказана",
"created": "Елемент је креиран",
"data_provider_error": "dataProvider грешка. За више детаља погледајте конзолу.",
"deleted": "Елемент је обрисан |||| %{smart_count} елемената је обрисано",
"http_error": "Грешка у комуникацији са сервером",
"i18n_error": "Не могу да се учитају преводи за наведени језик",
"item_doesnt_exist": "Елемент не постоји",
"logged_out": "Ваша сесија је завршена, молимо вас да се повежите поново.", "logged_out": "Ваша сесија је завршена, молимо вас да се повежите поново.",
"new_version": "Доступна је нова верзија! Молимо вас да освежите овај прозор." "new_version": "Доступна је нова верзија! Молимо вас да освежите овај прозор.",
"updated": "Елемент је ажуриран |||| %{smart_count} елемената је ажурирано"
}, },
"toggleFieldsMenu": { "toggleFieldsMenu": {
"columnsToDisplay": "Колоне за приказ", "columnsToDisplay": "Колоне за приказ",
"layout": "Распоред",
"grid": "Мрежа", "grid": "Мрежа",
"layout": "Распоред",
"table": "Табела" "table": "Табела"
} }
}, },
"message": { "message": {
"note": "НАПОМЕНА",
"transcodingDisabled": "Измена конфигурације транскодирања кроз веб интерфејс је искључена из разлога безбедности. Ако желите да измените (уредите или додате) опције транскодирања, поново покрените сервер са %{config} конфигурационом опцијом.",
"transcodingEnabled": "Navidrome се тренутно извршава са %{config}, чиме је омогућено извршавање системских команди из подешавања транскодирања коришћењем веб интерфејса. Из разлога безбедности, препоручујемо да то искључите, а да омогућите само када конфигуришете опције транскодирања.",
"songsAddedToPlaylist": "У плејлисту је додата 1 песма |||| У плејлисту је додато %{smart_count} песама",
"noPlaylistsAvailable": "Није доступна ниједна",
"delete_user_title": "Брисање корисника %{name}",
"delete_user_content": "Да ли заиста желите да обришете овог корисника, заједно са свим његовим подацима (плејлистама и подешавањима)?", "delete_user_content": "Да ли заиста желите да обришете овог корисника, заједно са свим његовим подацима (плејлистама и подешавањима)?",
"delete_user_title": "Брисање корисника %{name}",
"downloadDialogTitle": "Преузимање %{resource} %{name} (%{size})",
"downloadOriginalFormat": "Преузми у оригиналном формату",
"lastfmLink": "Прочитај још...",
"lastfmLinkFailure": "Last.fm није могао да се повеже",
"lastfmLinkSuccess": "Last.fm је успешно повезан и укључено је скробловање",
"lastfmUnlinkFailure": "Није могла да се уклони веза са Last.fm",
"lastfmUnlinkSuccess": "Last.fm више није повезан и скробловање је искључено",
"listenBrainzLinkFailure": "ListenBrainz није могао да се повеже: %{error}",
"listenBrainzLinkSuccess": "ListenBrainz је успешно повезан и скробловање је укључено као корисник: %{user}",
"listenBrainzUnlinkFailure": "Није могла да се уклони веза са ListenBrainz",
"listenBrainzUnlinkSuccess": "ListenBrainz више није повезан и скробловање је искључено",
"noPlaylistsAvailable": "Није доступна ниједна",
"note": "НАПОМЕНА",
"notifications_blocked": "У подешавањима интернет прегледача за овај сајт, блокирали сте обавештења", "notifications_blocked": "У подешавањима интернет прегледача за овај сајт, блокирали сте обавештења",
"notifications_not_available": "Овај интернет прегледач не подржава десктоп обавештења, или Navidrome серверу не приступате преко https протокола", "notifications_not_available": "Овај интернет прегледач не подржава десктоп обавештења, или Navidrome серверу не приступате преко https протокола",
"lastfmLinkSuccess": "Last.fm је успешно повезан и укључено је скробловање",
"lastfmLinkFailure": "Last.fm није могао да се повеже",
"lastfmUnlinkSuccess": "Last.fm више није повезан и скробловање је искључено",
"lastfmUnlinkFailure": "Није могла да се уклони веза са Last.fm",
"listenBrainzLinkSuccess": "ListenBrainz је успешно повезан и скробловање је укључено као корисник: %{user}",
"listenBrainzLinkFailure": "ListenBrainz није могао да се повеже: %{error}",
"listenBrainzUnlinkSuccess": "ListenBrainz више није повезан и скробловање је искључено",
"listenBrainzUnlinkFailure": "Није могла да се уклони веза са ListenBrainz",
"openIn": { "openIn": {
"lastfm": "Отвори у Last.fm", "lastfm": "Отвори у Last.fm",
"musicbrainz": "Отвори у MusicBrainz" "musicbrainz": "Отвори у MusicBrainz"
}, },
"lastfmLink": "Прочитај још...", "remove_missing_content": "Да ли сте сигурни да из базе података желите да уклоните фајлове који недостају? Ово ће трајно да уклони све референце на њих, укључујући број пуштања и рангирања.",
"shareOriginalFormat": "Подели у оригиналном формату", "remove_missing_title": "Уклони фајлове који недостају",
"shareDialogTitle": "Подели %{resource} %{name}",
"shareBatchDialogTitle": "Подели 1 %{resource} |||| Подели %{smart_count} %{resource}", "shareBatchDialogTitle": "Подели 1 %{resource} |||| Подели %{smart_count} %{resource}",
"shareCopyToClipboard": "Копирај у клипборд: Ctrl+C, Ентер", "shareCopyToClipboard": "Копирај у клипборд: Ctrl+C, Ентер",
"shareSuccess": "URL је копиран у клипборд: %{url}", "shareDialogTitle": "Подели %{resource} %{name}",
"shareFailure": "Грешка приликом копирања URL адресе %{url} у клипборд", "shareFailure": "Грешка приликом копирања URL адресе %{url} у клипборд",
"downloadDialogTitle": "Преузимање %{resource} %{name} (%{size})", "shareOriginalFormat": "Подели у оригиналном формату",
"downloadOriginalFormat": "Преузми у оригиналном формату" "shareSuccess": "URL је копиран у клипборд: %{url}",
"songsAddedToPlaylist": "У плејлисту је додата 1 песма |||| У плејлисту је додато %{smart_count} песама",
"transcodingDisabled": "Измена конфигурације транскодирања кроз веб интерфејс је искључена из разлога безбедности. Ако желите да измените (уредите или додате) опције транскодирања, поново покрените сервер са %{config} конфигурационом опцијом.",
"transcodingEnabled": "Navidrome се тренутно извршава са %{config}, чиме је омогућено извршавање системских команди из подешавања транскодирања коришћењем веб интерфејса. Из разлога безбедности, препоручујемо да то искључите, а да омогућите само када конфигуришете опције транскодирања."
}, },
"menu": { "menu": {
"about": "О",
"albumList": "Албуми",
"library": "Библиотека", "library": "Библиотека",
"settings": "Подешавања",
"version": "Верзија",
"theme": "Тема",
"personal": { "personal": {
"name": "Лична", "name": "Лична",
"options": { "options": {
"theme": "Тема",
"language": "Језик",
"defaultView": "Подразумевани поглед", "defaultView": "Подразумевани поглед",
"desktop_notifications": "Десктоп обавештења", "desktop_notifications": "Десктоп обавештења",
"gain": {
"album": "Користи Album појачање",
"none": "Искључено",
"track": "Користи Track појачање"
},
"language": "Језик",
"lastfmNotConfigured": "Није подешен Last.fm API-кључ",
"lastfmScrobbling": "Скроблуј на Last.fm", "lastfmScrobbling": "Скроблуј на Last.fm",
"listenBrainzScrobbling": "Скроблуј на ListenBrainz", "listenBrainzScrobbling": "Скроблуј на ListenBrainz",
"replaygain": "ReplayGain режим",
"preAmp": "ReplayGain претпојачање (dB)", "preAmp": "ReplayGain претпојачање (dB)",
"gain": { "replaygain": "ReplayGain режим",
"none": "Искључено", "theme": "Тема"
"album": "Користи Album појачање",
"track": "Користи Track појачање"
}
} }
}, },
"albumList": "Албуми",
"playlists": "Плејлисте", "playlists": "Плејлисте",
"settings": "Подешавања",
"sharedPlaylists": "Дељене плејлисте", "sharedPlaylists": "Дељене плејлисте",
"about": "О" "theme": "Тема",
"version": "Верзија"
}, },
"player": { "player": {
"playListsText": "Ред за пуштање", "clickToDeleteText": "Кликните да обришете %{name}",
"openText": "Отвори",
"closeText": "Затвори",
"notContentText": "Нема музике",
"clickToPlayText": "Кликни за пуштање",
"clickToPauseText": "Кликни за паузирање", "clickToPauseText": "Кликни за паузирање",
"nextTrackText": "Наредна нумера", "clickToPlayText": "Кликни за пуштање",
"previousTrackText": "Претходна нумера", "closeText": "Затвори",
"reloadText": "Поново учитај",
"volumeText": "Јачина",
"toggleLyricText": "Укљ./Искљ. стихове",
"toggleMiniModeText": "Умањи",
"destroyText": "Уништи", "destroyText": "Уништи",
"downloadText": "Преузми", "downloadText": "Преузми",
"removeAudioListsText": "Обриши аудио листе",
"clickToDeleteText": "Кликните да обришете %{name}",
"emptyLyricText": "Нема стихова", "emptyLyricText": "Нема стихова",
"nextTrackText": "Наредна нумера",
"notContentText": "Нема музике",
"openText": "Отвори",
"playListsText": "Ред за пуштање",
"playModeText": { "playModeText": {
"order": "По редоследу", "order": "По редоследу",
"orderLoop": "Понови", "orderLoop": "Понови",
"singleLoop": "Понови једну", "shufflePlay": "Измешај",
"shufflePlay": "Промешано" "singleLoop": "Понови једну"
} },
"previousTrackText": "Претходна нумера",
"reloadText": "Поново учитај",
"removeAudioListsText": "Обриши аудио листе",
"toggleLyricText": "Укљ./Искљ. стихове",
"toggleMiniModeText": "Умањи",
"volumeText": "Јачина"
}, },
"about": { "about": {
"links": { "links": {
"featureRequests": "Захтеви за функцијама",
"homepage": "Почетна страница", "homepage": "Почетна страница",
"source": "Изворни кôд", "insights": {
"featureRequests": "Захтеви за функцијама" "disabled": "Искључено",
"waiting": "Чека се"
},
"lastInsightsCollection": "Последња колекција увида",
"source": "Изворни кôд"
} }
}, },
"activity": { "activity": {
"title": "Активност",
"totalScanned": "Укупан број скенираних фолдера",
"quickScan": "Брзо скенирање",
"fullScan": "Комплетно скенирање", "fullScan": "Комплетно скенирање",
"quickScan": "Брзо скенирање",
"serverDown": "ВАН МРЕЖЕ",
"serverUptime": "Сервер се извршава", "serverUptime": "Сервер се извршава",
"serverDown": "ВАН МРЕЖЕ" "title": "Активност",
"totalScanned": "Укупан број скенираних фолдера"
}, },
"help": { "help": {
"title": "Navidrome пречице", "title": "Navidrome пречице",
"hotkeys": { "hotkeys": {
"current_song": "Иди на текућу песму",
"next_song": "Наредна песма",
"prev_song": "Претходна песма",
"show_help": "Прикажи ову помоћ", "show_help": "Прикажи ову помоћ",
"toggle_love": "Додај ову нумеру у омиљене",
"toggle_menu": "Укљ./Искљ. бочну траку менија", "toggle_menu": "Укљ./Искљ. бочну траку менија",
"toggle_play": "Пусти / Паузирај", "toggle_play": "Пусти / Паузирај",
"prev_song": "Претходна песма",
"next_song": "Наредна песма",
"current_song": "Иди на текућу песму",
"vol_up": "Појачај",
"vol_down": "Утишај", "vol_down": "Утишај",
"toggle_love": "Додај ову нумеру у омиљене" "vol_up": "Појачај"
} }
} }
} }

View File

@ -33,7 +33,8 @@
"tags": "Ek Etiketler", "tags": "Ek Etiketler",
"mappedTags": "Eşlenen etiketler", "mappedTags": "Eşlenen etiketler",
"rawTags": "Ham etiketler", "rawTags": "Ham etiketler",
"bitDepth": "Bit derinliği" "bitDepth": "Bit derinliği",
"sampleRate": "Örnekleme Oranı"
}, },
"actions": { "actions": {
"addToQueue": "Oynatma Sırasına Ekle", "addToQueue": "Oynatma Sırasına Ekle",

View File

@ -12,12 +12,14 @@
"artist": "歌手", "artist": "歌手",
"album": "专辑", "album": "专辑",
"path": "文件路径", "path": "文件路径",
"genre": "类型", "genre": "流派",
"compilation": "合辑", "compilation": "合辑",
"year": "发行年份", "year": "发行年份",
"size": "文件大小", "size": "文件大小",
"updatedAt": "更新于", "updatedAt": "更新于",
"bitRate": "比特率", "bitRate": "比特率",
"bitDepth": "比特深度",
"channels": "声道",
"discSubtitle": "字幕", "discSubtitle": "字幕",
"starred": "收藏", "starred": "收藏",
"comment": "注释", "comment": "注释",
@ -25,8 +27,13 @@
"quality": "品质", "quality": "品质",
"bpm": "BPM", "bpm": "BPM",
"playDate": "最后一次播放", "playDate": "最后一次播放",
"channels": "声道", "createdAt": "创建于",
"createdAt": "创建于" "grouping": "分组",
"mood": "情绪",
"participants": "其他参与人员",
"tags": "附加标签",
"mappedTags": "映射标签",
"rawTags": "原始标签"
}, },
"actions": { "actions": {
"addToQueue": "加入播放列表", "addToQueue": "加入播放列表",
@ -46,29 +53,36 @@
"duration": "时长", "duration": "时长",
"songCount": "歌曲数量", "songCount": "歌曲数量",
"playCount": "播放次数", "playCount": "播放次数",
"size": "文件大小",
"name": "名称", "name": "名称",
"genre": "类型", "genre": "流派",
"compilation": "合辑", "compilation": "合辑",
"year": "发行年份", "year": "发行年份",
"date": "录制日期",
"originalDate": "原始日期",
"releaseDate": "发⾏日期",
"releases": "发⾏",
"released": "已发⾏",
"updatedAt": "更新于", "updatedAt": "更新于",
"comment": "注释", "comment": "注释",
"rating": "评分", "rating": "评分",
"createdAt": "创建于", "createdAt": "创建于",
"size": "文件大小", "recordLabel": "厂牌",
"originalDate": "原始日期", "catalogNum": "目录编号",
"releaseDate": "发⾏日期", "releaseType": "发行类型",
"releases": "发⾏", "grouping": "分组",
"released": "已发⾏" "media": "媒体类型",
"mood": "情绪"
}, },
"actions": { "actions": {
"playAll": "立即播放", "playAll": "立即播放",
"playNext": "下首播放", "playNext": "下首播放",
"addToQueue": "加入播放列表", "addToQueue": "加入播放列表",
"share": "分享",
"shuffle": "随机播放", "shuffle": "随机播放",
"addToPlaylist": "加入歌单", "addToPlaylist": "加入歌单",
"download": "下载", "download": "下载",
"info": "查看信息", "info": "查看信息"
"share": "分享"
}, },
"lists": { "lists": {
"all": "所有", "all": "所有",
@ -86,10 +100,26 @@
"name": "名称", "name": "名称",
"albumCount": "专辑数", "albumCount": "专辑数",
"songCount": "歌曲数", "songCount": "歌曲数",
"size": "文件大小",
"playCount": "播放次数", "playCount": "播放次数",
"rating": "评分", "rating": "评分",
"genre": "类型", "genre": "流派",
"size": "文件大小" "role": "参与角色"
},
"roles": {
"albumartist": "专辑歌手",
"artist": "歌手",
"composer": "作曲",
"conductor": "指挥",
"lyricist": "作词",
"arranger": "编曲",
"producer": "制作人",
"director": "总监",
"engineer": "工程师",
"mixer": "混音师",
"remixer": "重混师",
"djmixer": "DJ混音师",
"performer": "演奏家"
} }
}, },
"user": { "user": {
@ -98,6 +128,7 @@
"userName": "用户名", "userName": "用户名",
"isAdmin": "是否管理员", "isAdmin": "是否管理员",
"lastLoginAt": "上次登录", "lastLoginAt": "上次登录",
"lastAccessAt": "上次访问",
"updatedAt": "更新于", "updatedAt": "更新于",
"name": "名称", "name": "名称",
"password": "密码", "password": "密码",
@ -108,7 +139,7 @@
"token": "令牌" "token": "令牌"
}, },
"helperTexts": { "helperTexts": {
"name": "你名字的更改将在下次登录生效" "name": "名称的更改将在下次登录时生效"
}, },
"notifications": { "notifications": {
"created": "用户已创建", "created": "用户已创建",
@ -187,6 +218,7 @@
"username": "分享者", "username": "分享者",
"url": "链接", "url": "链接",
"description": "描述", "description": "描述",
"downloadable": "是否允许下载?",
"contents": "目录", "contents": "目录",
"expiresAt": "过期于", "expiresAt": "过期于",
"lastVisitedAt": "上次访问于", "lastVisitedAt": "上次访问于",
@ -194,8 +226,24 @@
"format": "格式", "format": "格式",
"maxBitRate": "最大比特率", "maxBitRate": "最大比特率",
"updatedAt": "更新于", "updatedAt": "更新于",
"createdAt": "创建于", "createdAt": "创建于"
"downloadable": "是否允许下载" },
"notifications": {},
"actions": {}
},
"missing": {
"name": "丢失文件",
"empty": "无丢失文件",
"fields": {
"path": "路径",
"size": "文件大小",
"updatedAt": "丢失于"
},
"actions": {
"remove": "移除"
},
"notifications": {
"removed": "丢失文件已移除"
} }
} }
}, },
@ -211,7 +259,8 @@
"password": "密码", "password": "密码",
"sign_in": "登录", "sign_in": "登录",
"sign_in_error": "验证失败,请重试", "sign_in_error": "验证失败,请重试",
"logout": "注销" "logout": "注销",
"insightsCollectionNote": "Navidrome 会收集匿名使用数据以协助改进项目。\n点击[此处]了解详情或选择退出。"
}, },
"validation": { "validation": {
"invalidChars": "请使用字母和数字", "invalidChars": "请使用字母和数字",
@ -233,6 +282,7 @@
"add": "添加", "add": "添加",
"back": "返回", "back": "返回",
"bulk_actions": "选中 %{smart_count} 项", "bulk_actions": "选中 %{smart_count} 项",
"bulk_actions_mobile": "%{smart_count}",
"cancel": "取消", "cancel": "取消",
"clear_input_value": "清除", "clear_input_value": "清除",
"clone": "复制", "clone": "复制",
@ -256,7 +306,6 @@
"close_menu": "关闭菜单", "close_menu": "关闭菜单",
"unselect": "未选择", "unselect": "未选择",
"skip": "跳过", "skip": "跳过",
"bulk_actions_mobile": "%{smart_count}",
"share": "分享", "share": "分享",
"download": "下载" "download": "下载"
}, },
@ -351,29 +400,31 @@
"noPlaylistsAvailable": "没有有效的歌单", "noPlaylistsAvailable": "没有有效的歌单",
"delete_user_title": "删除用户 %{name}", "delete_user_title": "删除用户 %{name}",
"delete_user_content": "您确定要删除该用户及其相关数据(包括歌单和用户配置)吗?", "delete_user_content": "您确定要删除该用户及其相关数据(包括歌单和用户配置)吗?",
"remove_missing_title": "移除丢失文件",
"remove_missing_content": "您确定要将选中的丢失文件从数据库中永久移除吗?此操作将删除所有相关信息,包括播放次数和评分。",
"notifications_blocked": "您已在浏览器的设置中屏蔽了此网站的通知", "notifications_blocked": "您已在浏览器的设置中屏蔽了此网站的通知",
"notifications_not_available": "此浏览器不支持桌面通知", "notifications_not_available": "此浏览器不支持桌面通知",
"lastfmLinkSuccess": "Last.fm 已关联并启用喜好记录", "lastfmLinkSuccess": "Last.fm 已关联并启用喜好记录",
"lastfmLinkFailure": "Last.fm 无法关联", "lastfmLinkFailure": "Last.fm 无法关联",
"lastfmUnlinkSuccess": "已成功解除与 Last.fm 的链接,且喜好记录已禁用", "lastfmUnlinkSuccess": "已成功解除与 Last.fm 的链接,且喜好记录已禁用",
"lastfmUnlinkFailure": "Last.fm 无法取消关联", "lastfmUnlinkFailure": "Last.fm 无法取消关联",
"listenBrainzLinkSuccess": "ListenBrainz 已关联并启用喜好记录",
"listenBrainzLinkFailure": "ListenBrainz 无法关联:%{error}",
"listenBrainzUnlinkSuccess": "已成功解除与 ListenBrainz 的链接,且喜好记录已禁用",
"listenBrainzUnlinkFailure": "ListenBrainz 无法取消关联",
"openIn": { "openIn": {
"lastfm": "在 Last.fm 中打开", "lastfm": "在 Last.fm 中打开",
"musicbrainz": "在 MusicBrainz 中打开" "musicbrainz": "在 MusicBrainz 中打开"
}, },
"lastfmLink": "查看更多…", "lastfmLink": "查看更多…",
"listenBrainzLinkSuccess": "ListenBrainz 已关联并启用喜好记录",
"listenBrainzLinkFailure": "ListenBrainz 无法关联:%{error}",
"listenBrainzUnlinkSuccess": "已成功解除与 ListenBrainz 的链接,且喜好记录已禁用",
"listenBrainzUnlinkFailure": "ListenBrainz 无法取消关联",
"downloadOriginalFormat": "下载原始格式",
"shareOriginalFormat": "分享原始格式", "shareOriginalFormat": "分享原始格式",
"shareDialogTitle": "分享 %{resource} '%{name}'", "shareDialogTitle": "分享 %{resource} '%{name}'",
"shareBatchDialogTitle": "分享 %{smart_count} 个 %{resource}", "shareBatchDialogTitle": "分享 %{smart_count} 个 %{resource}",
"shareCopyToClipboard": "复制到剪切板: Ctrl+C, Enter",
"shareSuccess": "分享链接已复制: %{url}", "shareSuccess": "分享链接已复制: %{url}",
"shareFailure": "分享链接复制失败: %{url}", "shareFailure": "分享链接复制失败: %{url}",
"downloadDialogTitle": "下载 %{resource} '%{name}' (%{size})", "downloadDialogTitle": "下载 %{resource} '%{name}' (%{size})",
"shareCopyToClipboard": "复制到剪切板: Ctrl+C, Enter" "downloadOriginalFormat": "下载原始格式"
}, },
"menu": { "menu": {
"library": "曲库", "library": "曲库",
@ -387,6 +438,7 @@
"language": "语言", "language": "语言",
"defaultView": "默认界面", "defaultView": "默认界面",
"desktop_notifications": "桌面通知", "desktop_notifications": "桌面通知",
"lastfmNotConfigured": "没有配置 Last.fm 的 API-Key",
"lastfmScrobbling": "启用 Last.fm 的喜好记录", "lastfmScrobbling": "启用 Last.fm 的喜好记录",
"listenBrainzScrobbling": "启用 ListenBrainz 的喜好记录", "listenBrainzScrobbling": "启用 ListenBrainz 的喜好记录",
"replaygain": "回放增益", "replaygain": "回放增益",
@ -399,9 +451,9 @@
} }
}, },
"albumList": "专辑", "albumList": "专辑",
"about": "关于",
"playlists": "歌单", "playlists": "歌单",
"sharedPlaylists": "共享的歌单" "sharedPlaylists": "共享的歌单",
"about": "关于"
}, },
"player": { "player": {
"playListsText": "播放列表", "playListsText": "播放列表",
@ -432,7 +484,12 @@
"links": { "links": {
"homepage": "主页", "homepage": "主页",
"source": "源代码", "source": "源代码",
"featureRequests": "功能需求" "featureRequests": "功能需求",
"lastInsightsCollection": " 最近的分析收集",
"insights": {
"disabled": "禁用",
"waiting": "等待"
}
} }
}, },
"activity": { "activity": {
@ -451,10 +508,10 @@
"toggle_play": "播放/暂停", "toggle_play": "播放/暂停",
"prev_song": "上一首歌", "prev_song": "上一首歌",
"next_song": "下一首歌", "next_song": "下一首歌",
"current_song": "转到当前播放",
"vol_up": "增大音量", "vol_up": "增大音量",
"vol_down": "减小音量", "vol_down": "减小音量",
"toggle_love": "添加/移除星标", "toggle_love": "添加/移除星标"
"current_song": "转到当前播放"
} }
} }
} }

View File

@ -185,7 +185,6 @@ const AlbumSongs = (props) => {
{...props} {...props}
hasBulkActions={true} hasBulkActions={true}
showDiscSubtitles={true} showDiscSubtitles={true}
showReleaseDivider={true}
contextAlwaysVisible={!isDesktop} contextAlwaysVisible={!isDesktop}
classes={{ row: classes.row }} classes={{ row: classes.row }}
> >

View File

@ -231,7 +231,6 @@ export const AlbumContextMenu = (props) =>
sort: { field: 'album', order: 'ASC' }, sort: { field: 'album', order: 'ASC' },
filter: { filter: {
album_id: props.record.id, album_id: props.record.id,
release_date: props.releaseDate,
disc_number: props.discNumber, disc_number: props.discNumber,
missing: false, missing: false,
}, },

View File

@ -24,7 +24,6 @@ export const PlayButton = ({ record, size, className }) => {
sort: { field: 'album', order: 'ASC' }, sort: { field: 'album', order: 'ASC' },
filter: { filter: {
album_id: record.id, album_id: record.id,
release_date: record.releaseDate,
disc_number: record.discNumber, disc_number: record.discNumber,
}, },
}) })

View File

@ -59,59 +59,12 @@ const useStyles = makeStyles({
}, },
}) })
const ReleaseRow = forwardRef(
({ record, onClick, colSpan, contextAlwaysVisible }, ref) => {
const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))
const classes = useStyles({ isDesktop })
const translate = useTranslate()
const handlePlaySubset = (releaseDate) => () => {
onClick(releaseDate)
}
let releaseTitle = []
if (record.releaseDate) {
releaseTitle.push(translate('resources.album.fields.released'))
releaseTitle.push(formatFullDate(record.releaseDate))
if (record.catalogNum && isDesktop) {
releaseTitle.push('· Cat #')
releaseTitle.push(record.catalogNum)
}
}
return (
<TableRow
hover
ref={ref}
onClick={handlePlaySubset(record.releaseDate)}
className={classes.row}
>
<TableCell colSpan={colSpan}>
<Typography variant="h6" className={classes.subtitle}>
{releaseTitle.join(' ')}
</Typography>
</TableCell>
<TableCell>
<AlbumContextMenu
record={{ id: record.albumId }}
releaseDate={record.releaseDate}
showLove={false}
className={classes.contextMenu}
visible={contextAlwaysVisible}
/>
</TableCell>
</TableRow>
)
},
)
ReleaseRow.displayName = 'ReleaseRow'
const DiscSubtitleRow = forwardRef( const DiscSubtitleRow = forwardRef(
({ record, onClick, colSpan, contextAlwaysVisible }, ref) => { ({ record, onClick, colSpan, contextAlwaysVisible }, ref) => {
const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md')) const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))
const classes = useStyles({ isDesktop }) const classes = useStyles({ isDesktop })
const handlePlaySubset = (releaseDate, discNumber) => () => { const handlePlaySubset = (discNumber) => () => {
onClick(releaseDate, discNumber) onClick(discNumber)
} }
let subtitle = [] let subtitle = []
@ -126,7 +79,7 @@ const DiscSubtitleRow = forwardRef(
<TableRow <TableRow
hover hover
ref={ref} ref={ref}
onClick={handlePlaySubset(record.releaseDate, record.discNumber)} onClick={handlePlaySubset(record.discNumber)}
className={classes.row} className={classes.row}
> >
<TableCell colSpan={colSpan}> <TableCell colSpan={colSpan}>
@ -139,7 +92,6 @@ const DiscSubtitleRow = forwardRef(
<AlbumContextMenu <AlbumContextMenu
record={{ id: record.albumId }} record={{ id: record.albumId }}
discNumber={record.discNumber} discNumber={record.discNumber}
releaseDate={record.releaseDate}
showLove={false} showLove={false}
className={classes.contextMenu} className={classes.contextMenu}
hideShare={true} hideShare={true}
@ -158,7 +110,6 @@ export const SongDatagridRow = ({
record, record,
children, children,
firstTracksOfDiscs, firstTracksOfDiscs,
firstTracksOfReleases,
contextAlwaysVisible, contextAlwaysVisible,
onClickSubset, onClickSubset,
className, className,
@ -176,7 +127,6 @@ export const SongDatagridRow = ({
discs: [ discs: [
{ {
albumId: record?.albumId, albumId: record?.albumId,
releaseDate: record?.releaseDate,
discNumber: record?.discNumber, discNumber: record?.discNumber,
}, },
], ],
@ -209,15 +159,6 @@ export const SongDatagridRow = ({
const childCount = fields.length const childCount = fields.length
return ( return (
<> <>
{firstTracksOfReleases.has(record.id) && (
<ReleaseRow
ref={dragDiscRef}
record={record}
onClick={onClickSubset}
contextAlwaysVisible={contextAlwaysVisible}
colSpan={childCount + (rest.expand ? 1 : 0)}
/>
)}
{firstTracksOfDiscs.has(record.id) && ( {firstTracksOfDiscs.has(record.id) && (
<DiscSubtitleRow <DiscSubtitleRow
ref={dragDiscRef} ref={dragDiscRef}
@ -244,7 +185,6 @@ SongDatagridRow.propTypes = {
record: PropTypes.object, record: PropTypes.object,
children: PropTypes.node, children: PropTypes.node,
firstTracksOfDiscs: PropTypes.instanceOf(Set), firstTracksOfDiscs: PropTypes.instanceOf(Set),
firstTracksOfReleases: PropTypes.instanceOf(Set),
contextAlwaysVisible: PropTypes.bool, contextAlwaysVisible: PropTypes.bool,
onClickSubset: PropTypes.func, onClickSubset: PropTypes.func,
} }
@ -256,23 +196,16 @@ SongDatagridRow.defaultProps = {
const SongDatagridBody = ({ const SongDatagridBody = ({
contextAlwaysVisible, contextAlwaysVisible,
showDiscSubtitles, showDiscSubtitles,
showReleaseDivider,
...rest ...rest
}) => { }) => {
const dispatch = useDispatch() const dispatch = useDispatch()
const { ids, data } = rest const { ids, data } = rest
const playSubset = useCallback( const playSubset = useCallback(
(releaseDate, discNumber) => { (discNumber) => {
let idsToPlay = [] let idsToPlay = []
if (discNumber !== undefined) { if (discNumber !== undefined) {
idsToPlay = ids.filter( idsToPlay = ids.filter((id) => data[id].discNumber === discNumber)
(id) =>
data[id].releaseDate === releaseDate &&
data[id].discNumber === discNumber,
)
} else {
idsToPlay = ids.filter((id) => data[id].releaseDate === releaseDate)
} }
dispatch( dispatch(
playTracks( playTracks(
@ -297,8 +230,7 @@ const SongDatagridBody = ({
foundSubtitle = foundSubtitle || data[id].discSubtitle foundSubtitle = foundSubtitle || data[id].discSubtitle
if ( if (
acc.length === 0 || acc.length === 0 ||
(last && data[id].discNumber !== data[last].discNumber) || (last && data[id].discNumber !== data[last].discNumber)
(last && data[id].releaseDate !== data[last].releaseDate)
) { ) {
acc.push(id) acc.push(id)
} }
@ -311,37 +243,12 @@ const SongDatagridBody = ({
return set return set
}, [ids, data, showDiscSubtitles]) }, [ids, data, showDiscSubtitles])
const firstTracksOfReleases = useMemo(() => {
if (!ids) {
return new Set()
}
const set = new Set(
ids
.filter((i) => data[i])
.reduce((acc, id) => {
const last = acc && acc[acc.length - 1]
if (
acc.length === 0 ||
(last && data[id].releaseDate !== data[last].releaseDate)
) {
acc.push(id)
}
return acc
}, []),
)
if (!showReleaseDivider || set.size < 2) {
set.clear()
}
return set
}, [ids, data, showReleaseDivider])
return ( return (
<PureDatagridBody <PureDatagridBody
{...rest} {...rest}
row={ row={
<SongDatagridRow <SongDatagridRow
firstTracksOfDiscs={firstTracksOfDiscs} firstTracksOfDiscs={firstTracksOfDiscs}
firstTracksOfReleases={firstTracksOfReleases}
contextAlwaysVisible={contextAlwaysVisible} contextAlwaysVisible={contextAlwaysVisible}
onClickSubset={playSubset} onClickSubset={playSubset}
/> />
@ -353,7 +260,6 @@ const SongDatagridBody = ({
export const SongDatagrid = ({ export const SongDatagrid = ({
contextAlwaysVisible, contextAlwaysVisible,
showDiscSubtitles, showDiscSubtitles,
showReleaseDivider,
...rest ...rest
}) => { }) => {
const classes = useStyles() const classes = useStyles()
@ -366,7 +272,6 @@ export const SongDatagrid = ({
<SongDatagridBody <SongDatagridBody
contextAlwaysVisible={contextAlwaysVisible} contextAlwaysVisible={contextAlwaysVisible}
showDiscSubtitles={showDiscSubtitles} showDiscSubtitles={showDiscSubtitles}
showReleaseDivider={showReleaseDivider}
/> />
} }
/> />
@ -376,6 +281,5 @@ export const SongDatagrid = ({
SongDatagrid.propTypes = { SongDatagrid.propTypes = {
contextAlwaysVisible: PropTypes.bool, contextAlwaysVisible: PropTypes.bool,
showDiscSubtitles: PropTypes.bool, showDiscSubtitles: PropTypes.bool,
showReleaseDivider: PropTypes.bool,
classes: PropTypes.object, classes: PropTypes.object,
} }