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>
722 lines
28 KiB
JSON
722 lines
28 KiB
JSON
{
|
|
"languageName": "Deutsch",
|
|
"resources": {
|
|
"song": {
|
|
"name": "Titel |||| Titel",
|
|
"fields": {
|
|
"albumArtist": "Albuminterpret",
|
|
"duration": "Dauer",
|
|
"trackNumber": "Titel #",
|
|
"playCount": "Wiedergaben",
|
|
"title": "Titel",
|
|
"artist": "Interpret",
|
|
"album": "Album",
|
|
"path": "Dateipfad",
|
|
"genre": "Genre",
|
|
"compilation": "Kompilation",
|
|
"year": "Jahr",
|
|
"size": "Dateigröße",
|
|
"updatedAt": "Hochgeladen am",
|
|
"bitRate": "Bitrate",
|
|
"discSubtitle": "CD Untertitel",
|
|
"starred": "Favorit",
|
|
"comment": "Kommentar",
|
|
"rating": "Bewertung",
|
|
"quality": "Qualität",
|
|
"bpm": "BPM",
|
|
"playDate": "Letzte Wiedergabe",
|
|
"channels": "Spuren",
|
|
"createdAt": "Hinzugefügt",
|
|
"grouping": "Gruppierung",
|
|
"mood": "Stimmung",
|
|
"participants": "Weitere Beteiligte",
|
|
"tags": "Weitere Tags",
|
|
"mappedTags": "Gemappte Tags",
|
|
"rawTags": "Tag Rohdaten",
|
|
"bitDepth": "Bittiefe",
|
|
"sampleRate": "Samplerate",
|
|
"missing": "Fehlend",
|
|
"libraryName": "Bibliothek",
|
|
"composer": "Komponist",
|
|
"disc": ""
|
|
},
|
|
"actions": {
|
|
"addToQueue": "Später abspielen",
|
|
"playNow": "Jetzt abspielen",
|
|
"addToPlaylist": "Zu einer Wiedergabeliste hinzufügen",
|
|
"shuffleAll": "Zufallswiedergabe",
|
|
"download": "Herunterladen",
|
|
"playNext": "Als nächstes abspielen",
|
|
"info": "Mehr Informationen",
|
|
"showInPlaylist": "In Wiedergabeliste anzeigen",
|
|
"instantMix": "Sofort-Mix"
|
|
}
|
|
},
|
|
"album": {
|
|
"name": "Album |||| Alben",
|
|
"fields": {
|
|
"albumArtist": "Albuminterpret",
|
|
"artist": "Interpret",
|
|
"duration": "Dauer",
|
|
"songCount": "Titelanzahl",
|
|
"playCount": "Wiedergaben",
|
|
"name": "Name",
|
|
"genre": "Genre",
|
|
"compilation": "Kompilation",
|
|
"year": "Jahr",
|
|
"updatedAt": "Aktualisiert am",
|
|
"comment": "Kommentar",
|
|
"rating": "Bewertung",
|
|
"createdAt": "Hinzugefügt",
|
|
"size": "Größe",
|
|
"originalDate": "Ursprünglich",
|
|
"releaseDate": "Erschienen",
|
|
"releases": "Veröffentlichung |||| Veröffentlichungen",
|
|
"released": "Erschienen",
|
|
"recordLabel": "Label",
|
|
"catalogNum": "Katalognummer",
|
|
"releaseType": "Typ",
|
|
"grouping": "Gruppierung",
|
|
"media": "Medium",
|
|
"mood": "Stimmung",
|
|
"date": "Aufnahmedatum",
|
|
"missing": "Fehlend",
|
|
"libraryName": "Bibliothek"
|
|
},
|
|
"actions": {
|
|
"playAll": "Abspielen",
|
|
"playNext": "Als nächstes abspielen",
|
|
"addToQueue": "Später abspielen",
|
|
"shuffle": "Zufallswiedergabe",
|
|
"addToPlaylist": "Zu einer Wiedergabeliste hinzufügen",
|
|
"download": "Herunterladen",
|
|
"info": "Mehr Informationen",
|
|
"share": "Freigabe erstellen"
|
|
},
|
|
"lists": {
|
|
"all": "Alle",
|
|
"random": "Zufällig",
|
|
"recentlyAdded": "Kürzlich hinzugefügt",
|
|
"recentlyPlayed": "Kürzlich gespielt",
|
|
"mostPlayed": "Meist gespielt",
|
|
"starred": "Favorit",
|
|
"topRated": "Beste Bewertung"
|
|
}
|
|
},
|
|
"artist": {
|
|
"name": "Interpret |||| Interpreten",
|
|
"fields": {
|
|
"name": "Name",
|
|
"albumCount": "Albumanzahl",
|
|
"songCount": "Titelanzahl",
|
|
"playCount": "Wiedergaben",
|
|
"rating": "Bewertung",
|
|
"genre": "Genre",
|
|
"size": "Größe",
|
|
"role": "Rolle",
|
|
"missing": "Fehlend"
|
|
},
|
|
"roles": {
|
|
"albumartist": "Albuminterpret |||| Albuminterpreten",
|
|
"artist": "Interpret |||| Interpreten",
|
|
"composer": "Komponist |||| Komponisten",
|
|
"conductor": "Dirigent |||| Dirigenten",
|
|
"lyricist": "Texter |||| Texter",
|
|
"arranger": "Arrangeur |||| Arrangeure",
|
|
"producer": "Produzent |||| Produzenten",
|
|
"director": "Direktor |||| Direktoren",
|
|
"engineer": "Ingenieur |||| Ingenieure",
|
|
"mixer": "Mixer |||| Mixer",
|
|
"remixer": "Remixer |||| Remixer",
|
|
"djmixer": "DJ Mixer |||| DJ Mixer",
|
|
"performer": "ausübender Künstler |||| ausübende Künstler",
|
|
"maincredit": "Albuminterpret oder Interpret |||| Albuminterpreten oder Interpreten"
|
|
},
|
|
"actions": {
|
|
"shuffle": "Zufallswiedergabe",
|
|
"radio": "Radio",
|
|
"topSongs": "Beliebteste Titel"
|
|
}
|
|
},
|
|
"user": {
|
|
"name": "Nutzer |||| Nutzer",
|
|
"fields": {
|
|
"userName": "Nutzername",
|
|
"isAdmin": "Ist Admin",
|
|
"lastLoginAt": "Letzer Login am",
|
|
"updatedAt": "Aktualisiert am",
|
|
"name": "Name",
|
|
"password": "Passwort",
|
|
"createdAt": "Erstellt am",
|
|
"changePassword": "Passwort ändern?",
|
|
"currentPassword": "Aktuelles Passwort",
|
|
"newPassword": "Neues Passwort",
|
|
"token": "Token",
|
|
"lastAccessAt": "Letzter Zugriff am",
|
|
"libraries": "Bibliotheken"
|
|
},
|
|
"helperTexts": {
|
|
"name": "Die Änderung wird erst nach dem nächsten Login gültig",
|
|
"libraries": "Wähle spezifische Bibliotheken für diesen Benutzer, oder leer lassen für Standard Bibliotheken"
|
|
},
|
|
"notifications": {
|
|
"created": "Benutzer erstellt",
|
|
"updated": "Benutzer aktualisiert",
|
|
"deleted": "Benutzer gelöscht"
|
|
},
|
|
"message": {
|
|
"listenBrainzToken": "Gib deinen ListenBrainz Benutzer Token ein",
|
|
"clickHereForToken": "Hier klicken um deinen Token abzurufen",
|
|
"selectAllLibraries": "Wähle alle Bibliotheken",
|
|
"adminAutoLibraries": "Administrator-Benutzer haben automatisch Zugriff auf alle Bibliotheken"
|
|
},
|
|
"validation": {
|
|
"librariesRequired": "Mindestens eine Bibliothek muss für nicht-administrator Benutzer ausgewählt sein"
|
|
}
|
|
},
|
|
"player": {
|
|
"name": "Player |||| Players",
|
|
"fields": {
|
|
"name": "Name",
|
|
"transcodingId": "Transkodierungs-ID",
|
|
"maxBitRate": "Max. Bitrate",
|
|
"client": "Client",
|
|
"userName": "Nutzername",
|
|
"lastSeen": "Zuletzt gesehen am",
|
|
"reportRealPath": "Echten Pfad anzeigen",
|
|
"scrobbleEnabled": "An externe Dienstleister scrobblen"
|
|
}
|
|
},
|
|
"transcoding": {
|
|
"name": "Transcodierung |||| Transcodierungen",
|
|
"fields": {
|
|
"name": "Name",
|
|
"targetFormat": "Zielformat",
|
|
"defaultBitRate": "Standardbitrate",
|
|
"command": "Befehl"
|
|
}
|
|
},
|
|
"playlist": {
|
|
"name": "Wiedergabeliste |||| Wiedergabelisten",
|
|
"fields": {
|
|
"name": "Name",
|
|
"duration": "Dauer",
|
|
"ownerName": "Inhaber",
|
|
"public": "Öffentlich",
|
|
"updatedAt": "Aktualisiert am",
|
|
"createdAt": "Erstellt am",
|
|
"songCount": "Titelanzahl",
|
|
"comment": "Kommentar",
|
|
"sync": "Auto-Import",
|
|
"path": "Importieren aus"
|
|
},
|
|
"actions": {
|
|
"selectPlaylist": "Wiedergabeliste auswählen:",
|
|
"addNewPlaylist": "\"%{name}\" erstellen",
|
|
"export": "Exportieren",
|
|
"makePublic": "Öffentlich machen",
|
|
"makePrivate": "Privat stellen",
|
|
"saveQueue": "Warteschlange in Wiedergabeliste speichern",
|
|
"searchOrCreate": "Wiedergabeliste suchen oder neue erstellen...",
|
|
"pressEnterToCreate": "Enter drücken um neue Wiedergabeliste zu erstellen",
|
|
"removeFromSelection": "Von Auswahl entfernen"
|
|
},
|
|
"message": {
|
|
"duplicate_song": "Duplikate hinzufügen",
|
|
"song_exist": "Manche Titel sind bereits in der Playlist. Möchtest du sie trotzdem hinzufügen oder überspringen?",
|
|
"noPlaylistsFound": "Keine Wiedergabeliste gefunden",
|
|
"noPlaylists": "Keine Wiedergabelisten vorhanden"
|
|
}
|
|
},
|
|
"radio": {
|
|
"name": "Radio |||| Radios",
|
|
"fields": {
|
|
"name": "Name",
|
|
"streamUrl": "Stream URL",
|
|
"homePageUrl": "Homepage URL",
|
|
"updatedAt": "Geändert",
|
|
"createdAt": "Hinzugefügt"
|
|
},
|
|
"actions": {
|
|
"playNow": "Jetzt abspielen"
|
|
}
|
|
},
|
|
"share": {
|
|
"name": "Freigabe |||| Freigaben",
|
|
"fields": {
|
|
"username": "Freigegeben von",
|
|
"url": "URL",
|
|
"description": "Beschreibung",
|
|
"contents": "Inhalt",
|
|
"expiresAt": "Gültig bis",
|
|
"lastVisitedAt": "Zuletzt besucht",
|
|
"visitCount": "Aufrufe",
|
|
"format": "Format",
|
|
"maxBitRate": "Max. Bit Rate",
|
|
"updatedAt": "Geändert am",
|
|
"createdAt": "Erstellt am",
|
|
"downloadable": "Downloads erlauben?"
|
|
}
|
|
},
|
|
"missing": {
|
|
"name": "Fehlende Datei |||| Fehlende Dateien",
|
|
"fields": {
|
|
"path": "Pfad",
|
|
"size": "Größe",
|
|
"updatedAt": "Fehlt seit",
|
|
"libraryName": "Bibliothek"
|
|
},
|
|
"actions": {
|
|
"remove": "Entfernen",
|
|
"remove_all": "alle entfernen"
|
|
},
|
|
"notifications": {
|
|
"removed": "Fehlende Datei(en) entfernt"
|
|
},
|
|
"empty": "keine fehlenden Dateien"
|
|
},
|
|
"library": {
|
|
"name": "Bibliothek |||| Bibliotheken",
|
|
"fields": {
|
|
"name": "Name",
|
|
"path": "Pfad",
|
|
"remotePath": "Remote Pfad",
|
|
"lastScanAt": "Letzter Scan",
|
|
"songCount": "Lieder",
|
|
"albumCount": "Alben",
|
|
"artistCount": "Interpreten",
|
|
"totalSongs": "Lieder",
|
|
"totalAlbums": "Alben",
|
|
"totalArtists": "Interpreten",
|
|
"totalFolders": "Ordner",
|
|
"totalFiles": "Dateien",
|
|
"totalMissingFiles": "Fehlende Dateien",
|
|
"totalSize": "Größe",
|
|
"totalDuration": "Dauer",
|
|
"defaultNewUsers": "Standard für neue Benutzer",
|
|
"createdAt": "Erstellt",
|
|
"updatedAt": "Geändert"
|
|
},
|
|
"sections": {
|
|
"basic": "Basis Informationen",
|
|
"statistics": "Statistik"
|
|
},
|
|
"actions": {
|
|
"scan": "Bibliothek scannen",
|
|
"manageUsers": "Zugriff verwalten",
|
|
"viewDetails": "Details ansehen",
|
|
"quickScan": "Schneller Scan",
|
|
"fullScan": "Kompletter Scan"
|
|
},
|
|
"notifications": {
|
|
"created": "Bibliothek erfolgreich erstellt",
|
|
"updated": "Bibliothek erfolgreich geändert",
|
|
"deleted": "Bibliothek erfolgreich gelöscht",
|
|
"scanStarted": "Bibliothek Scan gestartet",
|
|
"scanCompleted": "Bibliothek Scan vollständig",
|
|
"quickScanStarted": "Schneller Scan gestartet",
|
|
"fullScanStarted": "Kompletter Scan gestartet",
|
|
"scanError": "Fehler beim Starten des Scans. Logs prüfen"
|
|
},
|
|
"validation": {
|
|
"nameRequired": "Bibliotheksname ist Pflichtfeld",
|
|
"pathRequired": "Bibliothekspfad ist Pflichtfeld",
|
|
"pathNotDirectory": "Bibliothekspfad muss ein Ordner sein",
|
|
"pathNotFound": "Bibliothekspfad nicht gefunden",
|
|
"pathNotAccessible": "Bibliothekspfad nicht zugänglich",
|
|
"pathInvalid": "Bibliothekspfad ungültig"
|
|
},
|
|
"messages": {
|
|
"deleteConfirm": "Möchtest du diese Bibliothek wirklich löschen? Zugriffsrechte und Daten werden entfernt. ",
|
|
"scanInProgress": "Bibliothek Scan läuft...",
|
|
"noLibrariesAssigned": "Keine Bibliotheken zugeordnet"
|
|
}
|
|
},
|
|
"plugin": {
|
|
"name": "Plugin |||| Plugins",
|
|
"fields": {
|
|
"id": "ID",
|
|
"name": "Name",
|
|
"description": "Beschreibung",
|
|
"version": "Version",
|
|
"author": "Autor",
|
|
"website": "Website",
|
|
"permissions": "Berechtigungen",
|
|
"enabled": "Aktiv",
|
|
"status": "Status",
|
|
"path": "Pfad",
|
|
"lastError": "Fehler",
|
|
"hasError": "Fehler",
|
|
"updatedAt": "Aktualisiert am",
|
|
"createdAt": "Installiert",
|
|
"configKey": "Schlüssel",
|
|
"configValue": "Wert",
|
|
"allUsers": "Alle Benutzer",
|
|
"selectedUsers": "Ausgewählte Benutzer",
|
|
"allLibraries": "Alle Bibliotheken",
|
|
"selectedLibraries": "Ausgewählte Bibliotheken",
|
|
"allowWriteAccess": "Schreibzugriff erlauben"
|
|
},
|
|
"sections": {
|
|
"status": "Status",
|
|
"info": "Plugin Information",
|
|
"configuration": "Konfiguration",
|
|
"manifest": "Manifest",
|
|
"usersPermission": "Benutzer Zugriff",
|
|
"libraryPermission": "Bibliotheken Zugriff"
|
|
},
|
|
"status": {
|
|
"enabled": "Aktiv",
|
|
"disabled": "Inaktiv"
|
|
},
|
|
"actions": {
|
|
"enable": "Aktivieren",
|
|
"disable": "Deaktivieren",
|
|
"disabledDueToError": "Fehler beheben um Plugin zu aktivieren",
|
|
"disabledUsersRequired": "Wähle Benutzer Zugriff um Plugin zu aktivieren",
|
|
"disabledLibrariesRequired": "Wähle Bibliotheken Zugriff um Plugin zu aktivieren",
|
|
"addConfig": "Konfiguration hinzufügen",
|
|
"rescan": "Scan"
|
|
},
|
|
"notifications": {
|
|
"enabled": "Plugin aktiv",
|
|
"disabled": "Plugin inaktiv",
|
|
"updated": "Plugin aktualisiert",
|
|
"error": "Fehler beim aktualisieren des Plugins"
|
|
},
|
|
"validation": {
|
|
"invalidJson": "Konfiguration muss valides JSON sein"
|
|
},
|
|
"messages": {
|
|
"configHelp": "Plugin mit Schlüssel-Werte Paaren konfigurieren. Leer lassen wenn das Plugin keine Konfiguration benötigt.",
|
|
"clickPermissions": "Berechtigung anklicken für mehr Details",
|
|
"noConfig": "Keine Konfiguration gesetzt",
|
|
"allUsersHelp": "Wenn aktiviert, erhält das Plugin Zugriff auf alle Benutzer, inklusive solcher, die in Zukunft erstellt werden.",
|
|
"noUsers": "Keine Benutzer ausgewählt",
|
|
"permissionReason": "Begründung",
|
|
"usersRequired": "Dieses Plugin benötigt Zugriff auf Benutzerinformationen. Wähle aus, auf welche Nutzer das Plugin zugreifen darf oder wähle 'Alle Benutzer'.",
|
|
"allLibrariesHelp": "Wenn aktiviert, erhält das Plugin Zugriff auf alle Bibliotheken, inklusive solcher, die in Zukunft erstellt werden.",
|
|
"noLibraries": "Keine Bibliotheken ausgewählt",
|
|
"librariesRequired": "Dieses Plugin benötigt Zugriff auf Bibliotheken. Wähle aus, auf welche Bibliotheken das Plugin zugreifen darf oder wähle 'Alle Bibliotheken'.",
|
|
"requiredHosts": "Benötigte Hosts",
|
|
"configValidationError": "Validierung der Konfiguration fehlgeschlagen:",
|
|
"schemaRenderError": "Rendern der Konfiguration fehlgeschlagen. Das Schema das Plugins ist eventuell nicht korrekt.",
|
|
"allowWriteAccessHelp": "Wenn aktiviert, kann das Plugin Dateien in den Bibliotheken verändern. Als Standard haben Plugins nur Lesezugriff."
|
|
},
|
|
"placeholders": {
|
|
"configKey": "Schlüssel",
|
|
"configValue": "Wert"
|
|
}
|
|
}
|
|
},
|
|
"ra": {
|
|
"auth": {
|
|
"welcome1": "Vielen Dank für die Installation von Navidrome!",
|
|
"welcome2": "Als erstes erstelle einen Admin-Benutzer",
|
|
"confirmPassword": "Passwort bestätigen",
|
|
"buttonCreateAdmin": "Admin erstellen",
|
|
"auth_check_error": "Bitte einloggen um fortzufahren",
|
|
"user_menu": "Profil",
|
|
"username": "Nutzername",
|
|
"password": "Passwort",
|
|
"sign_in": "Anmelden",
|
|
"sign_in_error": "Fehler bei der Anmeldung",
|
|
"logout": "Abmelden",
|
|
"insightsCollectionNote": "Navidrome sammelt anonyme Statistiken \num die Entwicklung des Projekts zu unterstützen. \n[here] klicken für mehr Informationen oder um \"Insights\" abzuschalten"
|
|
},
|
|
"validation": {
|
|
"invalidChars": "Bitte nur Buchstaben und Zahlen verwenden",
|
|
"passwordDoesNotMatch": "Passwort stimmt nicht überein",
|
|
"required": "Benötigt",
|
|
"minLength": "Muss mindestens %{min} Zeichen lang sein",
|
|
"maxLength": "Darf maximal %{max} Zeichen lang sein",
|
|
"minValue": "Muss mindestens %{min} sein",
|
|
"maxValue": "Muss %{max} oder weniger sein",
|
|
"number": "Muss eine Nummer sein",
|
|
"email": "Muss eine gültige E-Mail sein",
|
|
"oneOf": "Es muss einer sein von: %{options}",
|
|
"regex": "Es muss folgendem regulären Ausdruck entsprechen: %{pattern}",
|
|
"unique": "Muss eindeutig sein",
|
|
"url": "Muss eine gültige URL sein"
|
|
},
|
|
"action": {
|
|
"add_filter": "Filter hinzufügen",
|
|
"add": "Hinzufügen",
|
|
"back": "Zurück",
|
|
"bulk_actions": "Ein Element ausgewählt |||| %{smart_count} Elemente ausgewählt",
|
|
"cancel": "Abbrechen",
|
|
"clear_input_value": "Eingabe löschen",
|
|
"clone": "Klonen",
|
|
"confirm": "Bestätigen",
|
|
"create": "Erstellen",
|
|
"delete": "Löschen",
|
|
"edit": "Bearbeiten",
|
|
"export": "Exportieren",
|
|
"list": "Liste",
|
|
"refresh": "Aktualisieren",
|
|
"remove_filter": "Filter entfernen",
|
|
"remove": "Entfernen",
|
|
"save": "Speichern",
|
|
"search": "Suchen",
|
|
"show": "Anzeigen",
|
|
"sort": "Sortieren",
|
|
"undo": "Zurücksetzen",
|
|
"expand": "Expandieren",
|
|
"close": "Schließen",
|
|
"open_menu": "Menü öffnen",
|
|
"close_menu": "Menü schließen",
|
|
"unselect": "Abwählen",
|
|
"skip": "Überspringen",
|
|
"bulk_actions_mobile": "1 |||| %{smart_count}",
|
|
"share": "Freigabe erstellen",
|
|
"download": "Herunterladen"
|
|
},
|
|
"boolean": {
|
|
"true": "Ja",
|
|
"false": "Nein"
|
|
},
|
|
"page": {
|
|
"create": "%{name} erstellen",
|
|
"dashboard": "Dashboard",
|
|
"edit": "%{name} #%{id}",
|
|
"error": "Etwas ist schief gelaufen",
|
|
"list": "%{name}",
|
|
"loading": "Laden",
|
|
"not_found": "Nicht gefunden",
|
|
"show": "%{name} #%{id}",
|
|
"empty": "Noch kein %{name}.",
|
|
"invite": "Möchtest du eine hinzufügen?"
|
|
},
|
|
"input": {
|
|
"file": {
|
|
"upload_several": "Zum Hochladen Dateien hineinziehen oder hier klicken, um Dateien auszuwählen.",
|
|
"upload_single": "Zum Hochladen Datei hineinziehen oder hier klicken, um eine Datei auszuwählen."
|
|
},
|
|
"image": {
|
|
"upload_several": "Zum Hochladen Bilder hineinziehen oder hier klicken, um Bilder auszuwählen.",
|
|
"upload_single": "Zum Hochladen Bild hineinziehen oder hier klicken, um ein Bild auszuwählen."
|
|
},
|
|
"references": {
|
|
"all_missing": "Die zugehörigen Referenzen konnten nicht gefunden werden.",
|
|
"many_missing": "Mindestens eine der zugehörigen Referenzen scheint nicht mehr verfügbar zu sein.",
|
|
"single_missing": "Eine zugehörige Referenz scheint nicht mehr verfügbar zu sein."
|
|
},
|
|
"password": {
|
|
"toggle_visible": "Passwort verbergen",
|
|
"toggle_hidden": "Passwort anzeigen"
|
|
}
|
|
},
|
|
"message": {
|
|
"about": "Über",
|
|
"are_you_sure": "Bist du sicher?",
|
|
"bulk_delete_content": "Möchtest du \"%{name}\" wirklich löschen? |||| Möchtest du diese %{smart_count} Elemente wirklich löschen?",
|
|
"bulk_delete_title": "Lösche %{name} |||| Lösche %{smart_count} %{name} Elemente",
|
|
"delete_content": "Möchtest du diesen Inhalt wirklich löschen?",
|
|
"delete_title": "Lösche %{name} #%{id}",
|
|
"details": "Details",
|
|
"error": "Ein Fehler ist aufgetreten und deine Anfrage konnte nicht abgeschlossen werden.",
|
|
"invalid_form": "Das Formular ist ungültig. Bitte überprüfe deine Eingaben.",
|
|
"loading": "Die Seite wird geladen",
|
|
"no": "Nein",
|
|
"not_found": "Die Seite konnte nicht gefunden werden.",
|
|
"yes": "Ja",
|
|
"unsaved_changes": "Einige deiner Änderungen wurden nicht gespeichert. Bist du sicher, dass du sie ignorieren möchtest?"
|
|
},
|
|
"navigation": {
|
|
"no_results": "Keine Resultate gefunden",
|
|
"no_more_results": "Die Seite %{page} enthält keine Inhalte.",
|
|
"page_out_of_boundaries": "Die Seite %{page} liegt ausserhalb des gültigen Bereichs",
|
|
"page_out_from_end": "Letzte Seite",
|
|
"page_out_from_begin": "Erste Seite",
|
|
"page_range_info": "%{offsetBegin}-%{offsetEnd} von %{total}",
|
|
"page_rows_per_page": "Zeilen pro Seite:",
|
|
"next": "Weiter",
|
|
"prev": "Zurück",
|
|
"skip_nav": "Zum Inhalt springen"
|
|
},
|
|
"notification": {
|
|
"updated": "Element wurde aktualisiert |||| %{smart_count} Elemente wurden aktualisiert",
|
|
"created": "Element wurde erstellt",
|
|
"deleted": "Element wurde gelöscht |||| %{smart_count} Elemente wurden gelöscht",
|
|
"bad_item": "Fehlerhaftes Element",
|
|
"item_doesnt_exist": "Das Element existiert nicht",
|
|
"http_error": "Fehler beim Kommunizieren mit dem Server",
|
|
"data_provider_error": "dataProvider Fehler. Prüfe die Konsole für Details.",
|
|
"i18n_error": "Die Übersetzungen für die angegebene Sprache können nicht geladen werden",
|
|
"canceled": "Aktion abgebrochen",
|
|
"logged_out": "Deine Session wurde beendet. Bitte erneut verbinden.",
|
|
"new_version": "Neue Version verfügbar! Bitte aktualisiere dieses Fenster."
|
|
},
|
|
"toggleFieldsMenu": {
|
|
"columnsToDisplay": "Spalten auswählen",
|
|
"layout": "Anzeige",
|
|
"grid": "Raster",
|
|
"table": "Tabelle"
|
|
}
|
|
},
|
|
"message": {
|
|
"note": "HINWEIS",
|
|
"transcodingDisabled": "Die Änderung der Transcodierungskonfiguration über die Web-UI ist aus Sicherheitsgründen deaktiviert. Wenn du die Transcodierungsoptionen ändern (bearbeiten oder hinzufügen) möchtest, starte den Server mit der Konfigurationsoption %{config} neu.",
|
|
"transcodingEnabled": "Navidrome läuft derzeit mit %{config}, wodurch es möglich ist, Systembefehle aus den Transkodierungseinstellungen über die Webschnittstelle auszuführen. Wir empfehlen, es aus Sicherheitsgründen zu deaktivieren und nur bei der Konfiguration von Transkodierungsoptionen zu aktivieren.",
|
|
"songsAddedToPlaylist": "Einen Titel zur Wiedergabeliste hinzugefügt |||| %{smart_count} Titel zur Wiedergabeliste hinzugefügt",
|
|
"noPlaylistsAvailable": "Keine Wiedergabeliste verfügbar",
|
|
"delete_user_title": "Benutzer '%{name}' löschen",
|
|
"delete_user_content": "Möchtest du diesen Benutzer und alle seine Daten (einschließlich Wiedergabelisten und Einstellungen) wirklich löschen?",
|
|
"notifications_blocked": "Sie haben Benachrichtigungen für diese Seite in den Einstellungen Ihres Browsers blockiert",
|
|
"notifications_not_available": "Dieser Browser unterstützt keine Desktop-Benachrichtigungen",
|
|
"lastfmLinkSuccess": "Last.fm Verbindung hergestellt und scrobbling aktiviert",
|
|
"lastfmLinkFailure": "Last.fm konnte nicht verbunden werden",
|
|
"lastfmUnlinkSuccess": "Last.fm Verbindung entfernt und scrobbling deaktiviert",
|
|
"lastfmUnlinkFailure": "Last.fm Verbindung konnte nicht entfernt werden",
|
|
"openIn": {
|
|
"lastfm": "Auf Last.fm anzeigen",
|
|
"musicbrainz": "Auf MusicBrainz anzeigen"
|
|
},
|
|
"lastfmLink": "Mehr lesen",
|
|
"listenBrainzLinkSuccess": "Last.fm Verbindung hergestellt und und scrobbling aktiviert als user: %{user}",
|
|
"listenBrainzLinkFailure": "ListenBrainz konnte nicht verbunden werden: %{error}",
|
|
"listenBrainzUnlinkSuccess": "ListenBrainz Verbindung entfernt und scrobbling deaktiviert",
|
|
"listenBrainzUnlinkFailure": "ListenBrainz Verbindung konnte nicht entfernt werden",
|
|
"downloadOriginalFormat": "Download im Original Format",
|
|
"shareOriginalFormat": "Freigeben im Original Format",
|
|
"shareDialogTitle": "%{resource} '%{name}' freigeben",
|
|
"shareBatchDialogTitle": "1 %{resource} freigeben |||| %{smart_count} %{resource} freigeben",
|
|
"shareSuccess": "URL in Zwischenablage kopiert: %{url}",
|
|
"shareFailure": "Fehler URL %{url} konnte nicht in Zwischenablage kopiert werden",
|
|
"downloadDialogTitle": "Download %{resource} '%{name}' (%{size})",
|
|
"shareCopyToClipboard": "In Zwischenablage kopieren: Ctrl+C, Enter",
|
|
"remove_missing_title": "Fehlende Dateien entfernen",
|
|
"remove_missing_content": "Möchtest du die ausgewählten Fehlenden Dateien wirklich aus der Datenbank entfernen? Alle Referenzen zu den Dateien wie Anzahl Wiedergaben und Bewertungen werden permanent gelöscht.",
|
|
"remove_all_missing_title": "Alle fehlenden Dateien entfernen",
|
|
"remove_all_missing_content": "Möchtest du wirklich alle Fehlenden Dateien aus der Datenbank entfernen? Alle Referenzen zu den Dateien wie Anzahl Wiedergaben und Bewertungen werden permanent gelöscht.",
|
|
"noSimilarSongsFound": "Keine ähnlichen Titel gefunden",
|
|
"noTopSongsFound": "Keine beliebten Titel gefunden",
|
|
"startingInstantMix": "Lade Sofort-Mix...",
|
|
"uploadCover": "Cover hochladen",
|
|
"removeCover": "Cover entfernen",
|
|
"coverUploaded": "Cover aktualisiert",
|
|
"coverRemoved": "Cover entfernt",
|
|
"coverUploadError": "Fehler beim Hochladen des Covers",
|
|
"coverRemoveError": "Fehler beim Entfernen des Covers"
|
|
},
|
|
"menu": {
|
|
"library": "Bibliothek",
|
|
"settings": "Einstellungen",
|
|
"version": "Version",
|
|
"theme": "Design",
|
|
"personal": {
|
|
"name": "Persönlich",
|
|
"options": {
|
|
"theme": "Design",
|
|
"language": "Sprache",
|
|
"defaultView": "Standard-Ansicht",
|
|
"desktop_notifications": "Desktop-Benachrichtigungen",
|
|
"lastfmScrobbling": "Last.fm Scrobbling",
|
|
"listenBrainzScrobbling": "ListenBrainz Scrobbling",
|
|
"replaygain": "ReplayGain Modus",
|
|
"preAmp": "ReplayGain Vorverstärkung (dB)",
|
|
"gain": {
|
|
"none": "Deaktiviert",
|
|
"album": "Album Gain verwenden",
|
|
"track": "Titel Gain verwenden"
|
|
},
|
|
"lastfmNotConfigured": "Last.fm API-Key ist nicht konfiguriert"
|
|
}
|
|
},
|
|
"albumList": "Alben",
|
|
"about": "Über",
|
|
"playlists": "Wiedergabelisten",
|
|
"sharedPlaylists": "Geteilte Wiedergabelisten",
|
|
"librarySelector": {
|
|
"allLibraries": "Alle Bibliotheken (%{count})",
|
|
"multipleLibraries": "%{selected} von %{total} Bibliotheken",
|
|
"selectLibraries": "Bibliotheken auswählen",
|
|
"none": "Keine"
|
|
}
|
|
},
|
|
"player": {
|
|
"playListsText": "Warteschlange abspielen",
|
|
"openText": "Öffnen",
|
|
"closeText": "Schließen",
|
|
"notContentText": "Keine Musik",
|
|
"clickToPlayText": "Anklicken zum Abzuspielen",
|
|
"clickToPauseText": "Anklicken zum Pausieren",
|
|
"nextTrackText": "Nächster Titel",
|
|
"previousTrackText": "Vorheriger Titel",
|
|
"reloadText": "Neu laden",
|
|
"volumeText": "Lautstärke",
|
|
"toggleLyricText": "Liedtext umschalten",
|
|
"toggleMiniModeText": "Minimieren",
|
|
"destroyText": "Zerstören",
|
|
"downloadText": "Herunterladen",
|
|
"removeAudioListsText": "Audiolisten entfernen",
|
|
"clickToDeleteText": "Klicken um %{name} zu Löschen",
|
|
"emptyLyricText": "Kein Liedtext",
|
|
"playModeText": {
|
|
"order": "Der Reihe nach",
|
|
"orderLoop": "Wiederholen",
|
|
"singleLoop": "Eins wiederholen",
|
|
"shufflePlay": "Zufallswiedergabe"
|
|
}
|
|
},
|
|
"about": {
|
|
"links": {
|
|
"homepage": "Startseite",
|
|
"source": "Quellcode",
|
|
"featureRequests": "Feature-Request",
|
|
"lastInsightsCollection": "Letzte \"Insights\" Erfassung",
|
|
"insights": {
|
|
"disabled": "Deaktiviert",
|
|
"waiting": "Warten"
|
|
}
|
|
},
|
|
"tabs": {
|
|
"about": "Über",
|
|
"config": "Konfiguration"
|
|
},
|
|
"config": {
|
|
"configName": "Einstellung",
|
|
"environmentVariable": "Umbegungsvariable",
|
|
"currentValue": "Wert",
|
|
"configurationFile": "Konfigurationsdatei",
|
|
"exportToml": "Konfiguration exportieren (TOML)",
|
|
"exportSuccess": "Konfiguration im TOML Format in die Zwischenablage kopiert",
|
|
"exportFailed": "Fehler beim Kopieren der Konfiguration",
|
|
"devFlagsHeader": "Entwicklungseinstellungen (können sich ändern)",
|
|
"devFlagsComment": "Experimentelle Einstellungen, die eventuell in Zukunft entfernt oder geändert werden",
|
|
"downloadToml": "Konfiguration Herunterladen (TOML)"
|
|
}
|
|
},
|
|
"activity": {
|
|
"title": "Aktivität",
|
|
"totalScanned": "Insgesamt gescannte Ordner",
|
|
"quickScan": "Schneller Scan",
|
|
"fullScan": "Kompletter Scan",
|
|
"serverUptime": "Server-Betriebszeit",
|
|
"serverDown": "OFFLINE",
|
|
"scanType": "Typ",
|
|
"status": "Scan Fehler",
|
|
"elapsedTime": "Laufzeit",
|
|
"selectiveScan": "Selektiver Scan"
|
|
},
|
|
"help": {
|
|
"title": "Navidrome Hotkeys",
|
|
"hotkeys": {
|
|
"show_help": "Diese Hilfe anzeigen",
|
|
"toggle_menu": "Seitenleiste umschalten",
|
|
"toggle_play": "Play / Pause",
|
|
"prev_song": "vorheriger Titel",
|
|
"next_song": "Nächster Titel",
|
|
"vol_up": "Lauter",
|
|
"vol_down": "Leiser",
|
|
"toggle_love": "Titel zu Favoriten hinzufügen",
|
|
"current_song": "Aktuellen Titel Anzeigen"
|
|
}
|
|
},
|
|
"nowPlaying": {
|
|
"title": "Aktuelle Wiedergabe",
|
|
"empty": "Keine Wiedergabe",
|
|
"minutesAgo": "Vor %{smart_count} Minute |||| Vor %{smart_count} Minuten"
|
|
}
|
|
}
|