diff --git a/core/common_test.go b/core/common_test.go new file mode 100644 index 000000000..c8dde12d9 --- /dev/null +++ b/core/common_test.go @@ -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)) + }) + }) +}) diff --git a/persistence/mediafile_repository.go b/persistence/mediafile_repository.go index ebf07ce17..a86c8f668 100644 --- a/persistence/mediafile_repository.go +++ b/persistence/mediafile_repository.go @@ -77,7 +77,7 @@ func NewMediaFileRepository(ctx context.Context, db dbx.Builder) model.MediaFile "title": "order_title", "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": "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", "created_at": "media_file.created_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) // 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) { subQ := r.newSelect().Columns("pid"). Where(And{ diff --git a/resources/i18n/ca.json b/resources/i18n/ca.json index 4049695f5..e3e7b544e 100644 --- a/resources/i18n/ca.json +++ b/resources/i18n/ca.json @@ -18,6 +18,9 @@ "size": "Mida del fitxer", "updatedAt": "Actualitzat", "bitRate": "Taxa de bits", + "bitDepth": "Bits", + "sampleRate": "Freqüencia de mostreig", + "channels": "Canals", "discSubtitle": "Subtítol del disc", "starred": "Preferit", "comment": "Comentari", @@ -25,8 +28,13 @@ "quality": "Qualitat", "bpm": "tempo", "playDate": "Darrer resproduït", - "channels": "Canals", - "createdAt": "" + "createdAt": "Creat el", + "grouping": "Agrupació", + "mood": "Sentiment", + "participants": "Participants", + "tags": "Etiquetes", + "mappedTags": "Etiquetes assignades", + "rawTags": "Etiquetes sense processar" }, "actions": { "addToQueue": "Reprodueix després", @@ -46,6 +54,7 @@ "duration": "Durada", "songCount": "Cançons", "playCount": "Reproduccions", + "size": "Mida", "name": "Nom", "genre": "Gènere", "compilation": "Compilació", @@ -53,22 +62,28 @@ "updatedAt": "Actualitzat ", "comment": "Comentari", "rating": "Valoració", - "createdAt": "", - "size": "", - "originalDate": "", - "releaseDate": "", - "releases": "", - "released": "" + "createdAt": "Creat el", + "size": "Mida", + "originalDate": "Original", + "releaseDate": "Publicat", + "releases": "LLançament |||| Llançaments", + "released": "Publicat", + "recordLabel": "Discogràfica", + "catalogNum": "Número de catàleg", + "releaseType": "Tipus de publicació", + "grouping": "Agrupació", + "media": "Mitjà", + "mood": "Sentiment" }, "actions": { "playAll": "Reprodueix", "playNext": "Reprodueix la següent", "addToQueue": "Reprodueix després", + "share": "Compartir", "shuffle": "Aleatori", "addToPlaylist": "Afegeix a la llista", "download": "Descarrega", - "info": "Obtén informació", - "share": "" + "info": "Obtén informació" }, "lists": { "all": "Tot", @@ -85,11 +100,27 @@ "fields": { "name": "Nom", "albumCount": "Nombre d'àlbums", - "songCount": "Compte de cançons", + "songCount": "Nombre de cançons", + "size": "Mida", "playCount": "Reproduccions", "rating": "Valoració", "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": { @@ -98,6 +129,7 @@ "userName": "Nom d'usuari", "isAdmin": "És admin", "lastLoginAt": "Última connexió", + "lastAccessAt": "Últim Accés", "updatedAt": "Actualitzat", "name": "Nom", "password": "Contrasenya", @@ -169,36 +201,53 @@ } }, "radio": { - "name": "", + "name": "Ràdio |||| Ràdios", "fields": { - "name": "", - "streamUrl": "", - "homePageUrl": "", - "updatedAt": "", - "createdAt": "" + "name": "Nom", + "streamUrl": "URL del flux", + "homePageUrl": "URL principal", + "updatedAt": "Actualitzat", + "createdAt": "Creat" }, "actions": { - "playNow": "" + "playNow": "Reprodueix" } }, "share": { - "name": "", + "name": "Compartir |||| Compartits", "fields": { - "username": "", - "url": "", - "description": "", - "contents": "", - "expiresAt": "", - "lastVisitedAt": "", - "visitCount": "", - "format": "", - "maxBitRate": "", - "updatedAt": "", - "createdAt": "", - "downloadable": "" - } - } - }, + "username": "Compartit per", + "url": "URL", + "description": "Descripció", + "downloadable": "Permet descarregar?", + "contents": "Continguts", + "expiresAt": "Caduca", + "lastVisitedAt": "Última Visita", + "visitCount": "Visites", + "format": "Format", + "maxBitRate": "Taxa de bits màx.", + "updatedAt": "Actualitzat", + "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" + } + } + }, "ra": { "auth": { "welcome1": "Gràcies d'haver instal·lat Navidrome!", @@ -211,28 +260,30 @@ "password": "Contrasenya", "sign_in": "Inicia sessió", "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": { - "invalidChars": "Si us plau, useu solament lletres i nombres", + "invalidChars": "Si us plau, useu només lletres i nombres", "passwordDoesNotMatch": "Les contrasenyes no coincideixen", "required": "Obligatori", "minLength": "Ha de tenir, si més no, %{min} caràcters", - "maxLength": "Ha de tenir %{max} caràcter o menys", - "minValue": "Ha de ser si més no %{min}", + "maxLength": "Ha de tenir %{max} caràcters o menys", + "minValue": "Ha de ser com a mínim %{min}", "maxValue": "Ha de ser %{max} o menys", "number": "Ha de ser un nombre", "email": "Ha de ser un correu vàlid", "oneOf": "Ha de ser un de: %{options}", "regex": "Ha de tenir el format (regexp): %{pattern}", "unique": "Ha de ser únic", - "url": "" + "url": "Ha de ser una URL vàlida" }, "action": { "add_filter": "Afegeix un filtre", "add": "Afegeix", "back": "Enrere", "bulk_actions": "1 element seleccionat |||| %{smart_count} elements seleccionats", + "bulk_actions_mobile": "1 |||| %{smart_count}", "cancel": "Cancel·la", "clear_input_value": "Neteja el valor", "clone": "Clona", @@ -256,9 +307,8 @@ "close_menu": "Tanca el menú", "unselect": "Anul·la la selecció", "skip": "Omet", - "bulk_actions_mobile": "", - "share": "", - "download": "" + "share": "Compartir", + "download": "Descarregar" }, "boolean": { "true": "Sí", @@ -334,7 +384,7 @@ "i18n_error": "No ha estat possible carregar les traduccions per a l'idioma indicat", "canceled": "Acció cancel·lada", "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": { "columnsToDisplay": "Columnes a mostrar", @@ -351,29 +401,31 @@ "noPlaylistsAvailable": "No n'hi ha cap disponible", "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)", + "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_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", "lastfmLinkFailure": "No ha estat possible la vinculació amb Last.fm", "lastfmUnlinkSuccess": "Desvinculat de Last.fm i desactivat el seguiment", "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": { "lastfm": "Obri en Last.fm", "musicbrainz": "Obri en MusicBrainz" }, "lastfmLink": "Llegeix més...", - "listenBrainzLinkSuccess": "Ha reexit la vinculació amb ListenBrainz i se n'ha activat el seguiment com a usuari: %{user}", - "listenBrainzLinkFailure": "No ha estat possible vincular-se a ListenBrainz: %{error}", - "listenBrainzUnlinkSuccess": "Desvinculat de ListenBrainz i desactivat el seguiment", - "listenBrainzUnlinkFailure": "No s'ha pogut desvincular de ListenBrainz", - "downloadOriginalFormat": "", - "shareOriginalFormat": "", - "shareDialogTitle": "", - "shareBatchDialogTitle": "", - "shareSuccess": "", - "shareFailure": "", - "downloadDialogTitle": "", - "shareCopyToClipboard": "" + "shareOriginalFormat": "Compartir en format original", + "shareDialogTitle": "Compartir %{resource} '%{name}'", + "shareBatchDialogTitle": "Compartir 1 %{resource} |||| Compartir %{smart_count} %{resource}", + "shareCopyToClipboard": "Copiar al porta-retalls: Ctrl+C, Enter", + "shareSuccess": "URL copiada al porta-retalls: %{url}", + "shareFailure": "Error copiant URL %{url} al porta-retalls", + "downloadDialogTitle": "Deascarregar %{resource} '%{name}' (%{size})", + "downloadOriginalFormat": "Descarregar en format original" }, "menu": { "library": "Discoteca", @@ -387,14 +439,15 @@ "language": "Llengua", "defaultView": "Vista per defecte", "desktop_notifications": "Notificacions d'escriptori", + "lastfmNotConfigured": "No s'ha configurat l'API de Last.fm", "lastfmScrobbling": "Activa el seguiment de Last.fm", "listenBrainzScrobbling": "Activa el seguiment de ListenBrainz", - "replaygain": "", - "preAmp": "", + "replaygain": "Mode ReplayGain", + "preAmp": "PreAmp de ReplayGain (dB)", "gain": { - "none": "", - "album": "", - "track": "" + "none": "Cap", + "album": "Guany de l'àlbum", + "track": "Guany de la pista" } } }, @@ -432,7 +485,12 @@ "links": { "homepage": "Inici", "source": "Codi font", - "featureRequests": "Sol·licitud de funcionalitats" + "featureRequests": "Sol·licitud de funcionalitats", + "lastInsightsCollection": "Última recolecció d'informació", + "insights": { + "disabled": "Desactivada", + "waiting": "Esperant" + } } }, "activity": { @@ -454,7 +512,7 @@ "vol_up": "Apuja el volum", "vol_down": "Abaixa el volum", "toggle_love": "Afegeix la pista a favorits", - "current_song": "" + "current_song": "Anar a la cançó actual" } } -} \ No newline at end of file +} diff --git a/resources/i18n/no.json b/resources/i18n/no.json index bd4c37d0b..84198fca7 100644 --- a/resources/i18n/no.json +++ b/resources/i18n/no.json @@ -1,8 +1,8 @@ { - "languageName": "Engelsk", + "languageName": "Norsk", "resources": { "song": { - "name": "Låt |||| Låter", + "name": "Sang |||| Sanger", "fields": { "albumArtist": "Album Artist", "duration": "Tid", @@ -11,164 +11,165 @@ "title": "Tittel", "artist": "Artist", "album": "Album", - "path": "Filbane", + "path": "Filsti", "genre": "Sjanger", - "compilation": "Samling", + "compilation": "Samlingg", "year": "År", "size": "Filstørrelse", - "updatedAt": "Oppdatert kl", - "bitRate": "Bithastighet", - "discSubtitle": "Diskundertekst", + "updatedAt": "Oppdatert", + "bitRate": "Bit rate", + "bitDepth": "Bit depth", + "channels": "Kanaler", + "discSubtitle": "Disk Undertittel", "starred": "Favoritt", "comment": "Kommentar", - "rating": "Vurdering", + "rating": "Rangering", "quality": "Kvalitet", "bpm": "BPM", - "playDate": "Sist spilt", - "channels": "Kanaler", - "createdAt": "", - "grouping": "", - "mood": "", - "participants": "", - "tags": "", - "mappedTags": "", - "rawTags": "", - "bitDepth": "" + "playDate": "Sist Avspilt", + "createdAt": "Lagt til", + "grouping": "Gruppering", + "mood": "Stemning", + "participants": "Ytterlige deltakere", + "tags": "Ytterlige Tags", + "mappedTags": "Kartlagte tags", + "rawTags": "Rå tags" }, "actions": { - "addToQueue": "Spill Senere", - "playNow": "Leke nå", + "addToQueue": "Avspill senere", + "playNow": "Avspill nå", "addToPlaylist": "Legg til i spilleliste", - "shuffleAll": "Bland alle", - "download": "nedlasting", - "playNext": "Spill Neste", - "info": "Få informasjon" + "shuffleAll": "Shuffle Alle", + "download": "Last ned", + "playNext": "Avspill neste", + "info": "Få Info" } }, "album": { - "name": "Album", + "name": "Album |||| Album", "fields": { "albumArtist": "Album Artist", "artist": "Artist", "duration": "Tid", "songCount": "Sanger", "playCount": "Avspillinger", + "size": "Størrelse", "name": "Navn", "genre": "Sjanger", "compilation": "Samling", "year": "År", - "updatedAt": "Oppdatert kl", + "date": "Inspillingsdato", + "originalDate": "Original", + "releaseDate": "Utgitt", + "releases": "Utgivelse |||| Utgivelser", + "released": "Utgitt", + "updatedAt": "Oppdatert", "comment": "Kommentar", - "rating": "Vurdering", - "createdAt": "", - "size": "", - "originalDate": "", - "releaseDate": "", - "releases": "", - "released": "", - "recordLabel": "", - "catalogNum": "", - "releaseType": "", - "grouping": "", - "media": "", - "mood": "" + "rating": "Rangering", + "createdAt": "Lagt Til", + "recordLabel": "Plateselskap", + "catalogNum": "Katalognummer", + "releaseType": "Type", + "grouping": "Gruppering", + "media": "Media", + "mood": "Stemning" }, "actions": { - "playAll": "Spill", - "playNext": "Spill neste", - "addToQueue": "Spille senere", - "shuffle": "Bland", + "playAll": "Avspill", + "playNext": "Avspill Neste", + "addToQueue": "Avspill Senere", + "share": "Del", + "shuffle": "Shuffle", "addToPlaylist": "Legg til i spilleliste", - "download": "nedlasting", - "info": "Få informasjon", - "share": "" + "download": "Last ned", + "info": "Få Info" }, "lists": { "all": "Alle", "random": "Tilfeldig", "recentlyAdded": "Nylig lagt til", - "recentlyPlayed": "Nylig spilt", - "mostPlayed": "Mest spilte", + "recentlyPlayed": "Nylig Avspilt", + "mostPlayed": "Mest Avspilt", "starred": "Favoritter", - "topRated": "Topp rangert" + "topRated": "Top Rangert" } }, "artist": { "name": "Artist |||| Artister", "fields": { "name": "Navn", - "albumCount": "Antall album", - "songCount": "Antall sanger", - "playCount": "Spiller", - "rating": "Vurdering", + "albumCount": "Album Antall", + "songCount": "Song Antall", + "size": "Størrelse", + "playCount": "Avspillinger", + "rating": "Rangering", "genre": "Sjanger", - "size": "", - "role": "" + "role": "Rolle" }, "roles": { - "albumartist": "", - "artist": "", - "composer": "", - "conductor": "", - "lyricist": "", - "arranger": "", - "producer": "", - "director": "", - "engineer": "", - "mixer": "", - "remixer": "", - "djmixer": "", - "performer": "" + "albumartist": "Album Artist |||| Album Artister", + "artist": "Artist |||| Artister", + "composer": "Composer |||| Composers", + "conductor": "Conductor |||| Conductors", + "lyricist": "Lyriker |||| Lyriker", + "arranger": "Arranger |||| Arrangers", + "producer": "Produsent |||| Produsenter", + "director": "Director |||| Directors", + "engineer": "Engineer |||| Engineers", + "mixer": "Mixer |||| Mixers", + "remixer": "Remixer |||| Remixers", + "djmixer": "DJ Mixer |||| DJ Mixers", + "performer": "Performer |||| Performers" } }, "user": { "name": "Bruker |||| Brukere", "fields": { "userName": "Brukernavn", - "isAdmin": "er admin", - "lastLoginAt": "Siste pålogging kl", - "updatedAt": "Oppdatert kl", + "isAdmin": "Admin", + "lastLoginAt": "Sist Pålogging", + "lastAccessAt": "Sist Tilgang", + "updatedAt": "Oppdatert", "name": "Navn", "password": "Passord", - "createdAt": "Opprettet kl", - "changePassword": "Bytte Passord", + "createdAt": "Opprettet", + "changePassword": "Bytt Passord?", "currentPassword": "Nåværende Passord", "newPassword": "Nytt Passord", - "token": "Token", - "lastAccessAt": "" + "token": "Token" }, "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": { "created": "Bruker opprettet", "updated": "Bruker oppdatert", - "deleted": "Bruker fjernet" + "deleted": "Bruker slettet" }, "message": { - "listenBrainzToken": "Skriv inn ListenBrainz-brukertokenet ditt.", - "clickHereForToken": "Klikk her for å få tokenet ditt" + "listenBrainzToken": "Fyll inn din ListenBrainz bruker token.", + "clickHereForToken": "Klikk her for å hente din token" } }, "player": { - "name": "Avspiller |||| Avspillere", + "name": "Musikkavspiller |||| Musikkavspillere", "fields": { "name": "Navn", - "transcodingId": "Omkoding", - "maxBitRate": "Maks. Bithastighet", + "transcodingId": "Transkoding", + "maxBitRate": "Maks. Bit Rate", "client": "Klient", "userName": "Brukernavn", - "lastSeen": "Sist sett kl", - "reportRealPath": "Rapporter ekte sti", + "lastSeen": "Sist sett", + "reportRealPath": "Rapporter ekte filsti", "scrobbleEnabled": "Send Scrobbles til eksterne tjenester" } }, "transcoding": { - "name": "Omkoding |||| Omkodinger", + "name": "Transkoding |||| Transkodinger", "fields": { "name": "Navn", - "targetFormat": "Målformat", - "defaultBitRate": "Standard bithastighet", + "targetFormat": "Mål Format", + "defaultBitRate": "Default Bit Rate", "command": "Kommando" } }, @@ -176,135 +177,137 @@ "name": "Spilleliste |||| Spillelister", "fields": { "name": "Navn", - "duration": "Varighet", - "ownerName": "Eieren", + "duration": "Lengde", + "ownerName": "Eier", "public": "Offentlig", - "updatedAt": "Oppdatert kl", - "createdAt": "Opprettet kl", + "updatedAt": "Oppdatert", + "createdAt": "Opprettet", "songCount": "Sanger", "comment": "Kommentar", - "sync": "Autoimport", - "path": "Import fra" + "sync": "Auto-importer", + "path": "Importer fra" }, "actions": { "selectPlaylist": "Velg en spilleliste:", "addNewPlaylist": "Opprett \"%{name}\"", - "export": "Eksport", - "makePublic": "Gjør offentlig", - "makePrivate": "Gjør privat" + "export": "Eksporter", + "makePublic": "Gjør Offentlig", + "makePrivate": "Gjør Privat" }, "message": { - "duplicate_song": "Legg til dupliserte sanger", - "song_exist": "Det legges til duplikater i spillelisten. Vil du legge til duplikatene eller hoppe over dem?" + "duplicate_song": "Legg til Duplikater", + "song_exist": "Duplikater har blitt lagt til i spillelisten. Ønsker du å legge til duplikater eller hoppe over de?" } }, "radio": { - "name": "", + "name": "Radio |||| Radio", "fields": { - "name": "", - "streamUrl": "", - "homePageUrl": "", - "updatedAt": "", - "createdAt": "" + "name": "Navn", + "streamUrl": "Stream URL", + "homePageUrl": "Hjemmeside URL", + "updatedAt": "Oppdatert", + "createdAt": "Opprettet" }, "actions": { - "playNow": "" + "playNow": "Avspill" } }, "share": { - "name": "", + "name": "Del |||| Delinger", "fields": { - "username": "", - "url": "", - "description": "", - "contents": "", - "expiresAt": "", - "lastVisitedAt": "", - "visitCount": "", - "format": "", - "maxBitRate": "", - "updatedAt": "", - "createdAt": "", - "downloadable": "" - } + "username": "Delt Av", + "url": "URL", + "description": "Beskrivelse", + "downloadable": "Tillat Nedlastinger?", + "contents": "Innhold", + "expiresAt": "Utløper", + "lastVisitedAt": "Sist Besøkt", + "visitCount": "Visninger", + "format": "Format", + "maxBitRate": "Maks. Bit Rate", + "updatedAt": "Oppdatert", + "createdAt": "Opprettet" + }, + "notifications": {}, + "actions": {} }, "missing": { - "name": "", + "name": "Manglende Fil|||| Manglende Filer", + "empty": "Ingen Manglende Filer", "fields": { - "path": "", - "size": "", - "updatedAt": "" + "path": "Filsti", + "size": "Størrelse", + "updatedAt": "Ble borte" }, "actions": { - "remove": "" + "remove": "Fjern" }, "notifications": { - "removed": "" - }, - "empty": "" + "removed": "Manglende fil(er) fjernet" + } } }, "ra": { "auth": { "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", "buttonCreateAdmin": "Opprett Admin", - "auth_check_error": "Vennligst Logg inn for å fortsette", + "auth_check_error": "Logg inn for å fortsette", "user_menu": "Profil", "username": "Brukernavn", "password": "Passord", "sign_in": "Logg inn", - "sign_in_error": "Autentisering mislyktes. Prøv på nytt", + "sign_in_error": "Autentiseringsfeil, vennligst prøv igjen", "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": { - "invalidChars": "Bruk bare bokstaver og tall", - "passwordDoesNotMatch": "Passordet er ikke like", - "required": "Obligatorisk", - "minLength": "Må være minst %{min} tegn", - "maxLength": "Må være %{max} tegn eller færre", + "invalidChars": "Det er kun bokstaver og tall som støttes", + "passwordDoesNotMatch": "Passord samstemmer ikke", + "required": "Kreves", + "minLength": "Må være minst %{min} karakterer.", + "maxLength": "Må være %{max} karakterer eller mindre", "minValue": "Må være minst %{min}", "maxValue": "Må være %{max} eller mindre", "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}", - "regex": "Må samsvare med et spesifikt format (regexp): %{pattern}", - "unique": "Må være unik", - "url": "" + "regex": "Må samstemme med et spesifikt format (regexp): %{pattern}", + "unique": "Må være unikt", + "url": "Må være en gyldig URL" }, "action": { "add_filter": "Legg til filter", - "add": "Legge til", - "back": "Gå tilbake", - "bulk_actions": "1 element valgt |||| %{smart_count} elementer er valgt", + "add": "Legg Til", + "back": "Tilbake", + "bulk_actions": "1 element valgt |||| %{smart_count} elementer valgt", + "bulk_actions_mobile": "1 |||| %{smart_count}", "cancel": "Avbryt", - "clear_input_value": "Klar verdi", + "clear_input_value": "Nullstill verdi", "clone": "Klone", - "confirm": "Bekrefte", - "create": "Skape", + "confirm": "Bekreft", + "create": "Opprett", "delete": "Slett", - "edit": "Redigere", - "export": "Eksport", + "edit": "Rediger", + "export": "Eksporter", "list": "Liste", - "refresh": "oppdater", + "refresh": "Oppdater", "remove_filter": "Fjern dette filteret", - "remove": "Fjerne", + "remove": "Fjern", "save": "Lagre", "search": "Søk", "show": "Vis", - "sort": "Sortere", + "sort": "Sorter", "undo": "Angre", - "expand": "Utvide", + "expand": "Utvid", "close": "Lukk", - "open_menu": "Åpne menyen", - "close_menu": "Lukk menyen", - "unselect": "Fjern valget", + "open_menu": "Åpne meny", + "close_menu": "Lukk meny", + "unselect": "Avvelg", "skip": "Hopp over", - "bulk_actions_mobile": "", - "share": "", - "download": "" + "share": "Del", + "download": "Last Ned" }, "boolean": { "true": "Ja", @@ -312,29 +315,29 @@ }, "page": { "create": "Opprett %{name}", - "dashboard": "Dashbord", + "dashboard": "Dashboard", "edit": "%{name} #%{id}", "error": "Noe gikk galt", - "list": "%{Navn}", + "list": "%{name}", "loading": "Laster", - "not_found": "Ikke funnet", + "not_found": "Ikke Funnet", "show": "%{name} #%{id}", - "empty": "Ingen %{name} ennå.", - "invite": "Vil du legge til en?" + "empty": "Ingen %{name} enda.", + "invite": "Ønsker du å legge til en?" }, "input": { "file": { - "upload_several": "Slipp noen filer for å laste opp, eller klikk for å velge en.", - "upload_single": "Slipp en fil for å laste opp, eller klikk for å velge den." + "upload_several": "Dra filer hit for å laste opp, eller klikk for å velge en.", + "upload_single": "Dra en fil hit for å laste opp, eller klikk for å velge den." }, "image": { - "upload_several": "Slipp noen bilder for å laste opp, eller klikk for å velge ett.", - "upload_single": "Slipp et bilde for å laste opp, eller klikk for å velge det." + "upload_several": "Dra bilder hit for å laste opp, eller klikk for å velge en.", + "upload_single": "Dra et bilde hit for å laste opp, eller klikk for å velge den." }, "references": { - "all_missing": "Kan ikke finne referansedata.", - "many_missing": "Minst én av de tilknyttede referansene ser ikke ut til å være tilgjengelig lenger.", - "single_missing": "Tilknyttet referanse ser ikke lenger ut til å være tilgjengelig." + "all_missing": "Finner ikke referansedata.", + "many_missing": "Minst en av de tilhørende referansene ser ikke lenger ut til å være tilgjengelig.", + "single_missing": "Tilhørende referanse ser ikke lenger ut til å være tilgjengelig." }, "password": { "toggle_visible": "Skjul passord", @@ -346,86 +349,86 @@ "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_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}", "details": "Detaljer", - "error": "Det oppstod en klientfeil og forespørselen din kunne ikke fullføres.", - "invalid_form": "Skjemaet er ikke gyldig. Vennligst se etter feil", - "loading": "Siden lastes, bare et øyeblikk", + "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.", + "loading": "Siden laster, vennligst vent.", "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", - "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": { "no_results": "Ingen resultater", - "no_more_results": "Sidetallet %{page} er utenfor grensene. Prøv forrige side.", - "page_out_of_boundaries": "Sidetall %{page} utenfor grensene", - "page_out_from_end": "Kan ikke gå etter siste side", - "page_out_from_begin": "Kan ikke gå før side 1", + "no_more_results": "Sidenummeret %{page} er utenfor grensene. Prøv forrige side.", + "page_out_of_boundaries": "Sidenummer %{page} er utenfor grensene", + "page_out_from_end": "Kan ikke være etter siste side", + "page_out_from_begin": "Kan ikke være før side 1", "page_range_info": "%{offsetBegin}-%{offsetEnd} av %{total}", "page_rows_per_page": "Elementer per side:", "next": "Neste", "prev": "Forrige", - "skip_nav": "Hopp til innholdet" + "skip_nav": "Hopp til innhold" }, "notification": { - "updated": "Element oppdatert |||| %{smart_count} elementer er oppdatert", + "updated": "Element oppdatert |||| %{smart_count} elementer oppdatert", "created": "Element opprettet", "deleted": "Element slettet |||| %{smart_count} elementer slettet", "bad_item": "Feil element", - "item_doesnt_exist": "Elementet eksisterer ikke", - "http_error": "Serverkommunikasjonsfeil", - "data_provider_error": "dataleverandørfeil. Sjekk konsollen for detaljer.", - "i18n_error": "Kan ikke laste oversettelsene for det angitte språket", - "canceled": "Handlingen avbrutt", - "logged_out": "Økten din er avsluttet. Koble til på nytt.", - "new_version": "Ny versjon tilgjengelig! Trykk Oppdater " + "item_doesnt_exist": "Element eksisterer ikke", + "http_error": "Kommunikasjonsfeil mot server", + "data_provider_error": "dataProvider feil. Sjekk konsollet for feil.", + "i18n_error": "Klarte ikke laste oversettelser for valgt språk.", + "canceled": "Handling avbrutt", + "logged_out": "Din sesjon er avsluttet, vennligst koble til på nytt.", + "new_version": "Ny versjon tilgjengelig! Vennligst last siden på nytt." }, "toggleFieldsMenu": { - "columnsToDisplay": "Kolonner som skal vises", - "layout": "Oppsett", - "grid": "Nett", - "table": "Bord" + "columnsToDisplay": "Vis følgende kolonner", + "layout": "Layout", + "grid": "Rutenett", + "table": "Tabell" } }, "message": { - "note": "Info", - "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.", - "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.", + "note": "NOTAT", + "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}, 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", "noPlaylistsAvailable": "Ingen tilgjengelig", - "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)?", - "notifications_blocked": "Du har blokkert varsler for dette nettstedet i nettleserens innstillinger", - "notifications_not_available": "Denne nettleseren støtter ikke skrivebordsvarsler, eller du har ikke tilgang til Navidrome over https", - "lastfmLinkSuccess": "Last.fm er vellykket koblet og scrobbling aktivert", - "lastfmLinkFailure": "Last.fm kunne ikke kobles til", - "lastfmUnlinkSuccess": "Last.fm koblet fra og scrobbling deaktivert", - "lastfmUnlinkFailure": "Last.fm kunne ikke kobles fra", + "delete_user_title": "Slett bruker '%{name}'", + "delete_user_content": "Er du sikker på at du vil slette denne brukeren og all tilhørlig data (inkludert spillelister og preferanser)?", + "remove_missing_title": "Fjern manglende filer", + "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.", + "notifications_blocked": "Du har blokkert notifikasjoner for denne nettsiden i din nettleser.", + "notifications_not_available": "Denne nettleseren støtter ikke skrivebordsnotifikasjoner, eller så er du ikke tilkoblet Navidrome via https.", + "lastfmLinkSuccess": "Last.fm er tilkoblet og scrobbling er aktivert", + "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": { "lastfm": "Åpne i Last.fm", "musicbrainz": "Åpne i MusicBrainz" }, - "lastfmLink": "Les mer...", - "listenBrainzLinkSuccess": "ListenBrainz er vellykket koblet og scrobbling aktivert som bruker: %{user}", - "listenBrainzLinkFailure": "ListenBrainz kunne ikke kobles: %{error}", - "listenBrainzUnlinkSuccess": "ListenBrainz koblet fra og scrobbling deaktivert", - "listenBrainzUnlinkFailure": "ListenBrainz kunne ikke fjernes", - "downloadOriginalFormat": "", - "shareOriginalFormat": "", - "shareDialogTitle": "", - "shareBatchDialogTitle": "", - "shareSuccess": "", - "shareFailure": "", - "downloadDialogTitle": "", - "shareCopyToClipboard": "", - "remove_missing_title": "", - "remove_missing_content": "" + "lastfmLink": "Les Mer...", + "shareOriginalFormat": "Del i originalformat", + "shareDialogTitle": "Del %{resource} '%{name}'", + "shareBatchDialogTitle": "Del 1 %{resource} |||| Del %{smart_count} %{resource}", + "shareCopyToClipboard": "Kopier til utklippstavle: Ctrl+C, Enter", + "shareSuccess": "URL kopiert til utklippstavle: %{url}", + "shareFailure": "Error ved kopiering av URL %{url} til utklippstavle", + "downloadDialogTitle": "Last ned %{resource} '%{name}' (%{size})", + "downloadOriginalFormat": "Last ned i originalformat" }, "menu": { "library": "Bibliotek", - "settings": "Innstillinger", + "settings": "Instillinger", "version": "Versjon", "theme": "Tema", "personal": { @@ -434,81 +437,81 @@ "theme": "Tema", "language": "Språk", "defaultView": "Standardvisning", - "desktop_notifications": "Skrivebordsvarsler", + "desktop_notifications": "Skrivebordsnotifikasjoner", + "lastfmNotConfigured": "Last.fm API-Key er ikke konfigurert", "lastfmScrobbling": "Scrobble til Last.fm", "listenBrainzScrobbling": "Scrobble til ListenBrainz", - "replaygain": "", - "preAmp": "", + "replaygain": "ReplayGain Mode", + "preAmp": "ReplayGain PreAmp (dB)", "gain": { - "none": "", - "album": "", - "track": "" - }, - "lastfmNotConfigured": "" + "none": "Deaktivert", + "album": "Bruk Album Gain", + "track": "Bruk Track Gain" + } } }, "albumList": "Album", - "about": "Om", - "playlists": "Spilleliste", - "sharedPlaylists": "Delte spillelister" + "playlists": "Spillelister", + "sharedPlaylists": "Delte Spillelister", + "about": "Om" }, "player": { - "playListsText": "Spillekø", + "playListsText": "Spill Av Kø", "openText": "Åpne", "closeText": "Lukk", "notContentText": "Ingen musikk", - "clickToPlayText": "Klikk for å spille", - "clickToPauseText": "Klikk for å sette på pause", + "clickToPlayText": "Klikk for å avspille", + "clickToPauseText": "Klikk for å pause", "nextTrackText": "Neste spor", "previousTrackText": "Forrige spor", - "reloadText": "Last inn på nytt", + "reloadText": "Last på nytt", "volumeText": "Volum", - "toggleLyricText": "Veksle mellom tekster", + "toggleLyricText": "Slå på/av sangtekster", "toggleMiniModeText": "Minimer", - "destroyText": "Ødelegge", - "downloadText": "nedlasting", + "destroyText": "Ødelegg", + "downloadText": "Last Ned", "removeAudioListsText": "Slett lydlister", "clickToDeleteText": "Klikk for å slette %{name}", "emptyLyricText": "Ingen sangtekster", "playModeText": { "order": "I rekkefølge", - "orderLoop": "Gjenta", - "singleLoop": "Gjenta engang", - "shufflePlay": "Tilfeldig rekkefølge" + "orderLoop": "Repeat", + "singleLoop": "Repeat En", + "shufflePlay": "Shuffle" } }, "about": { "links": { "homepage": "Hjemmeside", "source": "Kildekode", - "featureRequests": "Funksjonsforespørsler", - "lastInsightsCollection": "", + "featureRequests": "Funksjonsforespørseler", + "lastInsightsCollection": "Siste Innsamling av anonymisert forbruksdata", "insights": { - "disabled": "", - "waiting": "" + "disabled": "Deaktivert", + "waiting": "Venter" } } }, "activity": { "title": "Aktivitet", - "totalScanned": "Totalt skannede mapper", - "quickScan": "Rask skanning", - "fullScan": "Full skanning", - "serverUptime": "Serveroppetid", + "totalScanned": "Antall mapper skannet", + "quickScan": "Hurtigskann", + "fullScan": "Full Skann", + "serverUptime": "Server Oppetid", "serverDown": "OFFLINE" }, "help": { - "title": "Navidrome hurtigtaster", + "title": "Navidrome Hurtigtaster", "hotkeys": { - "show_help": "Vis denne hjelpen", - "toggle_menu": "Bytt menysidelinje", - "toggle_play": "Spill / Pause", - "prev_song": "Forrige sang", - "next_song": "Neste sang", - "vol_up": "Volum opp", - "vol_down": "Volum ned", - "toggle_love": "Legg til dette sporet i favoritter", - "current_song": "" + "show_help": "Vis Hjelp", + "toggle_menu": "Åpne/Lukke Sidepanel", + "toggle_play": "Avspill / Pause", + "prev_song": "Forrige Sang", + "next_song": "Neste Sang", + "current_song": "Gå til Nåværende Sang", + "vol_up": "Volum Opp", + "vol_down": "Volum Ned", + "toggle_love": "Legg til spor i favoritter" } } -} \ No newline at end of file +} diff --git a/resources/i18n/ru.json b/resources/i18n/ru.json index c6b7fcd16..a4de263e4 100644 --- a/resources/i18n/ru.json +++ b/resources/i18n/ru.json @@ -33,7 +33,8 @@ "tags": "Дополнительные теги", "mappedTags": "Сопоставленные теги", "rawTags": "Исходные теги", - "bitDepth": "Битовая глубина" + "bitDepth": "Битовая глубина", + "sampleRate": "Частота дискретизации (Гц)" }, "actions": { "addToQueue": "В очередь", @@ -72,7 +73,7 @@ "grouping": "Группирование", "media": "Медиа", "mood": "Настроение", - "date": "" + "date": "Дата записи" }, "actions": { "playAll": "Играть", diff --git a/resources/i18n/sr.json b/resources/i18n/sr.json index d0b897ec1..1cf7e39e7 100644 --- a/resources/i18n/sr.json +++ b/resources/i18n/sr.json @@ -1,465 +1,517 @@ { - "languageName": "српски", - "resources": { - "song": { - "name": "Песма |||| Песме", - "fields": { - "albumArtist": "Уметник албума", - "duration": "Трајање", - "trackNumber": "#", - "playCount": "Пуштано", - "title": "Наслов", - "artist": "Уметник", - "album": "Албум", - "path": "Путања фајла", - "genre": "Жанр", - "compilation": "Компилација", - "year": "Година", - "size": "Величина фајла", - "updatedAt": "Ажурирано", - "bitRate": "Битски проток", - "channels": "Канала", - "discSubtitle": "Поднаслов диска", - "starred": "Омиљено", - "comment": "Коментар", - "rating": "Рејтинг", - "quality": "Квалитет", - "bpm": "BPM", - "playDate": "Последње пуштано", - "createdAt": "Датум додавања" - }, - "actions": { - "addToQueue": "Пусти касније", - "playNow": "Пусти одмах", - "addToPlaylist": "Додај у плејлисту", - "shuffleAll": "Измешај све", - "download": "Преузми", - "playNext": "Пусти наредно", - "info": "Прикажи инфо" - } - }, - "album": { - "name": "Албум |||| Албуми", - "fields": { - "albumArtist": "Уметник албума", - "artist": "Уметник", - "duration": "Трајање", - "songCount": "Песме", - "playCount": "Пуштано", - "size": "Величина", - "name": "Назив", - "genre": "Жанр", - "compilation": "Компилација", - "year": "Година", - "originalDate": "Оригинално", - "releaseDate": "Објављено", - "releases": "Издање|||| Издања", - "released": "Објављено", - "updatedAt": "Ажурирано", - "comment": "Коментар", - "rating": "Рејтинг", - "createdAt": "Датум додавања" - }, - "actions": { - "playAll": "Пусти", - "playNext": "Пусти наредно", - "addToQueue": "Пусти касније", - "share": "Дели", - "shuffle": "Измешај", - "addToPlaylist": "Додај у плејлисту", - "download": "Преузми", - "info": "Прикажи инфо" - }, - "lists": { - "all": "Све", - "random": "Насумично", - "recentlyAdded": "Додато недавно", - "recentlyPlayed": "Пуштано недавно", - "mostPlayed": "Најчешће пуштано", - "starred": "Омиљено", - "topRated": "Најбоље рангирано" - } - }, - "artist": { - "name": "Уметник |||| Уметници", - "fields": { - "name": "Име", - "albumCount": "Број албума", - "songCount": "Број песама", - "size": "Величина", - "playCount": "Пуштано", - "rating": "Рејтинг", - "genre": "Жанр" - } - }, - "user": { - "name": "Корисник |||| Корисници", - "fields": { - "userName": "Корисничко име", - "isAdmin": "Да ли је Админ", - "lastLoginAt": "Последња пријава", - "lastAccessAt": "Последњи приступ", - "updatedAt": "Ажурирано", - "name": "Име", - "password": "Лозинка", - "createdAt": "Креирана", - "changePassword": "Измени лозинку?", - "currentPassword": "Текућа лозинка", - "newPassword": "Нова лозинка", - "token": "Жетон" - }, - "helperTexts": { - "name": "Измене вашег имена ће постати видљиве након следеће пријаве" - }, - "notifications": { - "created": "Корисник креиран", - "updated": "Корисник ажуриран", - "deleted": "Корисник обрисан" - }, - "message": { - "listenBrainzToken": "Унесите свој ListenBrainz кориснички жетон.", - "clickHereForToken": "Кликните овде да преузмете свој жетон" - } - }, - "player": { - "name": "Плејер |||| Плејери", - "fields": { - "name": "Назив", - "transcodingId": "Транскодирање", - "maxBitRate": "Макс. битски проток", - "client": "Клијент", - "userName": "Корисничко име", - "lastSeen": "последњи пут виђен", - "reportRealPath": "Пријављуј реалну путању", - "scrobbleEnabled": "Шаљи скроблове на спољне сервисе" - } - }, - "transcoding": { - "name": "Транскодирање |||| Транскодирања", - "fields": { - "name": "Назив", - "targetFormat": "Циљни формат", - "defaultBitRate": "Подразумевани битски проток", - "command": "Команда" - } - }, - "playlist": { - "name": "Плејлиста |||| Плејлисте", - "fields": { - "name": "Назив", - "duration": "Трајање", - "ownerName": "Власник", - "public": "Јавна", - "updatedAt": "Ажурирана", - "createdAt": "Креирана", - "songCount": "Песме", - "comment": "Коментар", - "sync": "Ауто-увоз", - "path": "Увоз из" - }, - "actions": { - "selectPlaylist": "Изабери плејлисту", - "addNewPlaylist": "Креирај „%{name}”", - "export": "Извоз", - "makePublic": "Учини јавном", - "makePrivate": "Учини приватном" - }, - "message": { - "duplicate_song": "Додај дуплиране песме", - "song_exist": "У плејлисту се додају дупликати. Желите ли да се додају, или да се прескоче?" - } - }, - "radio": { - "name": "Радио |||| Радији", - "fields": { - "name": "Назив", - "streamUrl": "URL тока", - "homePageUrl": "URL почетне странице", - "updatedAt": "Ажурирано", - "createdAt": "Креирано" - }, - "actions": { - "playNow": "Пусти одмах" - } - }, - "share": { - "name": "Дељење |||| Дељења", - "fields": { - "username": "Поделио", - "url": "URL", - "description": "Опис", - "downloadable": "Допушта се преузимање?", - "contents": "Садржај", - "expiresAt": "Истиче", - "lastVisitedAt": "Последњи пут посећено", - "visitCount": "Број посета", - "format": "Формат", - "maxBitRate": "Макс. битски проток", - "updatedAt": "Ажурирано", - "createdAt": "Креирано" - }, - "notifications": { - }, - "actions": { - } - } + "languageName": "српски", + "resources": { + "song": { + "name": "Песма |||| Песме", + "fields": { + "album": "Албум", + "albumArtist": "Уметник албума", + "artist": "Уметник", + "bitDepth": "Битова", + "bitRate": "Битски проток", + "bpm": "BPM", + "channels": "Канала", + "comment": "Коментар", + "compilation": "Компилација", + "createdAt": "Датум додавања", + "discSubtitle": "Поднаслов диска", + "duration": "Трајање", + "genre": "Жанр", + "grouping": "Груписање", + "mappedTags": "Мапиране ознаке", + "mood": "Расположење", + "participants": "Додатни учесници", + "path": "Путања фајла", + "playCount": "Пуштано", + "playDate": "Последње пуштано", + "quality": "Квалитет", + "rating": "Рејтинг", + "rawTags": "Сирове ознаке", + "size": "Величина фајла", + "starred": "Омиљено", + "tags": "Додатне ознаке", + "title": "Наслов", + "trackNumber": "#", + "updatedAt": "Ажурирано", + "year": "Година" + }, + "actions": { + "addToPlaylist": "Додај у плејлисту", + "addToQueue": "Пусти касније", + "download": "Преузми", + "info": "Прикажи инфо", + "playNext": "Пусти наредно", + "playNow": "Пусти одмах", + "shuffleAll": "Измешај све" + } }, - "ra": { - "auth": { - "welcome1": "Хвала што сте инсталирали Navidrome!", - "welcome2": "За почетак, креирајте админ корисника", - "confirmPassword": "Потврдите лозинку", - "buttonCreateAdmin": "Креирај админа", - "auth_check_error": "Ако желите да наставите, молимо вас да се пријавите", - "user_menu": "Профил", - "username": "Корисничко име", - "password": "Лозинка", - "sign_in": "Пријави се", - "sign_in_error": "Потврда идентитета није успела, покушајте поново", - "logout": "Одјави се" - }, - "validation": { - "invalidChars": "Молимо вас да користите само слова и цифре", - "passwordDoesNotMatch": "Лозинка се не подудара", - "required": "Неопходно", - "minLength": "Мора да буде барем %{min} карактера", - "maxLength": "Мора да буде %{max} карактера или мање", - "minValue": "Мора да буде барем %{min}", - "maxValue": "Мора да буде %{max} или мање", - "number": "Мора да буде број", - "email": "Мора да буде исправна и-мејл адреса", - "oneOf": "Мора да буде једно од: %{options}", - "regex": "Мора да се подудара са одређеним форматом (регуларни израз): %{pattern}", - "unique": "Мора да буде јединствено", - "url": "Мора да буде исправна URL адреса" - }, - "action": { - "add_filter": "Додај филтер", - "add": "Додај", - "back": "Иди назад", - "bulk_actions": "изабрана је 1 ставка |||| изабрано је %{smart_count} ставки", - "bulk_actions_mobile": "1 |||| %{smart_count}", - "cancel": "Откажи", - "clear_input_value": "Обриши вредност", - "clone": "Клонирај", - "confirm": "Потврди", - "create": "Креирај", - "delete": "Обриши", - "edit": "Уреди", - "export": "Извези", - "list": "Листа", - "refresh": "Освежи", - "remove_filter": "Уклони овај филтер", - "remove": "Уклони", - "save": "Сачувај", - "search": "Тражи", - "show": "Прикажи", - "sort": "Сортирај", - "undo": "Поништи", - "expand": "Развиј", - "close": "Затвори", - "open_menu": "Отвори мени", - "close_menu": "Затвори мени", - "unselect": "Уклони избор", - "skip": "Прескочи", - "share": "Подели", - "download": "Преузми" - }, - "boolean": { - "true": "Да", - "false": "Не" - }, - "page": { - "create": "Креирај %{name}", - "dashboard": "Контролна табла", - "edit": "%{name} #%{id}", - "error": "Нешто је пошло наопако", - "list": "%{name}", - "loading": "Учитава се", - "not_found": "Није пронађено", - "show": "%{name} #%{id}", - "empty": "Још увек нема %{name}.", - "invite": "Желите ли да се дода?" - }, - "input": { - "file": { - "upload_several": "Упустите фајлове да се отпреме, или кликните да их изаберете.", - "upload_single": "Упустите фајл да се отпреми, или кликните да га изаберете." - }, - "image": { - "upload_several": "Упустите слике да се отпреме, или кликните да их изаберете.", - "upload_single": "Упустите слику да се отпреми, или кликните да је изаберете." - }, - "references": { - "all_missing": "Не могу да се нађу подаци референци.", - "many_missing": "Изгледа да барем једна од придружених референци више није доступна.", - "single_missing": "Изгледа да придружена референца више није доступна." - }, - "password": { - "toggle_visible": "Сакриј лозинку", - "toggle_hidden": "Прикажи лозинку" - } - }, - "message": { - "about": "О програму", - "are_you_sure": "Да ли сте сигурни?", - "bulk_delete_content": "Да ли заиста желите да обришете %{name}? |||| Да ли заиста желите да обришете %{smart_count} ставке?", - "bulk_delete_title": "Брисање %{name} |||| Брисање %{smart_count} %{name}", - "delete_content": "Да ли заиста желите да обришете ову ставку?", - "delete_title": "Брисање %{name} #%{id}", - "details": "Детаљи", - "error": "Дошло је до клијентске грешке и ваш захтев није могао да се изврши.", - "invalid_form": "Формулар није исправан. Молимо вас да исправите грешке", - "loading": "Страница се учитава, сачекајте мало", - "no": "Не", - "not_found": "Или сте откуцали погрешну URL адресу, или сте следили неисправан линк.", - "yes": "Да", - "unsaved_changes": "Неке од ваших измена нису сачуване. Да ли заиста желите да их одбаците?" - }, - "navigation": { - "no_results": "Није пронађен ниједан резултат", - "no_more_results": "Број странице %{page} је ван опсега. Покушајте претходну страницу.", - "page_out_of_boundaries": "Број странице %{page} је ван опсега", - "page_out_from_end": "Не може да се иде након последње странице", - "page_out_from_begin": "Не може да се иде испред странице 1", - "page_range_info": "%{offsetBegin}-%{offsetEnd} од %{total}", - "page_rows_per_page": "Ставки по страници:", - "next": "Наредна", - "prev": "Претход", - "skip_nav": "Прескочи на садржај" - }, - "notification": { - "updated": "Елемент је ажуриран |||| %{smart_count} елемената је ажурирано", - "created": "Елемент је креиран", - "deleted": "Елемент је обрисан |||| %{smart_count} елемената је обрисано", - "bad_item": "Неисправни елемент", - "item_doesnt_exist": "Елемент не постоји", - "http_error": "Грешка у комуникацији са сервером", - "data_provider_error": "dataProvider грешка. За више детаља погледајте конзолу.", - "i18n_error": "Не могу да се учитају преводи за наведени језик", - "canceled": "Акција је отказана", - "logged_out": "Ваша сесија је завршена, молимо вас да се повежите поново.", - "new_version": "Доступна је нова верзија! Молимо вас да освежите овај прозор." - }, - "toggleFieldsMenu": { - "columnsToDisplay": "Колоне за приказ", - "layout": "Распоред", - "grid": "Мрежа", - "table": "Табела" - } + "album": { + "name": "Албум |||| Албуми", + "fields": { + "albumArtist": "Уметник албума", + "artist": "Уметник", + "catalogNum": "Каталошки број", + "comment": "Коментар", + "compilation": "Компилација", + "createdAt": "Датум додавања", + "date": "Датум снимања", + "duration": "Трајање", + "genre": "Жанр", + "grouping": "Груписање", + "media": "Медијум", + "mood": "Расположење", + "name": "Назив", + "originalDate": "Оригинално", + "playCount": "Пуштано", + "rating": "Рејтинг", + "recordLabel": "Издавачка кућа", + "releaseDate": "Објављено", + "releaseType": "Тип", + "released": "Објављено", + "releases": "Издање|||| Издања", + "size": "Величина", + "songCount": "Песме", + "updatedAt": "Ажурирано", + "year": "Година" + }, + "actions": { + "addToPlaylist": "Додај у плејлисту", + "addToQueue": "Пусти касније", + "download": "Преузми", + "info": "Прикажи инфо", + "playAll": "Пусти", + "playNext": "Пусти наредно", + "share": "Дели", + "shuffle": "Измешај" + }, + "lists": { + "all": "Све", + "mostPlayed": "Најчешће пуштано", + "random": "Насумично", + "recentlyAdded": "Додато недавно", + "recentlyPlayed": "Пуштано недавно", + "starred": "Омиљено", + "topRated": "Најбоље рангирано" + } }, - "message": { - "note": "НАПОМЕНА", - "transcodingDisabled": "Измена конфигурације транскодирања кроз веб интерфејс је искључена из разлога безбедности. Ако желите да измените (уредите или додате) опције транскодирања, поново покрените сервер са %{config} конфигурационом опцијом.", - "transcodingEnabled": "Navidrome се тренутно извршава са %{config}, чиме је омогућено извршавање системских команди из подешавања транскодирања коришћењем веб интерфејса. Из разлога безбедности, препоручујемо да то искључите, а да омогућите само када конфигуришете опције транскодирања.", - "songsAddedToPlaylist": "У плејлисту је додата 1 песма |||| У плејлисту је додато %{smart_count} песама", - "noPlaylistsAvailable": "Није доступна ниједна", - "delete_user_title": "Брисање корисника ’%{name}’", - "delete_user_content": "Да ли заиста желите да обришете овог корисника, заједно са свим његовим подацима (плејлистама и подешавањима)?", - "notifications_blocked": "У подешавањима интернет прегледача за овај сајт, блокирали сте обавештења", - "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": { - "lastfm": "Отвори у Last.fm", - "musicbrainz": "Отвори у MusicBrainz" - }, - "lastfmLink": "Прочитај још...", - "shareOriginalFormat": "Подели у оригиналном формату", - "shareDialogTitle": "Подели %{resource} ’%{name}’", - "shareBatchDialogTitle": "Подели 1 %{resource} |||| Подели %{smart_count} %{resource}", - "shareCopyToClipboard": "Копирај у клипборд: Ctrl+C, Ентер", - "shareSuccess": "URL је копиран у клипборд: %{url}", - "shareFailure": "Грешка приликом копирања URL адресе %{url} у клипборд", - "downloadDialogTitle": "Преузимање %{resource} ’%{name}’ (%{size})", - "downloadOriginalFormat": "Преузми у оригиналном формату" + "artist": { + "name": "Уметник |||| Уметници", + "fields": { + "albumCount": "Број албума", + "genre": "Жанр", + "name": "Назив", + "playCount": "Пуштано", + "rating": "Рејтинг", + "role": "Улога", + "size": "Величина", + "songCount": "Број песама" + }, + "roles": { + "albumartist": "Уметник албума |||| Уметници албума", + "arranger": "Аранжер |||| Аранжери", + "artist": "Уметник |||| Уметници", + "composer": "Композитор |||| Композитори", + "conductor": "Диригент |||| Диригенти", + "director": "Режисер |||| Режисери", + "djmixer": "Ди-џеј миксер |||| Ди-џеј миксер", + "engineer": "Инжењер |||| Инжењери", + "lyricist": "Текстописац |||| Текстописци", + "mixer": "Миксер |||| Миксери", + "performer": "Извођач |||| Извођачи", + "producer": "Продуцент |||| Продуценти", + "remixer": "Ремиксер |||| Ремиксери" + } }, - "menu": { - "library": "Библиотека", - "settings": "Подешавања", - "version": "Верзија", - "theme": "Тема", - "personal": { - "name": "Лична", - "options": { - "theme": "Тема", - "language": "Језик", - "defaultView": "Подразумевани поглед", - "desktop_notifications": "Десктоп обавештења", - "lastfmScrobbling": "Скроблуј на Last.fm", - "listenBrainzScrobbling": "Скроблуј на ListenBrainz", - "replaygain": "ReplayGain режим", - "preAmp": "ReplayGain претпојачање (dB)", - "gain": { - "none": "Искључено", - "album": "Користи Album појачање", - "track": "Користи Track појачање" - } - } - }, - "albumList": "Албуми", - "playlists": "Плејлисте", - "sharedPlaylists": "Дељене плејлисте", - "about": "О" + "user": { + "name": "Корисник |||| Корисници", + "fields": { + "changePassword": "Измени лозинку?", + "createdAt": "Креирана", + "currentPassword": "Текућа лозинка", + "isAdmin": "Да ли је Админ", + "lastAccessAt": "Последњи приступ", + "lastLoginAt": "Последња пријава", + "name": "Назив", + "newPassword": "Нова лозинка", + "password": "Лозинка", + "token": "Жетон", + "updatedAt": "Ажурирано", + "userName": "Корисничко име" + }, + "helperTexts": { + "name": "Измене вашег имена ће постати видљиве након следеће пријаве" + }, + "notifications": { + "created": "Корисник креиран", + "deleted": "Корисник обрисан", + "updated": "Корисник ажуриран" + }, + "message": { + "clickHereForToken": "Кликните овде да преузмете свој жетон", + "listenBrainzToken": "Унесите свој ListenBrainz кориснички жетон." + } }, "player": { - "playListsText": "Ред за пуштање", - "openText": "Отвори", - "closeText": "Затвори", - "notContentText": "Нема музике", - "clickToPlayText": "Кликни за пуштање", - "clickToPauseText": "Кликни за паузирање", - "nextTrackText": "Наредна нумера", - "previousTrackText": "Претходна нумера", - "reloadText": "Поново учитај", - "volumeText": "Јачина", - "toggleLyricText": "Укљ./Искљ. стихове", - "toggleMiniModeText": "Умањи", - "destroyText": "Уништи", - "downloadText": "Преузми", - "removeAudioListsText": "Обриши аудио листе", - "clickToDeleteText": "Кликните да обришете %{name}", - "emptyLyricText": "Нема стихова", - "playModeText": { - "order": "По редоследу", - "orderLoop": "Понови", - "singleLoop": "Понови једну", - "shufflePlay": "Промешано" - } + "name": "Плејер |||| Плејери", + "fields": { + "client": "Клијент", + "lastSeen": "Последњи пут виђен", + "maxBitRate": "Макс. битски проток", + "name": "Назив", + "reportRealPath": "Пријављуј реалну путању", + "scrobbleEnabled": "Шаљи скроблове на спољне сервисе", + "transcodingId": "Транскодирање", + "userName": "Корисничко име" + } }, - "about": { - "links": { - "homepage": "Почетна страница", - "source": "Изворни кôд", - "featureRequests": "Захтеви за функцијама" - } + "transcoding": { + "name": "Транскодирање |||| Транскодирања", + "fields": { + "command": "Команда", + "defaultBitRate": "Подразумевани битски проток", + "name": "Назив", + "targetFormat": "Циљни формат" + } }, - "activity": { - "title": "Активност", - "totalScanned": "Укупан број скенираних фолдера", - "quickScan": "Брзо скенирање", - "fullScan": "Комплетно скенирање", - "serverUptime": "Сервер се извршава", - "serverDown": "ВАН МРЕЖЕ" + "playlist": { + "name": "Плејлиста |||| Плејлисте", + "fields": { + "comment": "Коментар", + "createdAt": "Креирана", + "duration": "Трајање", + "name": "Назив", + "ownerName": "Власник", + "path": "Увоз из", + "public": "Јавна", + "songCount": "Песме", + "sync": "Ауто-увоз", + "updatedAt": "Ажурирано" + }, + "actions": { + "addNewPlaylist": "Креирај „%{name}”", + "export": "Извези", + "makePrivate": "Учини приватном", + "makePublic": "Учини јавном", + "selectPlaylist": "Изабери плејлисту" + }, + "message": { + "duplicate_song": "Додај дуплиране песме", + "song_exist": "У плејлисту се додају дупликати. Желите ли да се додају, или да се прескоче?" + } }, - "help": { - "title": "Navidrome пречице", - "hotkeys": { - "show_help": "Прикажи ову помоћ", - "toggle_menu": "Укљ./Искљ. бочну траку менија", - "toggle_play": "Пусти / Паузирај", - "prev_song": "Претходна песма", - "next_song": "Наредна песма", - "current_song": "Иди на текућу песму", - "vol_up": "Појачај", - "vol_down": "Утишај", - "toggle_love": "Додај ову нумеру у омиљене" - } + "radio": { + "name": "Радио |||| Радији", + "fields": { + "createdAt": "Креирана", + "homePageUrl": "URL почетне странице", + "name": "Назив", + "streamUrl": "URL тока", + "updatedAt": "Ажурирано" + }, + "actions": { + "playNow": "Пусти одмах" + } + }, + "share": { + "name": "Дељење |||| Дељења", + "fields": { + "contents": "Садржај", + "createdAt": "Креирано", + "description": "Опис", + "downloadable": "Допушта се преузимање?", + "expiresAt": "Истиче", + "format": "Формат", + "lastVisitedAt": "Последњи пут посећено", + "maxBitRate": "Макс. битски проток", + "updatedAt": "Ажурирано", + "url": "URL", + "username": "Поделио", + "visitCount": "Број посета" + }, + "notifications": {}, + "actions": {} + }, + "missing": { + "name": "Фајл који недостаје|||| Фајлови који недостају", + "empty": "Нема фајлова који недостају", + "fields": { + "path": "Путања", + "size": "Величина", + "updatedAt": "Нестао дана" + }, + "actions": { + "remove": "Уклони" + }, + "notifications": { + "removed": "Фајл који недостаје, или више њих, је уклоњен" + } } + }, + "ra": { + "auth": { + "auth_check_error": "Ако желите да наставите, молимо вас да се пријавите", + "buttonCreateAdmin": "Креирај админа", + "confirmPassword": "Потврдите лозинку", + "insightsCollectionNote": "Navidrome прикупља анонимне податке о коришћењу\nшто олакшава унапређење пројекта. Кликните [овде] да\nсазнате више и да одустанете од прикупљања ако желите", + "logout": "Одјави се", + "password": "Лозинка", + "sign_in": "Пријави се", + "sign_in_error": "Потврда идентитета није успела, покушајте поново", + "user_menu": "Профил", + "username": "Корисничко име", + "welcome1": "Хвала што сте инсталирали Navidrome!", + "welcome2": "За почетак, креирајте админ корисника" + }, + "validation": { + "email": "Мора да буде исправна и-мејл адреса", + "invalidChars": "Молимо вас да користите само слова и цифре", + "maxLength": "Мора да буде %{max} карактера или мање", + "maxValue": "Мора да буде %{max} или мање", + "minLength": "Мора да буде барем %{min} карактера", + "minValue": "Мора да буде барем %{min}", + "number": "Мора да буде број", + "oneOf": "Мора да буде једно од: %{options}", + "passwordDoesNotMatch": "Лозинка се не подудара", + "regex": "Мора да се подудара са одређеним форматом (регуларни израз): %{pattern}", + "required": "Неопходно", + "unique": "Мора да буде јединствено", + "url": "Мора да буде исправна URL адреса" + }, + "action": { + "add": "Додај", + "add_filter": "Додај филтер", + "back": "Иди назад", + "bulk_actions": "изабрана је 1 ставка |||| изабрано је %{smart_count} ставки", + "bulk_actions_mobile": "1 |||| %{smart_count}", + "cancel": "Откажи", + "clear_input_value": "Обриши вредност", + "clone": "Клонирај", + "close": "Затвори", + "close_menu": "Затвори мени", + "confirm": "Потврди", + "create": "Креирај", + "delete": "Обриши", + "download": "Преузми", + "edit": "Уреди", + "expand": "Развиј", + "export": "Извези", + "list": "Листа", + "open_menu": "Отвори мени", + "refresh": "Освежи", + "remove": "Уклони", + "remove_filter": "Уклони овај филтер", + "save": "Сачувај", + "search": "Тражи", + "share": "Дели", + "show": "Прикажи", + "skip": "Прескочи", + "sort": "Сортирај", + "undo": "Поништи", + "unselect": "Уклони избор" + }, + "boolean": { + "false": "Не", + "true": "Да" + }, + "page": { + "create": "Креирај %{name}", + "dashboard": "Контролна табла", + "edit": "%{name} #%{id}", + "empty": "Још увек нема %{name}.", + "error": "Нешто је пошло наопако", + "invite": "Желите ли да се дода?", + "list": "%{name}", + "loading": "Учитава се", + "not_found": "Није пронађено", + "show": "%{name} #%{id}" + }, + "input": { + "file": { + "upload_several": "Упустите фајлове да се отпреме, или кликните да их изаберете.", + "upload_single": "Упустите фајл да се отпреми, или кликните да га изаберете." + }, + "image": { + "upload_several": "Упустите слике да се отпреме, или кликните да их изаберете.", + "upload_single": "Упустите слику да се отпреми, или кликните да је изаберете." + }, + "password": { + "toggle_hidden": "Прикажи лозинку", + "toggle_visible": "Сакриј лозинку" + }, + "references": { + "all_missing": "Не могу да се нађу подаци референци.", + "many_missing": "Изгледа да барем једна од придружених референци више није доступна.", + "single_missing": "Изгледа да придружена референца више није доступна." + } + }, + "message": { + "about": "О", + "are_you_sure": "Да ли сте сигурни?", + "bulk_delete_content": "Да ли заиста желите да обришете %{name}? |||| Да ли заиста желите да обришете %{smart_count} ставке?", + "bulk_delete_title": "Брисање %{name} |||| Брисање %{smart_count} %{name}", + "delete_content": "Да ли заиста желите да обришете ову ставку?", + "delete_title": "Брисање %{name} #%{id}", + "details": "Детаљи", + "error": "Дошло је до клијентске грешке и ваш захтев није могао да се изврши.", + "invalid_form": "Формулар није исправан. Молимо вас да исправите грешке", + "loading": "Страница се учитава, сачекајте мало", + "no": "Не", + "not_found": "Или сте откуцали погрешну URL адресу, или сте следили неисправан линк.", + "unsaved_changes": "Неке од ваших измена нису сачуване. Да ли заиста желите да их одбаците?", + "yes": "Да" + }, + "navigation": { + "next": "Наредна", + "no_more_results": "Број странице %{page} је ван опсега. Покушајте претходну страницу.", + "no_results": "Није пронађен ниједан резултат", + "page_out_from_begin": "Не може да се иде испред странице 1", + "page_out_from_end": "Не може да се иде након последње странице", + "page_out_of_boundaries": "Број странице %{page} је ван опсега", + "page_range_info": "%{offsetBegin}-%{offsetEnd} од %{total}", + "page_rows_per_page": "Ставки по страници:", + "prev": "Претход", + "skip_nav": "Прескочи на садржај" + }, + "notification": { + "bad_item": "Неисправни елемент", + "canceled": "Акција је отказана", + "created": "Елемент је креиран", + "data_provider_error": "dataProvider грешка. За више детаља погледајте конзолу.", + "deleted": "Елемент је обрисан |||| %{smart_count} елемената је обрисано", + "http_error": "Грешка у комуникацији са сервером", + "i18n_error": "Не могу да се учитају преводи за наведени језик", + "item_doesnt_exist": "Елемент не постоји", + "logged_out": "Ваша сесија је завршена, молимо вас да се повежите поново.", + "new_version": "Доступна је нова верзија! Молимо вас да освежите овај прозор.", + "updated": "Елемент је ажуриран |||| %{smart_count} елемената је ажурирано" + }, + "toggleFieldsMenu": { + "columnsToDisplay": "Колоне за приказ", + "grid": "Мрежа", + "layout": "Распоред", + "table": "Табела" + } + }, + "message": { + "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_not_available": "Овај интернет прегледач не подржава десктоп обавештења, или Navidrome серверу не приступате преко https протокола", + "openIn": { + "lastfm": "Отвори у Last.fm", + "musicbrainz": "Отвори у MusicBrainz" + }, + "remove_missing_content": "Да ли сте сигурни да из базе података желите да уклоните фајлове који недостају? Ово ће трајно да уклони све референце на њих, укључујући број пуштања и рангирања.", + "remove_missing_title": "Уклони фајлове који недостају", + "shareBatchDialogTitle": "Подели 1 %{resource} |||| Подели %{smart_count} %{resource}", + "shareCopyToClipboard": "Копирај у клипборд: Ctrl+C, Ентер", + "shareDialogTitle": "Подели %{resource} ’%{name}’", + "shareFailure": "Грешка приликом копирања URL адресе %{url} у клипборд", + "shareOriginalFormat": "Подели у оригиналном формату", + "shareSuccess": "URL је копиран у клипборд: %{url}", + "songsAddedToPlaylist": "У плејлисту је додата 1 песма |||| У плејлисту је додато %{smart_count} песама", + "transcodingDisabled": "Измена конфигурације транскодирања кроз веб интерфејс је искључена из разлога безбедности. Ако желите да измените (уредите или додате) опције транскодирања, поново покрените сервер са %{config} конфигурационом опцијом.", + "transcodingEnabled": "Navidrome се тренутно извршава са %{config}, чиме је омогућено извршавање системских команди из подешавања транскодирања коришћењем веб интерфејса. Из разлога безбедности, препоручујемо да то искључите, а да омогућите само када конфигуришете опције транскодирања." + }, + "menu": { + "about": "О", + "albumList": "Албуми", + "library": "Библиотека", + "personal": { + "name": "Лична", + "options": { + "defaultView": "Подразумевани поглед", + "desktop_notifications": "Десктоп обавештења", + "gain": { + "album": "Користи Album појачање", + "none": "Искључено", + "track": "Користи Track појачање" + }, + "language": "Језик", + "lastfmNotConfigured": "Није подешен Last.fm API-кључ", + "lastfmScrobbling": "Скроблуј на Last.fm", + "listenBrainzScrobbling": "Скроблуј на ListenBrainz", + "preAmp": "ReplayGain претпојачање (dB)", + "replaygain": "ReplayGain режим", + "theme": "Тема" + } + }, + "playlists": "Плејлисте", + "settings": "Подешавања", + "sharedPlaylists": "Дељене плејлисте", + "theme": "Тема", + "version": "Верзија" + }, + "player": { + "clickToDeleteText": "Кликните да обришете %{name}", + "clickToPauseText": "Кликни за паузирање", + "clickToPlayText": "Кликни за пуштање", + "closeText": "Затвори", + "destroyText": "Уништи", + "downloadText": "Преузми", + "emptyLyricText": "Нема стихова", + "nextTrackText": "Наредна нумера", + "notContentText": "Нема музике", + "openText": "Отвори", + "playListsText": "Ред за пуштање", + "playModeText": { + "order": "По редоследу", + "orderLoop": "Понови", + "shufflePlay": "Измешај", + "singleLoop": "Понови једну" + }, + "previousTrackText": "Претходна нумера", + "reloadText": "Поново учитај", + "removeAudioListsText": "Обриши аудио листе", + "toggleLyricText": "Укљ./Искљ. стихове", + "toggleMiniModeText": "Умањи", + "volumeText": "Јачина" + }, + "about": { + "links": { + "featureRequests": "Захтеви за функцијама", + "homepage": "Почетна страница", + "insights": { + "disabled": "Искључено", + "waiting": "Чека се" + }, + "lastInsightsCollection": "Последња колекција увида", + "source": "Изворни кôд" + } + }, + "activity": { + "fullScan": "Комплетно скенирање", + "quickScan": "Брзо скенирање", + "serverDown": "ВАН МРЕЖЕ", + "serverUptime": "Сервер се извршава", + "title": "Активност", + "totalScanned": "Укупан број скенираних фолдера" + }, + "help": { + "title": "Navidrome пречице", + "hotkeys": { + "current_song": "Иди на текућу песму", + "next_song": "Наредна песма", + "prev_song": "Претходна песма", + "show_help": "Прикажи ову помоћ", + "toggle_love": "Додај ову нумеру у омиљене", + "toggle_menu": "Укљ./Искљ. бочну траку менија", + "toggle_play": "Пусти / Паузирај", + "vol_down": "Утишај", + "vol_up": "Појачај" + } + } } diff --git a/resources/i18n/tr.json b/resources/i18n/tr.json index 8c3ac1759..cb1a0262d 100644 --- a/resources/i18n/tr.json +++ b/resources/i18n/tr.json @@ -33,7 +33,8 @@ "tags": "Ek Etiketler", "mappedTags": "Eşlenen etiketler", "rawTags": "Ham etiketler", - "bitDepth": "Bit derinliği" + "bitDepth": "Bit derinliği", + "sampleRate": "Örnekleme Oranı" }, "actions": { "addToQueue": "Oynatma Sırasına Ekle", diff --git a/resources/i18n/zh-Hans.json b/resources/i18n/zh-Hans.json index d0c8c5983..c447f7d72 100644 --- a/resources/i18n/zh-Hans.json +++ b/resources/i18n/zh-Hans.json @@ -12,12 +12,14 @@ "artist": "歌手", "album": "专辑", "path": "文件路径", - "genre": "类型", + "genre": "流派", "compilation": "合辑", "year": "发行年份", "size": "文件大小", "updatedAt": "更新于", "bitRate": "比特率", + "bitDepth": "比特深度", + "channels": "声道", "discSubtitle": "字幕", "starred": "收藏", "comment": "注释", @@ -25,8 +27,13 @@ "quality": "品质", "bpm": "BPM", "playDate": "最后一次播放", - "channels": "声道", - "createdAt": "创建于" + "createdAt": "创建于", + "grouping": "分组", + "mood": "情绪", + "participants": "其他参与人员", + "tags": "附加标签", + "mappedTags": "映射标签", + "rawTags": "原始标签" }, "actions": { "addToQueue": "加入播放列表", @@ -46,29 +53,36 @@ "duration": "时长", "songCount": "歌曲数量", "playCount": "播放次数", + "size": "文件大小", "name": "名称", - "genre": "类型", + "genre": "流派", "compilation": "合辑", "year": "发行年份", + "date": "录制日期", + "originalDate": "原始日期", + "releaseDate": "发⾏日期", + "releases": "发⾏", + "released": "已发⾏", "updatedAt": "更新于", "comment": "注释", "rating": "评分", "createdAt": "创建于", - "size": "文件大小", - "originalDate": "原始日期", - "releaseDate": "发⾏日期", - "releases": "发⾏", - "released": "已发⾏" + "recordLabel": "厂牌", + "catalogNum": "目录编号", + "releaseType": "发行类型", + "grouping": "分组", + "media": "媒体类型", + "mood": "情绪" }, "actions": { "playAll": "立即播放", "playNext": "下首播放", "addToQueue": "加入播放列表", + "share": "分享", "shuffle": "随机播放", "addToPlaylist": "加入歌单", "download": "下载", - "info": "查看信息", - "share": "分享" + "info": "查看信息" }, "lists": { "all": "所有", @@ -86,10 +100,26 @@ "name": "名称", "albumCount": "专辑数", "songCount": "歌曲数", + "size": "文件大小", "playCount": "播放次数", "rating": "评分", - "genre": "类型", - "size": "文件大小" + "genre": "流派", + "role": "参与角色" + }, + "roles": { + "albumartist": "专辑歌手", + "artist": "歌手", + "composer": "作曲", + "conductor": "指挥", + "lyricist": "作词", + "arranger": "编曲", + "producer": "制作人", + "director": "总监", + "engineer": "工程师", + "mixer": "混音师", + "remixer": "重混师", + "djmixer": "DJ混音师", + "performer": "演奏家" } }, "user": { @@ -98,6 +128,7 @@ "userName": "用户名", "isAdmin": "是否管理员", "lastLoginAt": "上次登录", + "lastAccessAt": "上次访问", "updatedAt": "更新于", "name": "名称", "password": "密码", @@ -108,7 +139,7 @@ "token": "令牌" }, "helperTexts": { - "name": "你名字的更改将在下次登录生效" + "name": "名称的更改将在下次登录时生效" }, "notifications": { "created": "用户已创建", @@ -187,6 +218,7 @@ "username": "分享者", "url": "链接", "description": "描述", + "downloadable": "是否允许下载?", "contents": "目录", "expiresAt": "过期于", "lastVisitedAt": "上次访问于", @@ -194,8 +226,24 @@ "format": "格式", "maxBitRate": "最大比特率", "updatedAt": "更新于", - "createdAt": "创建于", - "downloadable": "是否允许下载" + "createdAt": "创建于" + }, + "notifications": {}, + "actions": {} + }, + "missing": { + "name": "丢失文件", + "empty": "无丢失文件", + "fields": { + "path": "路径", + "size": "文件大小", + "updatedAt": "丢失于" + }, + "actions": { + "remove": "移除" + }, + "notifications": { + "removed": "丢失文件已移除" } } }, @@ -211,7 +259,8 @@ "password": "密码", "sign_in": "登录", "sign_in_error": "验证失败,请重试", - "logout": "注销" + "logout": "注销", + "insightsCollectionNote": "Navidrome 会收集匿名使用数据以协助改进项目。\n点击[此处]了解详情或选择退出。" }, "validation": { "invalidChars": "请使用字母和数字", @@ -233,6 +282,7 @@ "add": "添加", "back": "返回", "bulk_actions": "选中 %{smart_count} 项", + "bulk_actions_mobile": "%{smart_count}", "cancel": "取消", "clear_input_value": "清除", "clone": "复制", @@ -256,7 +306,6 @@ "close_menu": "关闭菜单", "unselect": "未选择", "skip": "跳过", - "bulk_actions_mobile": "%{smart_count}", "share": "分享", "download": "下载" }, @@ -351,29 +400,31 @@ "noPlaylistsAvailable": "没有有效的歌单", "delete_user_title": "删除用户 %{name}", "delete_user_content": "您确定要删除该用户及其相关数据(包括歌单和用户配置)吗?", + "remove_missing_title": "移除丢失文件", + "remove_missing_content": "您确定要将选中的丢失文件从数据库中永久移除吗?此操作将删除所有相关信息,包括播放次数和评分。", "notifications_blocked": "您已在浏览器的设置中屏蔽了此网站的通知", "notifications_not_available": "此浏览器不支持桌面通知", "lastfmLinkSuccess": "Last.fm 已关联并启用喜好记录", "lastfmLinkFailure": "Last.fm 无法关联", "lastfmUnlinkSuccess": "已成功解除与 Last.fm 的链接,且喜好记录已禁用", "lastfmUnlinkFailure": "Last.fm 无法取消关联", + "listenBrainzLinkSuccess": "ListenBrainz 已关联并启用喜好记录", + "listenBrainzLinkFailure": "ListenBrainz 无法关联:%{error}", + "listenBrainzUnlinkSuccess": "已成功解除与 ListenBrainz 的链接,且喜好记录已禁用", + "listenBrainzUnlinkFailure": "ListenBrainz 无法取消关联", "openIn": { "lastfm": "在 Last.fm 中打开", "musicbrainz": "在 MusicBrainz 中打开" }, "lastfmLink": "查看更多…", - "listenBrainzLinkSuccess": "ListenBrainz 已关联并启用喜好记录", - "listenBrainzLinkFailure": "ListenBrainz 无法关联:%{error}", - "listenBrainzUnlinkSuccess": "已成功解除与 ListenBrainz 的链接,且喜好记录已禁用", - "listenBrainzUnlinkFailure": "ListenBrainz 无法取消关联", - "downloadOriginalFormat": "下载原始格式", "shareOriginalFormat": "分享原始格式", "shareDialogTitle": "分享 %{resource} '%{name}'", "shareBatchDialogTitle": "分享 %{smart_count} 个 %{resource}", + "shareCopyToClipboard": "复制到剪切板: Ctrl+C, Enter", "shareSuccess": "分享链接已复制: %{url}", "shareFailure": "分享链接复制失败: %{url}", "downloadDialogTitle": "下载 %{resource} '%{name}' (%{size})", - "shareCopyToClipboard": "复制到剪切板: Ctrl+C, Enter" + "downloadOriginalFormat": "下载原始格式" }, "menu": { "library": "曲库", @@ -387,6 +438,7 @@ "language": "语言", "defaultView": "默认界面", "desktop_notifications": "桌面通知", + "lastfmNotConfigured": "没有配置 Last.fm 的 API-Key", "lastfmScrobbling": "启用 Last.fm 的喜好记录", "listenBrainzScrobbling": "启用 ListenBrainz 的喜好记录", "replaygain": "回放增益", @@ -399,9 +451,9 @@ } }, "albumList": "专辑", - "about": "关于", "playlists": "歌单", - "sharedPlaylists": "共享的歌单" + "sharedPlaylists": "共享的歌单", + "about": "关于" }, "player": { "playListsText": "播放列表", @@ -432,7 +484,12 @@ "links": { "homepage": "主页", "source": "源代码", - "featureRequests": "功能需求" + "featureRequests": "功能需求", + "lastInsightsCollection": " 最近的分析收集", + "insights": { + "disabled": "禁用", + "waiting": "等待" + } } }, "activity": { @@ -451,10 +508,10 @@ "toggle_play": "播放/暂停", "prev_song": "上一首歌", "next_song": "下一首歌", + "current_song": "转到当前播放", "vol_up": "增大音量", "vol_down": "减小音量", - "toggle_love": "添加/移除星标", - "current_song": "转到当前播放" + "toggle_love": "添加/移除星标" } } } \ No newline at end of file diff --git a/ui/src/album/AlbumSongs.jsx b/ui/src/album/AlbumSongs.jsx index bfb1a4d6a..d705617e1 100644 --- a/ui/src/album/AlbumSongs.jsx +++ b/ui/src/album/AlbumSongs.jsx @@ -185,7 +185,6 @@ const AlbumSongs = (props) => { {...props} hasBulkActions={true} showDiscSubtitles={true} - showReleaseDivider={true} contextAlwaysVisible={!isDesktop} classes={{ row: classes.row }} > diff --git a/ui/src/common/ContextMenus.jsx b/ui/src/common/ContextMenus.jsx index 855825496..47c9c6786 100644 --- a/ui/src/common/ContextMenus.jsx +++ b/ui/src/common/ContextMenus.jsx @@ -231,7 +231,6 @@ export const AlbumContextMenu = (props) => sort: { field: 'album', order: 'ASC' }, filter: { album_id: props.record.id, - release_date: props.releaseDate, disc_number: props.discNumber, missing: false, }, diff --git a/ui/src/common/PlayButton.jsx b/ui/src/common/PlayButton.jsx index 04b36ef5b..d8717236f 100644 --- a/ui/src/common/PlayButton.jsx +++ b/ui/src/common/PlayButton.jsx @@ -24,7 +24,6 @@ export const PlayButton = ({ record, size, className }) => { sort: { field: 'album', order: 'ASC' }, filter: { album_id: record.id, - release_date: record.releaseDate, disc_number: record.discNumber, }, }) diff --git a/ui/src/common/SongDatagrid.jsx b/ui/src/common/SongDatagrid.jsx index 78f580e67..3586cf225 100644 --- a/ui/src/common/SongDatagrid.jsx +++ b/ui/src/common/SongDatagrid.jsx @@ -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 ( - - - - {releaseTitle.join(' ')} - - - - - - - ) - }, -) - -ReleaseRow.displayName = 'ReleaseRow' - const DiscSubtitleRow = forwardRef( ({ record, onClick, colSpan, contextAlwaysVisible }, ref) => { const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md')) const classes = useStyles({ isDesktop }) - const handlePlaySubset = (releaseDate, discNumber) => () => { - onClick(releaseDate, discNumber) + const handlePlaySubset = (discNumber) => () => { + onClick(discNumber) } let subtitle = [] @@ -126,7 +79,7 @@ const DiscSubtitleRow = forwardRef( @@ -139,7 +92,6 @@ const DiscSubtitleRow = forwardRef( - {firstTracksOfReleases.has(record.id) && ( - - )} {firstTracksOfDiscs.has(record.id) && ( { const dispatch = useDispatch() const { ids, data } = rest const playSubset = useCallback( - (releaseDate, discNumber) => { + (discNumber) => { let idsToPlay = [] if (discNumber !== undefined) { - idsToPlay = ids.filter( - (id) => - data[id].releaseDate === releaseDate && - data[id].discNumber === discNumber, - ) - } else { - idsToPlay = ids.filter((id) => data[id].releaseDate === releaseDate) + idsToPlay = ids.filter((id) => data[id].discNumber === discNumber) } dispatch( playTracks( @@ -297,8 +230,7 @@ const SongDatagridBody = ({ foundSubtitle = foundSubtitle || data[id].discSubtitle if ( acc.length === 0 || - (last && data[id].discNumber !== data[last].discNumber) || - (last && data[id].releaseDate !== data[last].releaseDate) + (last && data[id].discNumber !== data[last].discNumber) ) { acc.push(id) } @@ -311,37 +243,12 @@ const SongDatagridBody = ({ return set }, [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 ( @@ -353,7 +260,6 @@ const SongDatagridBody = ({ export const SongDatagrid = ({ contextAlwaysVisible, showDiscSubtitles, - showReleaseDivider, ...rest }) => { const classes = useStyles() @@ -366,7 +272,6 @@ export const SongDatagrid = ({ } /> @@ -376,6 +281,5 @@ export const SongDatagrid = ({ SongDatagrid.propTypes = { contextAlwaysVisible: PropTypes.bool, showDiscSubtitles: PropTypes.bool, - showReleaseDivider: PropTypes.bool, classes: PropTypes.object, }