ab8a58157a
* feat: add shared ImageUploadService for entity image management * feat: add UploadedImage field and methods to Artist model * feat: add uploaded_image column to artist table * feat: add ArtistImageFolder config option * refactor: wire ImageUploadService and delegate playlist file ops to it Wire ImageUploadService into the DI container and refactor the playlist service to delegate image file operations (SetImage/RemoveImage) to the shared ImageUploadService, removing duplicated file I/O logic. A local ImageUploadService interface is defined in core/playlists to avoid an import cycle between core and core/playlists. * feat: artist artwork reader checks uploaded image first * feat: add image-folder priority source for artist artwork * feat: cache key invalidation for image-folder and uploaded images * refactor: extract shared image upload HTTP helpers * feat: add artist image upload/delete API endpoints * refactor: playlist handlers use shared image upload helpers * feat: add shared ImageUploadOverlay component * feat: add i18n keys for artist image upload * feat: add image upload overlay to artist detail pages * refactor: playlist details uses shared ImageUploadOverlay component * fix: add gosec nolint directive for ParseMultipartForm * refactor: deduplicate image upload code and optimize dir scanning - Remove dead ImageFilename methods from Artist and Playlist models (production code uses core.imageFilename exclusively) - Extract shared uploadedImagePath helper in model/image.go - Extract findImageInArtistFolder to deduplicate dir-scanning logic between fromArtistImageFolder and getArtistImageFolderModTime - Fix fileInputRef in useCallback dependency array * fix: include artist UpdatedAt in artwork cache key Without this, uploading or deleting an artist image would not invalidate the cached artwork because the cache key was only based on album folder timestamps, not the artist's own UpdatedAt field. * feat: add Portuguese translations for artist image upload * refactor: use shared i18n keys for cover art upload messages Move cover art upload/remove translations from per-entity sections (artist, playlist) to a shared top-level "message" section, avoiding duplication across entity types and translation files. * refactor: move cover art i18n keys to shared message section for all languages * refactor: simplify image upload code and eliminate redundancies Extracted duplicate image loading/lightbox state logic from DesktopArtistDetails and MobileArtistDetails into a shared useArtistImageState hook. Moved entity type constants to the consts package and replaced raw string literals throughout model, core, and nativeapi packages. Exported model.UploadedImagePath and reused it in core/image_upload.go to consolidate path construction. Cached the ArtistImageFolder lookup result in artistReader to eliminate a redundant os.ReadDir call on every artwork request. Signed-off-by: Deluan <deluan@navidrome.org> * style: fix prettier formatting in ImageUploadOverlay * fix: address code review feedback on image upload error handling - RemoveImage now returns errors instead of swallowing them - Artist handlers distinguish not-found from other DB errors - Defer multipart temp file cleanup after parsing * fix: enforce hard request size limit with MaxBytesReader for image uploads Signed-off-by: Deluan <deluan@navidrome.org> --------- Signed-off-by: Deluan <deluan@navidrome.org>
716 lines
27 KiB
JSON
716 lines
27 KiB
JSON
{
|
||
"languageName": "Svenska",
|
||
"resources": {
|
||
"song": {
|
||
"name": "LÄt |||| LÄtar",
|
||
"fields": {
|
||
"albumArtist": "Albumartist",
|
||
"duration": "LĂ€ngd",
|
||
"trackNumber": "#",
|
||
"playCount": "Spelningar",
|
||
"title": "Titel",
|
||
"artist": "Artist",
|
||
"album": "Album",
|
||
"path": "SökvÀg",
|
||
"genre": "Genre",
|
||
"compilation": "Samling",
|
||
"year": "Ă
r",
|
||
"size": "Filstorlek",
|
||
"updatedAt": "Uppdaterad",
|
||
"bitRate": "Bitrate",
|
||
"discSubtitle": "Underrubrik",
|
||
"starred": "Favorit",
|
||
"comment": "Kommentar",
|
||
"rating": "Betyg",
|
||
"quality": "Kvalitet",
|
||
"bpm": "BPM",
|
||
"playDate": "Senast spelad",
|
||
"channels": "Channels",
|
||
"createdAt": "Skapad",
|
||
"grouping": "Gruppering",
|
||
"mood": "StÀmning",
|
||
"participants": "Ytterligare medverkande",
|
||
"tags": "Ytterligare taggar",
|
||
"mappedTags": "Mappade taggar",
|
||
"rawTags": "Omodifierade taggar",
|
||
"bitDepth": "Bitdjup",
|
||
"sampleRate": "Samplingsfrekvens",
|
||
"missing": "Saknade",
|
||
"libraryName": "Bibliotek",
|
||
"composer": "Kompositör",
|
||
"disc": ""
|
||
},
|
||
"actions": {
|
||
"addToQueue": "LÀgg till i kön",
|
||
"playNow": "Spela nu",
|
||
"addToPlaylist": "LĂ€gg till i spellista",
|
||
"shuffleAll": "Shuffle",
|
||
"download": "Ladda ner",
|
||
"playNext": "Spela nÀsta",
|
||
"info": "Mer information",
|
||
"showInPlaylist": "Visa i spellista",
|
||
"instantMix": "Direktmix"
|
||
}
|
||
},
|
||
"album": {
|
||
"name": "Album |||| Album",
|
||
"fields": {
|
||
"albumArtist": "Albumartist",
|
||
"artist": "Artist",
|
||
"duration": "LĂ€ngd",
|
||
"songCount": "Antal lÄtar",
|
||
"playCount": "Spelningar",
|
||
"name": "Namn",
|
||
"genre": "Genre",
|
||
"compilation": "Samling",
|
||
"year": "Ă
r",
|
||
"updatedAt": "Uppdaterad",
|
||
"comment": "Kommentar",
|
||
"rating": "Betyg",
|
||
"createdAt": "Skapad",
|
||
"size": "Storlek",
|
||
"originalDate": "Originaldatum",
|
||
"releaseDate": "Utgivningsdatum",
|
||
"releases": "UtgÄva |||| UtgÄvor",
|
||
"released": "Utgiven",
|
||
"recordLabel": "Skivbolag",
|
||
"catalogNum": "Katalognummer",
|
||
"releaseType": "Typ",
|
||
"grouping": "Gruppering",
|
||
"media": "Media",
|
||
"mood": "StÀmning",
|
||
"date": "Inspelningsdatum",
|
||
"missing": "Saknade",
|
||
"libraryName": "Bibliotek"
|
||
},
|
||
"actions": {
|
||
"playAll": "Spela",
|
||
"playNext": "Spela hÀrnÀst",
|
||
"addToQueue": "LÀgg till i kön",
|
||
"shuffle": "Shuffle",
|
||
"addToPlaylist": "LĂ€gg till i spellista",
|
||
"download": "Ladda ner",
|
||
"info": "Mer information",
|
||
"share": "Dela"
|
||
},
|
||
"lists": {
|
||
"all": "Alla",
|
||
"random": "Blanda",
|
||
"recentlyAdded": "Senast tillagda",
|
||
"recentlyPlayed": "Senast spelade",
|
||
"mostPlayed": "Mest spelade",
|
||
"starred": "Favoriter",
|
||
"topRated": "BĂ€sta betyg"
|
||
}
|
||
},
|
||
"artist": {
|
||
"name": "Artist |||| Artister",
|
||
"fields": {
|
||
"name": "Namn",
|
||
"albumCount": "Antal album",
|
||
"songCount": "Antal lÄtar",
|
||
"playCount": "Spelningar",
|
||
"rating": "Betyg",
|
||
"genre": "Genre",
|
||
"size": "Storlek",
|
||
"role": "Roll",
|
||
"missing": "Saknade"
|
||
},
|
||
"roles": {
|
||
"albumartist": "Albumartist |||| Albumartister",
|
||
"artist": "Artist |||| Artister",
|
||
"composer": "Kompositör |||| Kompositörer",
|
||
"conductor": "Dirigent |||| Dirigenter",
|
||
"lyricist": "Textförfattare |||| Textförfattare",
|
||
"arranger": "Arrangör |||| Arrangörer",
|
||
"producer": "Producent |||| Producenter",
|
||
"director": "Inspelningsledare |||| Inspelningsledare",
|
||
"engineer": "Ljudtekniker |||| Ljudtekniker",
|
||
"mixer": "Mixare ||||Â Mixare",
|
||
"remixer": "Remixare ||||Â Remixare",
|
||
"djmixer": "DJ-mixare ||||Â DJ-mixare",
|
||
"performer": "Utövande artist |||| Utövande artister",
|
||
"maincredit": "Albumartister eller Artist |||| Albumartister eller Artister"
|
||
},
|
||
"actions": {
|
||
"shuffle": "Shuffle",
|
||
"radio": "Radio",
|
||
"topSongs": "TopplÄtar"
|
||
}
|
||
},
|
||
"user": {
|
||
"name": "AnvÀndare |||| AnvÀndare",
|
||
"fields": {
|
||
"userName": "AnvÀndarnamn",
|
||
"isAdmin": "Ăr admin",
|
||
"lastLoginAt": "Senaste inloggning",
|
||
"updatedAt": "Uppdaterad",
|
||
"name": "Namn",
|
||
"password": "Lösenord",
|
||
"createdAt": "Skapad",
|
||
"changePassword": "Byt lösenord?",
|
||
"currentPassword": "Nuvarande lösenord",
|
||
"newPassword": "Nytt lösenord",
|
||
"token": "Token",
|
||
"lastAccessAt": "Senaste Ätkomst",
|
||
"libraries": "Bibliotek"
|
||
},
|
||
"helperTexts": {
|
||
"name": "Ăndringar av ditt namn syns först vid nĂ€sta inloggning",
|
||
"libraries": "VÀlj ett bibliotek för denna anvÀndare eller lÀmna blankt för standardbibliotek"
|
||
},
|
||
"notifications": {
|
||
"created": "AnvÀndare skapad",
|
||
"updated": "AnvÀndare uppdaterad",
|
||
"deleted": "AnvÀndare borttagen"
|
||
},
|
||
"message": {
|
||
"listenBrainzToken": "Ange din ListenBrainz anvÀndar-token.",
|
||
"clickHereForToken": "Klicka hÀr för att hÀmta din token",
|
||
"selectAllLibraries": "VĂ€lj alla bibliotek",
|
||
"adminAutoLibraries": "Administratörer har automatiskt tillgÄng till alla bibliotek"
|
||
},
|
||
"validation": {
|
||
"librariesRequired": "Minst ett bibliotek mÄste vÀljas för icke-administratörer"
|
||
}
|
||
},
|
||
"player": {
|
||
"name": "Spelare |||| Spelare",
|
||
"fields": {
|
||
"name": "Namn",
|
||
"transcodingId": "Omkodning",
|
||
"maxBitRate": "Max. bitrate",
|
||
"client": "Klient",
|
||
"userName": "AnvÀndarnamn",
|
||
"lastSeen": "Senast sedd",
|
||
"reportRealPath": "Visa hela sökvÀgen",
|
||
"scrobbleEnabled": "Scrobbla till extern tjÀnst"
|
||
}
|
||
},
|
||
"transcoding": {
|
||
"name": "Omkodning |||| Omkodningar",
|
||
"fields": {
|
||
"name": "Namn",
|
||
"targetFormat": "MÄlformat",
|
||
"defaultBitRate": "Standardbitrate",
|
||
"command": "Kommando"
|
||
}
|
||
},
|
||
"playlist": {
|
||
"name": "Spellista |||| Spellistor",
|
||
"fields": {
|
||
"name": "Namn",
|
||
"duration": "LĂ€ngd",
|
||
"ownerName": "Ăgare",
|
||
"public": "Offentlig",
|
||
"updatedAt": "Uppdaterad",
|
||
"createdAt": "Skapad",
|
||
"songCount": "LÄtar",
|
||
"comment": "Kommentar",
|
||
"sync": "Auto-import",
|
||
"path": "Importera frÄn"
|
||
},
|
||
"actions": {
|
||
"selectPlaylist": "VĂ€lj en spellista:",
|
||
"addNewPlaylist": "Skapa \"%{name}\"",
|
||
"export": "Exportera",
|
||
"makePublic": "Gör offentlig",
|
||
"makePrivate": "Gör privat",
|
||
"saveQueue": "Spara kö till spellista",
|
||
"searchOrCreate": "Sök spellista eller skapa ny...",
|
||
"pressEnterToCreate": "Tryck Enter för att skapa ny spellista",
|
||
"removeFromSelection": "Ta bort frÄn urval"
|
||
},
|
||
"message": {
|
||
"duplicate_song": "LĂ€gg till dubletter",
|
||
"song_exist": "Vissa lÄtar finns redan i spellistan. Vill du lÀgga till dubbletterna eller hoppa över dem?",
|
||
"noPlaylistsFound": "Hittade inga spellistor",
|
||
"noPlaylists": "Inga spellistor tillgÀngliga"
|
||
}
|
||
},
|
||
"radio": {
|
||
"name": "Radio |||| Radior",
|
||
"fields": {
|
||
"name": "Namn",
|
||
"streamUrl": "Stream-URL",
|
||
"homePageUrl": "Hemside-URL",
|
||
"updatedAt": "Uppdaterad",
|
||
"createdAt": "Skapad"
|
||
},
|
||
"actions": {
|
||
"playNow": "Spela nu"
|
||
}
|
||
},
|
||
"share": {
|
||
"name": "Dela |||| Delningar",
|
||
"fields": {
|
||
"username": "Delad av",
|
||
"url": "URL",
|
||
"description": "Beskrivning",
|
||
"contents": "InnehÄll",
|
||
"expiresAt": "Giltig till",
|
||
"lastVisitedAt": "Senast besökt",
|
||
"visitCount": "Besök",
|
||
"format": "Format",
|
||
"maxBitRate": "Max. bitrate",
|
||
"updatedAt": "Uppdaterad",
|
||
"createdAt": "Skapad",
|
||
"downloadable": "TillÄt nedladdning?"
|
||
}
|
||
},
|
||
"missing": {
|
||
"name": "Saknad fil |||| Saknade filer",
|
||
"fields": {
|
||
"path": "SökvÀg",
|
||
"size": "Storlek",
|
||
"updatedAt": "Försvann",
|
||
"libraryName": "Bibliotek"
|
||
},
|
||
"actions": {
|
||
"remove": "Radera",
|
||
"remove_all": "Radera alla"
|
||
},
|
||
"notifications": {
|
||
"removed": "Saknade fil(er) borttagna"
|
||
},
|
||
"empty": "Inga saknade filer"
|
||
},
|
||
"library": {
|
||
"name": "Bibliotek |||| Bibliotek",
|
||
"fields": {
|
||
"name": "Namn",
|
||
"path": "SökvÀg",
|
||
"remotePath": "Ta bort sökvÀg",
|
||
"lastScanAt": "Senaste scan",
|
||
"songCount": "LÄtar",
|
||
"albumCount": "Album",
|
||
"artistCount": "Artister",
|
||
"totalSongs": "LÄtar",
|
||
"totalAlbums": "Album",
|
||
"totalArtists": "Artister",
|
||
"totalFolders": "Mappar",
|
||
"totalFiles": "Filer",
|
||
"totalMissingFiles": "Saknade filer",
|
||
"totalSize": "Sammanlagd storlek",
|
||
"totalDuration": "LĂ€ngd",
|
||
"defaultNewUsers": "Standard för nya anvÀndare",
|
||
"createdAt": "Skapad",
|
||
"updatedAt": "Uppdaterad"
|
||
},
|
||
"sections": {
|
||
"basic": "Grundinformation",
|
||
"statistics": "Statistik"
|
||
},
|
||
"actions": {
|
||
"scan": "Scanna bibliotek",
|
||
"manageUsers": "Hantera anvÀndarÄtkomst",
|
||
"viewDetails": "Se detaljer",
|
||
"quickScan": "Snabbscan",
|
||
"fullScan": "Komplett scan"
|
||
},
|
||
"notifications": {
|
||
"created": "Biblioteket har skapats",
|
||
"updated": "Biblioteket har uppdaterats",
|
||
"deleted": "Biblioteket har raderats",
|
||
"scanStarted": "Biblioteksscan startad",
|
||
"scanCompleted": "Biblioteksscan avslutad",
|
||
"quickScanStarted": "Snabbscan startad",
|
||
"fullScanStarted": "Komplett scan startad",
|
||
"scanError": "Fel vid start av scan. Se loggarna"
|
||
},
|
||
"validation": {
|
||
"nameRequired": "Biblioteksnamn krÀvs",
|
||
"pathRequired": "BibliotekssökvÀg krÀvs",
|
||
"pathNotDirectory": "BibliotekssökvÀgen mÄste vara en katalog",
|
||
"pathNotFound": "BibliotekssökvÀg hittades inte",
|
||
"pathNotAccessible": "BibliotekssökvÀg inte tillgÀnglig",
|
||
"pathInvalid": "Ogiltig bibliotekssökvÀg"
|
||
},
|
||
"messages": {
|
||
"deleteConfirm": "Ăr du sĂ€ker pĂ„ att du vill ta bort detta bibliotek? Detta raderar all förbunden data och anvĂ€ndartillgĂ„ng.",
|
||
"scanInProgress": "Scanning pÄgÄr...",
|
||
"noLibrariesAssigned": "Inga bibliotek har tilldelats den hÀr anvÀndaren"
|
||
}
|
||
},
|
||
"plugin": {
|
||
"name": "TillÀgg |||| TillÀgg",
|
||
"fields": {
|
||
"id": "ID",
|
||
"name": "Namn",
|
||
"description": "Beskrivning",
|
||
"version": "Version",
|
||
"author": "Författare",
|
||
"website": "Website",
|
||
"permissions": "Behörigheter",
|
||
"enabled": "Aktiverad",
|
||
"status": "Status",
|
||
"path": "SökvÀg",
|
||
"lastError": "Fel",
|
||
"hasError": "Fel",
|
||
"updatedAt": "Uppdaterad",
|
||
"createdAt": "Installerad",
|
||
"configKey": "Nyckel",
|
||
"configValue": "VĂ€rde",
|
||
"allUsers": "TillÄt alla anvÀndare",
|
||
"selectedUsers": "Valda anvÀndare",
|
||
"allLibraries": "TillÄt alla bibliotek",
|
||
"selectedLibraries": "Valda bibliotek",
|
||
"allowWriteAccess": ""
|
||
},
|
||
"sections": {
|
||
"status": "Status",
|
||
"info": "TillÀggsinformation",
|
||
"configuration": "Konfiguration",
|
||
"manifest": "Manifest",
|
||
"usersPermission": "AnvÀndarbehörigheter",
|
||
"libraryPermission": "Biblioteksbehörigheter"
|
||
},
|
||
"status": {
|
||
"enabled": "Aktiverad",
|
||
"disabled": "Inaktiverad"
|
||
},
|
||
"actions": {
|
||
"enable": "Aktivera",
|
||
"disable": "Inaktivera",
|
||
"disabledDueToError": "Ă
tgÀrda felet innan aktivering",
|
||
"disabledUsersRequired": "VÀlj anvÀndare före aktivering",
|
||
"disabledLibrariesRequired": "VÀlj bibliotek före aktivering",
|
||
"addConfig": "LĂ€gg till konfiguration",
|
||
"rescan": "Scanna om"
|
||
},
|
||
"notifications": {
|
||
"enabled": "TillÀgg aktiverat",
|
||
"disabled": "TillÀgg inaktiverat",
|
||
"updated": "TillÀgg uppdaterat",
|
||
"error": "Fel vid uppdatering av tillÀgg"
|
||
},
|
||
"validation": {
|
||
"invalidJson": "Konfigurationen mÄste vara giltig JSON"
|
||
},
|
||
"messages": {
|
||
"configHelp": "Konfigurera tillĂ€gget med nyckelâvĂ€rde-par. LĂ€mna tomt om tillĂ€gget inte krĂ€ver nĂ„gon konfiguration.",
|
||
"clickPermissions": "Klicka pÄ en behörighet för mer information",
|
||
"noConfig": "Ingen konfiguration angiven",
|
||
"allUsersHelp": "NÀr den Àr aktiverad fÄr tillÀgget tillgÄng till alla anvÀndare, inklusive de som skapas i framtiden.",
|
||
"noUsers": "Inga anvÀndare valda",
|
||
"permissionReason": "Orsak",
|
||
"usersRequired": "Detta tillÀgg krÀver Ätkomst till anvÀndarinformation. VÀlj vilka anvÀndare insticksprogrammet ska ha Ätkomst till, eller aktivera 'TillÄt alla anvÀndare'.",
|
||
"allLibrariesHelp": "NÀr den Àr aktiverad fÄr tillÀgget tillgÄng till alla bibliotek, inklusive de som skapas i framtiden.",
|
||
"noLibraries": "Inga bibliotek valda",
|
||
"librariesRequired": "Detta tillÀgg krÀver tillgÄng till biblioteksinformation. VÀlj vilka bibliotek tillÀgget kan komma Ät eller aktivera 'TillÄt alla bibliotek'.",
|
||
"requiredHosts": "KrÀvda vÀrdar",
|
||
"configValidationError": "Validering av konfigurationen misslyckades:",
|
||
"schemaRenderError": "Kunde inte rendera konfigurationsformulÀret. TillÀggets schema kan vara ogiltigt.",
|
||
"allowWriteAccessHelp": ""
|
||
},
|
||
"placeholders": {
|
||
"configKey": "nyckel",
|
||
"configValue": "vÀrde"
|
||
}
|
||
}
|
||
},
|
||
"ra": {
|
||
"auth": {
|
||
"welcome1": "Tack för att du installerade Navidrome!",
|
||
"welcome2": "Skapa först ett admin-konto",
|
||
"confirmPassword": "BekrÀfta lösenord",
|
||
"buttonCreateAdmin": "Skapa admin-konto",
|
||
"auth_check_error": "Logga in för att fortsÀtta",
|
||
"user_menu": "Profil",
|
||
"username": "AnvÀndarnamn",
|
||
"password": "Lösenord",
|
||
"sign_in": "Logga in",
|
||
"sign_in_error": "Felaktig inloggning, försök igen",
|
||
"logout": "Logga ut",
|
||
"insightsCollectionNote": "Navidrome samlar anonym anvÀndardata för att\nhjÀlpa projektet att bli bÀttre. Klicka [hÀr]\nför att lÀsa mer och avaktivera om du vill"
|
||
},
|
||
"validation": {
|
||
"invalidChars": "AnvÀnd enbart bokstÀver och siffror",
|
||
"passwordDoesNotMatch": "Lösenordet matchar inte",
|
||
"required": "KrÀvs",
|
||
"minLength": "MÄste ha minst %{min} tecken",
|
||
"maxLength": "FÄr maximalt ha %{max} tecken",
|
||
"minValue": "MÄste vara minst %{min}",
|
||
"maxValue": "FÄr maximalt vara %{max}",
|
||
"number": "MÄste vara ett nummer",
|
||
"email": "MÄste vara en giltig e-postadress",
|
||
"oneOf": "MÄste vara en av: %{options}",
|
||
"regex": "MÄste matcha ett specifikt format (regexp): %{pattern}",
|
||
"unique": "MÄste vara unik",
|
||
"url": "MÄste vara en giltig URL"
|
||
},
|
||
"action": {
|
||
"add_filter": "LĂ€gg till filter",
|
||
"add": "LĂ€gg till",
|
||
"back": "Tillbaka",
|
||
"bulk_actions": "1 objekt vald |||| %{smart_count} objekt valda",
|
||
"cancel": "Avbryt",
|
||
"clear_input_value": "Rensa",
|
||
"clone": "Klona",
|
||
"confirm": "BekrÀfta",
|
||
"create": "Skapa",
|
||
"delete": "Ta bort",
|
||
"edit": "Redigera",
|
||
"export": "Exportera",
|
||
"list": "Lista",
|
||
"refresh": "Uppdatera",
|
||
"remove_filter": "Ta bort filter",
|
||
"remove": "Radera",
|
||
"save": "Spara",
|
||
"search": "Sök",
|
||
"show": "Visa",
|
||
"sort": "Sortera",
|
||
"undo": "Ă
ngra",
|
||
"expand": "Expandera",
|
||
"close": "StÀng",
|
||
"open_menu": "Ăppna meny",
|
||
"close_menu": "StÀng meny",
|
||
"unselect": "Avmarkera",
|
||
"skip": "Hoppa över",
|
||
"bulk_actions_mobile": "1 |||| %{smart_count}",
|
||
"share": "Dela",
|
||
"download": "Ladda ner"
|
||
},
|
||
"boolean": {
|
||
"true": "Ja",
|
||
"false": "Nej"
|
||
},
|
||
"page": {
|
||
"create": "Skapa %{name}",
|
||
"dashboard": "Dashboard",
|
||
"edit": "%{name} #%{id}",
|
||
"error": "Ett fel uppstod",
|
||
"list": "%{name}",
|
||
"loading": "Laddar",
|
||
"not_found": "Hittade inget",
|
||
"show": "%{name} #%{id}",
|
||
"empty": "Ingen %{name} Ànnu.",
|
||
"invite": "Vill du lÀgga till en?"
|
||
},
|
||
"input": {
|
||
"file": {
|
||
"upload_several": "Dra och slÀpp filer som ska laddas upp eller klicka för att vÀlja dem.",
|
||
"upload_single": "Dra och slÀpp en fil som ska laddas upp eller klicka för att vÀlja en fil."
|
||
},
|
||
"image": {
|
||
"upload_several": "Dra och slÀpp bilder som ska laddas upp eller klicka för att vÀlja dem.",
|
||
"upload_single": "Dra och slÀpp en bild som ska laddas upp eller klicka för att vÀlja en bild."
|
||
},
|
||
"references": {
|
||
"all_missing": "Hittade ingen referensdata.",
|
||
"many_missing": "Minst en av de associerade referenserna verkar inte lÀngre vara tillgÀnglig.",
|
||
"single_missing": "Associerade referenser verkar inte lÀngre vara tillgÀngliga."
|
||
},
|
||
"password": {
|
||
"toggle_visible": "Dölj password",
|
||
"toggle_hidden": "Visa password"
|
||
}
|
||
},
|
||
"message": {
|
||
"about": "Om",
|
||
"are_you_sure": "Ăr du sĂ€ker?",
|
||
"bulk_delete_content": "Vill du verkligen ta bort %{name}? |||| Vill du verkligen ta bort dessa %{smart_count} objekt?",
|
||
"bulk_delete_title": "Ta bort %{name} |||| Ta bort %{smart_count} %{name}",
|
||
"delete_content": "Vill du verkligen ta bort detta innehÄll?",
|
||
"delete_title": "Ta bort %{name} #%{id}",
|
||
"details": "Detaljer",
|
||
"error": "Ett klientfel uppstod och begÀran kunde inte slutföras.",
|
||
"invalid_form": "FormulÀret Àr ogiltigt. Kontrollera eventuella fel",
|
||
"loading": "Sidan lÀses in, var god vÀnta",
|
||
"no": "Nej",
|
||
"not_found": "Antingen skrev du fel URL eller sÄ följde du en ogiltig lÀnk.",
|
||
"yes": "Ja",
|
||
"unsaved_changes": "Du har osparade Àndringar. Ignorera dem?"
|
||
},
|
||
"navigation": {
|
||
"no_results": "Inga resultat hittades",
|
||
"no_more_results": "Sidnumret %{page} finns inte. GÄ tillbaka till föregÄende sida.",
|
||
"page_out_of_boundaries": "Sidnumret %{page} finns inte",
|
||
"page_out_from_end": "Det finns inga fler sidor",
|
||
"page_out_from_begin": "Det finns ingen sida före sida 1",
|
||
"page_range_info": "%{offsetBegin}-%{offsetEnd} av %{total}",
|
||
"page_rows_per_page": "Antal per sida:",
|
||
"next": "NĂ€sta",
|
||
"prev": "FöregÄende",
|
||
"skip_nav": "Hoppa till innehÄll"
|
||
},
|
||
"notification": {
|
||
"updated": "Element uppdaterat |||| %{smart_count} element uppdaterade",
|
||
"created": "Element skapat",
|
||
"deleted": "Element borttaget |||| %{smart_count} element borttagna",
|
||
"bad_item": "Felaktigt element",
|
||
"item_doesnt_exist": "Element finns inte",
|
||
"http_error": "Kommunikationsfel med servern",
|
||
"data_provider_error": "Fel i dataProvider. Kontrollera din konsol för mer information.",
|
||
"i18n_error": "Kunde inte lÀsa in översÀttningen av det valda sprÄket",
|
||
"canceled": "Ă
tgÀrden avbröts",
|
||
"logged_out": "Sessionen har avslutats, anslut pÄ nytt.",
|
||
"new_version": "Det finns en ny version! Uppdatera detta fönster."
|
||
},
|
||
"toggleFieldsMenu": {
|
||
"columnsToDisplay": "Kolumner att visa",
|
||
"layout": "Layout",
|
||
"grid": "RutnÀt",
|
||
"table": "Tabell"
|
||
}
|
||
},
|
||
"message": {
|
||
"note": "OBSERVERA",
|
||
"transcodingDisabled": "InstÀllning för kodning via webbgrÀnssnittet Àr av sÀkerhetsskÀl ej aktiverat. Starta om servern med alternativet %{config} markerat om du vill göra Àndringar (redigera eller lÀgga till).",
|
||
"transcodingEnabled": "Navidrome körs för nÀrvarande med %{config}, vilket gör att systemkommandon kan köras frÄn webbplattformen. Du rekommenderas av sÀkerhetsskÀl att du stÀnger av den och bara slÄr pÄ den nÀr du stÀller in omkodning.",
|
||
"songsAddedToPlaylist": "La till en lÄt i spellistan |||| La till %{smart_count} lÄtar i spellistan",
|
||
"noPlaylistsAvailable": "Ingen tillgÀnglig",
|
||
"delete_user_title": "Ta bort anvÀndare '%{name}'",
|
||
"delete_user_content": "Ăr du sĂ€ker pĂ„ att du vill ta bort denna anvĂ€ndare (inklusive spellistor och instĂ€llningar)?",
|
||
"notifications_blocked": "Du har blockerat meddelanden frÄn denna sajt in din webblÀsares instÀllningar",
|
||
"notifications_not_available": "Denna webblÀsare stödjer inte skrivbordsmeddelanden eller du anvÀnder inte Navidrome via https",
|
||
"lastfmLinkSuccess": "Last.fm Àr lÀnkat och scrobbling Àr aktivt",
|
||
"lastfmLinkFailure": "Last.fm kunde inte lÀnkas",
|
||
"lastfmUnlinkSuccess": "Last.fm Àr inte lÀngre lÀnkat och scrobbling Àr deaktiverat",
|
||
"lastfmUnlinkFailure": "Last.fm kunde inte avlÀnkas",
|
||
"openIn": {
|
||
"lastfm": "Ăppna i Last.fm",
|
||
"musicbrainz": "Ăppna i MusicBrainz"
|
||
},
|
||
"lastfmLink": "LĂ€s mer...",
|
||
"listenBrainzLinkSuccess": "ListenBrainz Àr lÀnkat och scrobbling Àr aktivt som anvÀndare: %{user}",
|
||
"listenBrainzLinkFailure": "ListenBrainz kunde inte lÀnkas: %{error}",
|
||
"listenBrainzUnlinkSuccess": "ListenBrainz Àr inte lÀngre lÀnkat och scrobbling Àr deaktiverat",
|
||
"listenBrainzUnlinkFailure": "ListenBrainz kunde inte avlÀnkas",
|
||
"downloadOriginalFormat": "Ladda ner i originalformat",
|
||
"shareOriginalFormat": "Dela i originalformat",
|
||
"shareDialogTitle": "Dela %{resource} '%{name}'",
|
||
"shareBatchDialogTitle": "Dela en %{resource} |||| Dela %{smart_count} %{resource}",
|
||
"shareSuccess": "URL kopierades till urklipp: %{url}",
|
||
"shareFailure": "Fel vid kopiering av URL %{url} till urklipp",
|
||
"downloadDialogTitle": "Ladda ner %{resource} '%{name}' (%{size})",
|
||
"shareCopyToClipboard": "Kopiera till urklipp: Ctrl+C, Enter",
|
||
"remove_missing_title": "Ta bort saknade filer",
|
||
"remove_missing_content": "Ăr du sĂ€ker pĂ„ att du vill ta bort de valda saknade filerna frĂ„n databasen? Detta kommer permanent radera alla referenser till dem, inklusive antal spelningar och betyg.",
|
||
"remove_all_missing_title": "Ta bort alla saknade filer",
|
||
"remove_all_missing_content": "Ăr du sĂ€ker pĂ„ att du vill ta bort alla saknade filer frĂ„n databasen? Detta kommer permanent radera alla referenser till dem, inklusive antal spelningar och betyg.",
|
||
"noSimilarSongsFound": "Hittade inga liknande lÄtar",
|
||
"noTopSongsFound": "Hittade inga topplÄtar",
|
||
"startingInstantMix": "Laddar direktmix..."
|
||
},
|
||
"menu": {
|
||
"library": "Bibliotek",
|
||
"settings": "InstÀllningar",
|
||
"version": "Version",
|
||
"theme": "Tema",
|
||
"personal": {
|
||
"name": "Personligt",
|
||
"options": {
|
||
"theme": "Tema",
|
||
"language": "SprÄk",
|
||
"defaultView": "Standardvy",
|
||
"desktop_notifications": "Skrivbordsmeddelanden",
|
||
"lastfmScrobbling": "Scrobbla till Last.fm",
|
||
"listenBrainzScrobbling": "Scrobbla till ListenBrainz",
|
||
"replaygain": "ReplayGain-lÀge",
|
||
"preAmp": "ReplayGain PreAmp (dB)",
|
||
"gain": {
|
||
"none": "Inaktiverad",
|
||
"album": "AnvÀnd gain för album",
|
||
"track": "AnvĂ€nd gain fĂŒr lĂ„tar"
|
||
},
|
||
"lastfmNotConfigured": "Last.fm API-nyckel Àr inte konfigurerad"
|
||
}
|
||
},
|
||
"albumList": "Album",
|
||
"about": "Om",
|
||
"playlists": "Spellistor",
|
||
"sharedPlaylists": "Delade spellistor",
|
||
"librarySelector": {
|
||
"allLibraries": "Alla bibliotek (%{count})",
|
||
"multipleLibraries": "%{selected} av %{total} bibliotek",
|
||
"selectLibraries": "VĂ€lj bibliotek",
|
||
"none": "Inga"
|
||
}
|
||
},
|
||
"player": {
|
||
"playListsText": "Spela kön",
|
||
"openText": "Ăppna",
|
||
"closeText": "StÀng",
|
||
"notContentText": "Ingen musik",
|
||
"clickToPlayText": "Klicka för att spela",
|
||
"clickToPauseText": "Klicka för att pausa",
|
||
"nextTrackText": "NÀsta lÄt",
|
||
"previousTrackText": "FöregÄende lÄt",
|
||
"reloadText": "Ladda om",
|
||
"volumeText": "Volym",
|
||
"toggleLyricText": "LÄttext av/pÄ",
|
||
"toggleMiniModeText": "Minimera",
|
||
"destroyText": "Radera",
|
||
"downloadText": "Ladda ner",
|
||
"removeAudioListsText": "Ta bort audiolistor",
|
||
"clickToDeleteText": "Klicka för att ta bort %{name}",
|
||
"emptyLyricText": "Ingen lÄttext",
|
||
"playModeText": {
|
||
"order": "I ordningsföljd",
|
||
"orderLoop": "Upprepa",
|
||
"singleLoop": "Upprepa en",
|
||
"shufflePlay": "Shuffle"
|
||
}
|
||
},
|
||
"about": {
|
||
"links": {
|
||
"homepage": "Hemsida",
|
||
"source": "KĂ€llkod",
|
||
"featureRequests": "FunktionalitetförfrÄgan",
|
||
"lastInsightsCollection": "Senaste Insights-kollektion",
|
||
"insights": {
|
||
"disabled": "Inaktiverad",
|
||
"waiting": "VĂ€ntar"
|
||
}
|
||
},
|
||
"tabs": {
|
||
"about": "Om",
|
||
"config": "InstÀllningar"
|
||
},
|
||
"config": {
|
||
"configName": "InstÀllningsnamn",
|
||
"environmentVariable": "Miljövariabel",
|
||
"currentValue": "Nuvarande vÀrde",
|
||
"configurationFile": "InstÀllningsfil",
|
||
"exportToml": "Exportera instÀllningar (TOML)",
|
||
"exportSuccess": "InstÀllningarna kopierade till urklippet i TOML-format",
|
||
"exportFailed": "Kopiering av instÀllningarna misslyckades",
|
||
"devFlagsHeader": "Utvecklingsflaggor (kan Àndras eller tas bort)",
|
||
"devFlagsComment": "Dessa instÀllningar Àr experimentella och kan tas bort i framtida versioner",
|
||
"downloadToml": "Ladda ner konfiguration (TOML)"
|
||
}
|
||
},
|
||
"activity": {
|
||
"title": "Aktivitet",
|
||
"totalScanned": "Genomsökta mappar",
|
||
"quickScan": "Snabbscan",
|
||
"fullScan": "Komplett scan",
|
||
"serverUptime": "Serverdrifttid",
|
||
"serverDown": "OFFLINE",
|
||
"scanType": "Typ",
|
||
"status": "Fel vid scanning",
|
||
"elapsedTime": "Spelad tid",
|
||
"selectiveScan": "Urval"
|
||
},
|
||
"help": {
|
||
"title": "Navidrome kortkommandon",
|
||
"hotkeys": {
|
||
"show_help": "Visa denna hjÀlp",
|
||
"toggle_menu": "VĂ€xla sidomeny",
|
||
"toggle_play": "Spela / pausa",
|
||
"prev_song": "FöregÄende lÄt",
|
||
"next_song": "NÀsta lÄt",
|
||
"vol_up": "Volym upp",
|
||
"vol_down": "Volym ner",
|
||
"toggle_love": "LÀgg till lÄt i favoriter",
|
||
"current_song": "Hoppa till nuvarande lÄt"
|
||
}
|
||
},
|
||
"nowPlaying": {
|
||
"title": "Spelas nu",
|
||
"empty": "Inget spelas",
|
||
"minutesAgo": "%{smart_count} minut sedan |||| %{smart_count} minuter sedan"
|
||
}
|
||
}
|