export default {
// Navigation
nav: {
printers: 'Drucker',
archives: 'Archiv',
queue: 'Druckwarteschlange',
stats: 'Statistiken',
profiles: 'Profile',
maintenance: 'Wartung',
projects: 'Projekte',
inventory: 'Filament',
files: 'Dateimanager',
makerworld: 'MakerWorld',
notifications: 'Benachrichtigungen',
settings: 'Einstellungen',
system: 'System',
collapseSidebar: 'Seitenleiste einklappen',
expandSidebar: 'Seitenleiste ausklappen',
update: 'Aktualisieren',
updateAvailable: 'Update verfügbar: v{{version}}',
updateAvailableBanner: 'Version {{version}} ist verfügbar!',
viewUpdate: 'Update anzeigen',
viewOnGithub: 'Auf GitHub ansehen',
keyboardShortcuts: 'Tastaturkürzel (?)',
switchToLight: 'Zum hellen Modus wechseln',
switchToDark: 'Zum dunklen Modus wechseln',
smartSwitches: 'Smart Switches',
logout: 'Abmelden',
},
// Common
common: {
save: 'Speichern',
saving: 'Speichern...',
cancel: 'Abbrechen',
delete: 'Löschen',
edit: 'Bearbeiten',
add: 'Hinzufügen',
close: 'Schließen',
confirm: 'Bestätigen',
loading: 'Lädt...',
error: 'Fehler',
errorLoading: 'Fehler beim Laden',
retry: 'Erneut versuchen',
success: 'Erfolg',
warning: 'Warnung',
enabled: 'Aktiviert',
disabled: 'Deaktiviert',
yes: 'Ja',
no: 'Nein',
on: 'An',
off: 'Aus',
all: 'Alle',
none: 'Keine',
search: 'Suchen',
filter: 'Filtern',
sort: 'Sortieren',
refresh: 'Aktualisieren',
download: 'Herunterladen',
upload: 'Hochladen',
uploading: 'Hochladen...',
uploadFailed: 'Hochladen fehlgeschlagen',
actions: 'Aktionen',
status: 'Status',
name: 'Name',
description: 'Beschreibung',
date: 'Datum',
time: 'Zeit',
hours: 'Stunden',
minutes: 'Minuten',
seconds: 'Sekunden',
days: 'Tage',
enable: 'Aktivieren',
disable: 'Deaktivieren',
permissions: 'Berechtigungen',
noPrinters: 'Keine Drucker konfiguriert',
noData: 'Keine Daten verfügbar',
linkNotFound: 'Link nicht gefunden',
required: 'Erforderlich',
optional: 'Optional',
dismiss: 'Schließen',
apply: 'Anwenden',
reset: 'Zurücksetzen',
export: 'Exportieren',
import: 'Importieren',
clear: 'Leeren',
selectAll: 'Alle auswählen',
deselectAll: 'Auswahl aufheben',
noChange: '— Keine Änderung —',
unchanged: 'Unverändert',
unassigned: 'Nicht zugewiesen',
unknown: 'Unbekannt',
unknownError: 'Unbekannter Fehler',
today: 'Heute',
tomorrow: 'Morgen',
asap: 'Sofort',
overdue: 'Überfällig',
now: 'Jetzt',
collapse: 'Einklappen',
expand: 'Ausklappen',
viewArchive: 'Archiv anzeigen',
viewInFileManager: 'Im Dateimanager anzeigen',
addedBy: 'Hinzugefügt von {{username}}',
prints: 'Drucke',
more: '+{{count}} weitere',
ascending: 'Aufsteigend',
descending: 'Absteigend',
back: 'Zurück',
copy: 'Kopieren',
copied: 'Kopiert!',
printer: 'Drucker',
remove: 'Entfernen',
type: 'Typ',
print: 'Drucken',
rename: 'Umbenennen',
move: 'Verschieben',
create: 'Erstellen',
duplicate: 'Duplizieren',
left: 'Links',
right: 'Rechts',
},
// Printers page
printers: {
title: 'Drucker',
addPrinter: 'Drucker hinzufügen',
editPrinter: 'Drucker bearbeiten',
deletePrinter: 'Drucker löschen',
printerName: 'Druckername',
serialNumber: 'Seriennummer',
ipAddress: 'IP-Adresse / Hostname',
accessCode: 'Zugangscode',
model: 'Modell',
nozzleCount: 'Düsenanzahl',
autoArchive: 'Automatische Archivierung',
status: {
available: 'Verfügbar',
idle: 'Bereit',
printing: 'Druckt',
paused: 'Pausiert',
offline: 'Offline',
problem: 'Problem',
error: 'Fehler',
finished: 'Fertig',
unknown: 'Unbekannt',
},
temperatures: {
nozzle: 'Düse',
bed: 'Druckbett',
chamber: 'Kammer',
},
progress: '{{percent}}% abgeschlossen',
timeRemaining: 'Noch {{time}}',
deleteConfirm: 'Möchten Sie "{{name}}" wirklich löschen?',
maintenanceOk: 'Wartung OK',
maintenanceWarning: '{{count}} Warnung',
maintenanceWarning_plural: '{{count}} Warnungen',
maintenanceDue: '{{count}} fällig',
maintenanceDue_plural: '{{count}} fällig',
// Sort options
sort: {
name: 'Name',
status: 'Status',
model: 'Modell',
location: 'Standort',
ascending: 'Aufsteigend sortieren',
descending: 'Absteigend sortieren',
},
// Card size
cardSize: {
small: 'Kleine Karten',
medium: 'Mittlere Karten',
large: 'Große Karten',
extraLarge: 'Extra große Karten',
},
// Controls
hideOffline: 'Offline ausblenden',
nextAvailable: 'Nächster verfügbar',
powerOn: 'Einschalten',
offlinePrintersWithPlugs: 'Offline-Drucker mit Smart-Plugs',
noPrintersConfigured: 'Noch keine Drucker konfiguriert',
search: 'Drucker suchen...',
noSearchResults: 'Keine Drucker entsprechen deiner Suche oder deinen Filtern',
filter: {
allStatuses: 'Alle Status',
allLocations: 'Alle Standorte',
},
toolbar: {
filters: 'Filter',
view: 'Ansicht',
actions: 'Aktionen',
},
// Printer card
readyToPrint: 'Druckbereit',
external: 'Extern',
extL: 'Ext-L',
extR: 'Ext-R',
deleteArchives: 'Druckarchive löschen',
noLabel: 'Keine Bezeichnung',
printPreview: 'Druckvorschau',
width: 'Breite',
height: 'Höhe',
noObjectsFound: 'Keine Objekte gefunden',
objectsLoadedOnPrintStart: 'Objekte werden beim Druckstart geladen',
willBeSkipped: 'Wird übersprungen',
name: 'Name',
serialCannotBeChanged: 'Seriennummer kann nicht geändert werden',
locationHelp: 'Dient zur Gruppierung von Druckern und zum Filtern von Warteschlangenaufträgen',
// WiFi signal strength
wifiSignal: {
veryWeak: 'Sehr schwach',
weak: 'Schwach',
fair: 'Ausreichend',
good: 'Gut',
excellent: 'Ausgezeichnet',
},
// Maintenance
maintenanceUpToDate: 'Alle Wartungen aktuell - Klicken zum Anzeigen',
// Chamber light
chamberLightOn: 'Kammerbeleuchtung einschalten',
chamberLightOff: 'Kammerbeleuchtung ausschalten',
// Files
files: 'Dateien',
browseFiles: 'Druckerdateien durchsuchen',
// Smart plug
autoOffAfterPrint: 'Automatisches Ausschalten nach Druck',
autoOffExecuted: 'Auto-off wurde ausgeführt - Drucker einschalten zum Zurücksetzen',
// HMS errors
hmsErrors: 'HMS-Fehler',
viewHmsErrors: '{{count}} HMS-Fehler anzeigen',
// Actions
resume: 'Fortsetzen',
pause: 'Pausieren',
stop: 'Stoppen',
camera: 'Kamera',
skipObject: 'Objekt überspringen',
reconnect: 'Neu verbinden',
forceRefresh: 'Aktualisierung erzwingen',
forceRefreshSuccess: 'Aktualisierung angefordert',
mqttDebug: 'MQTT-Debug',
printerInformation: 'Druckerinformationen',
copyToClipboard: 'Kopieren',
copied: 'Kopiert!',
state: 'Zustand',
wifiSignalLabel: 'WLAN-Signal',
developerMode: 'Entwicklermodus',
enabled: 'Aktiviert',
disabled: 'Deaktiviert',
addedOn: 'Hinzugefügt',
sdCard: 'SD-Karte',
inserted: 'Eingelegt',
notInserted: 'Nicht eingelegt',
totalPrintHours: 'Druckstunden',
activeNozzle: 'Aktiv: {{nozzle}} Düse',
nozzleRack: 'Düsenhalter',
nozzleDocked: 'Angedockt',
nozzleMounted: 'Montiert',
nozzleActive: 'Aktiv',
nozzleIdle: 'Inaktiv',
nozzleDiameter: 'Durchmesser',
nozzleType: 'Typ',
nozzleStatus: 'Status',
nozzleFilament: 'Filament',
nozzleWear: 'Verschleiß',
nozzleMaxTemp: 'Max. Temp',
nozzleSerial: 'Seriennr.',
nozzleHardenedSteel: 'Gehärteter Stahl',
nozzleStainlessSteel: 'Edelstahl',
nozzleTungstenCarbide: 'Wolframkarbid',
nozzleFlow: 'Durchfluss',
nozzleHighFlow: 'Hoher Durchfluss',
nozzleStandardFlow: 'Standard',
// Firmware
firmwareUpdate: 'Firmware-Update',
firmwareInstructions: 'Gehen Sie auf dem Touchscreen des Druckers zu',
firmwareNav: 'Navigieren Sie zu',
settings: 'Einstellungen',
firmware: 'Firmware',
// Discovery
discoverPrinters: 'Drucker entdecken',
searching: 'Suche...',
manualEntry: 'Manuelle Eingabe',
addFromCloud: 'Aus Cloud hinzufügen',
// Toast messages
toast: {
printerDeleted: 'Drucker gelöscht',
missingSpoolAssignment: 'Druck gestartet auf {{printer}}. Fehlende Spulenzuordnung für: {{slots}}',
printerAdded: 'Drucker hinzugefügt',
printerUpdated: 'Drucker aktualisiert',
failedToDelete: 'Drucker konnte nicht gelöscht werden',
failedToAdd: 'Drucker konnte nicht hinzugefügt werden',
failedToUpdate: 'Drucker konnte nicht aktualisiert werden',
commandSent: 'Befehl gesendet',
failedToSendCommand: 'Befehl konnte nicht gesendet werden',
turnedOn: '{{name}} eingeschaltet',
failedToPowerOn: '{{name}} konnte nicht eingeschaltet werden',
scriptTriggered: 'Skript ausgelöst',
printStopped: 'Druck gestoppt',
printPaused: 'Druck pausiert',
printResumed: 'Druck fortgesetzt',
referenceDeleted: 'Referenz gelöscht',
detectionAreaSaved: 'Erkennungsbereich gespeichert',
failedToRunScript: 'Skript konnte nicht ausgeführt werden',
failedToStopPrint: 'Druck konnte nicht gestoppt werden',
failedToPausePrint: 'Druck konnte nicht pausiert werden',
failedToResumePrint: 'Druck konnte nicht fortgesetzt werden',
failedToControlChamberLight: 'Kammerbeleuchtung konnte nicht gesteuert werden',
failedToSetSpeed: 'Druckgeschwindigkeit konnte nicht eingestellt werden',
failedToUpdateSetting: 'Einstellung konnte nicht aktualisiert werden',
failedToSkipObjects: 'Objekte konnten nicht übersprungen werden',
failedToRereadRfid: 'RFID konnte nicht erneut gelesen werden',
failedToCheckPlate: 'Platte konnte nicht überprüft werden',
failedToUpdateLabel: 'Bezeichnung konnte nicht aktualisiert werden',
failedToDeleteReference: 'Referenz konnte nicht gelöscht werden',
failedToSaveDetectionArea: 'Erkennungsbereich konnte nicht gespeichert werden',
plateCheckEnabled: 'Plattenprüfung aktiviert',
plateCheckDisabled: 'Plattenprüfung deaktiviert',
calibrationSaved: 'Kalibrierung gespeichert!',
calibrationFailed: 'Kalibrierung fehlgeschlagen',
rfidRereadInitiated: 'RFID-Neueinlesen gestartet',
loadInitiated: 'Filament wird geladen…',
unloadInitiated: 'Filament wird entladen…',
failedToLoad: 'Filament konnte nicht geladen werden',
failedToUnload: 'Filament konnte nicht entladen werden',
},
// Connection status
connection: {
connected: 'Verbunden',
offline: 'Offline',
},
plateStatus: {
markCleared: 'Platte als freigegeben markieren',
cleared: 'Platte freigegeben',
notCleared: 'Platte nicht freigegeben',
inUse: 'Platte in Benutzung',
},
// Queue info
queue: {
inQueue: '{{count}} Druck in Warteschlange',
inQueue_plural: '{{count}} Drucke in Warteschlange',
},
// Controls section
controls: 'Steuerung',
// RFID
rfid: {
reread: 'RFID neu lesen',
},
// AMS Laden/Entladen (#891)
ams: {
load: 'Laden',
unload: 'Entladen',
},
bedJog: {
title: 'Druckbett bewegen',
bed: 'Bett',
step: 'Schritt (mm)',
up: 'Platte hoch',
down: 'Platte runter',
disabledWhilePrinting: 'Während des Drucks deaktiviert',
notHomedTitle: 'Drucker ist nicht referenziert',
notHomedMessage: 'Der Drucker wurde seit dem letzten Druck nicht referenziert. Führen Sie zuerst die automatische Referenzfahrt aus (parkt den Werkzeugkopf und referenziert dann X, Y und Z) oder bewegen Sie trotzdem — die Software-Endschalter werden dabei umgangen.',
homeZ: 'Automatische Referenzfahrt',
moveAnyway: 'Trotzdem bewegen',
homingStarted: 'Drucker wird automatisch referenziert…',
},
// Permissions
permission: {
noAdd: 'Sie haben keine Berechtigung, Drucker hinzuzufügen',
noEdit: 'Sie haben keine Berechtigung, Drucker zu bearbeiten',
noDelete: 'Sie haben keine Berechtigung, Drucker zu löschen',
noControl: 'Sie haben keine Berechtigung, Drucker zu steuern',
noFiles: 'Sie haben keine Berechtigung, auf Druckerdateien zuzugreifen',
noAmsRfid: 'Sie haben keine Berechtigung, AMS-RFID erneut zu lesen',
noSmartPlugControl: 'Sie haben keine Berechtigung, Smart Plugs zu steuern',
noCamera: 'Sie haben keine Berechtigung, Kameras anzuzeigen',
},
// Add/Edit modal
modal: {
addTitle: 'Drucker hinzufügen',
editTitle: 'Drucker bearbeiten',
myPrinter: 'Mein Drucker',
selectModel: 'Modell auswählen...',
locationGroup: 'Standort / Gruppe (optional)',
locationPlaceholder: 'z.B. Werkstatt, Büro, Keller',
autoArchiveLabel: 'Abgeschlossene Drucke automatisch archivieren',
fromPrinterSettings: 'Aus Druckereinstellungen',
modelOptional: 'Modell (optional)',
saveChanges: 'Änderungen speichern',
},
// Skip objects
skipObjects: {
tooltip: 'Objekte überspringen',
onlyWhilePrinting: 'Objekte überspringen (nur während des Drucks)',
requiresMultiple: 'Objekte überspringen (erfordert 2+ Objekte)',
title: 'Objekte überspringen',
matchIdsInfo: 'IDs mit Drucker-Display abgleichen',
printerShowsIds: 'Der Druckerbildschirm zeigt Objekt-IDs auf der Bauplatte',
skipSelected: 'Ausgewählte überspringen',
skipping: 'Überspringe...',
noObjectsSelected: 'Keine Objekte ausgewählt',
selectObjectsToSkip: 'Wählen Sie Objekte aus, die Sie vom aktuellen Druck überspringen möchten',
skipped: 'übersprungen',
objectsSkipped: 'Objekte übersprungen',
activeCount: '{{count}} aktiv',
waitForLayer: 'Warten Sie auf Schicht 2+ zum Überspringen von Objekten (aktuell Schicht {{layer}})',
skip: 'Überspringen',
confirmTitle: 'Objekt überspringen?',
confirmMessage: 'Möchten Sie "{{name}}" wirklich überspringen? Dies kann nicht rückgängig gemacht werden.',
},
// Confirm modals
confirm: {
deleteTitle: 'Drucker löschen',
deleteMessage: 'Möchten Sie "{{name}}" wirklich löschen? Alle Verbindungseinstellungen werden entfernt.',
deleteArchivesNote: 'Der gesamte Druckverlauf für diesen Drucker wird dauerhaft gelöscht.',
keepArchivesNote: 'Der Druckverlauf wird beibehalten, aber nicht mehr mit diesem Drucker verknüpft.',
stopTitle: 'Druck stoppen',
stopMessage: 'Möchten Sie den aktuellen Druck auf "{{name}}" wirklich stoppen? Der Druckauftrag wird abgebrochen.',
stopButton: 'Druck stoppen',
pauseTitle: 'Druck pausieren',
pauseMessage: 'Möchten Sie den aktuellen Druck auf "{{name}}" wirklich pausieren?',
pauseButton: 'Druck pausieren',
resumeTitle: 'Druck fortsetzen',
resumeMessage: 'Möchten Sie den Druck auf "{{name}}" fortsetzen?',
resumeButton: 'Druck fortsetzen',
powerOnTitle: 'Drucker einschalten',
powerOnMessage: 'Möchten Sie die Stromversorgung für "{{name}}" wirklich EINSCHALTEN?',
powerOnButton: 'Einschalten',
powerOffTitle: 'Drucker ausschalten',
powerOffMessage: 'Möchten Sie die Stromversorgung für "{{name}}" wirklich AUSSCHALTEN?',
powerOffWarning: 'WARNUNG: "{{name}}" druckt gerade! Möchten Sie die Stromversorgung wirklich AUSSCHALTEN? Dies unterbricht den Druck und kann den Drucker beschädigen.',
powerOffButton: 'Ausschalten',
haToggleTitle: '"{{name}}" umschalten',
haToggleMessage: 'Home-Assistant-Entität {{entity}} umschalten? Das kann die Stromversorgung ausschalten, falls sie gerade an ist.',
haToggleWarning: 'WARNUNG: "{{name}}" druckt gerade! Umschalten von {{entity}} kann die Stromversorgung trennen und den Druck abbrechen. Fortfahren?',
haToggleButton: 'Umschalten',
},
// Bulk actions
bulk: {
select: 'Auswählen',
selectAll: 'Alle auswählen',
selectByLocation: 'Nach Standort auswählen',
selected: '{{count}} ausgewählt',
actions: {
stop: 'Stoppen',
pause: 'Pausieren',
resume: 'Fortsetzen',
clearPlate: 'Druckbett leeren',
clearHMS: 'Benachrichtigungen löschen',
},
confirm: {
stopTitle: '{{count}} Drucke stoppen',
stopMessage: 'Dies wird aktive Drucke auf {{count}} Drucker(n) abbrechen. Diese Aktion kann nicht rückgängig gemacht werden.',
stopButton: 'Alle stoppen',
pauseTitle: '{{count}} Drucke pausieren',
pauseMessage: 'Dies wird aktive Drucke auf {{count}} Drucker(n) pausieren.',
pauseButton: 'Alle pausieren',
clearPlateTitle: '{{count}} Druckbetten leeren',
clearPlateMessage: 'Dies wird das Druckbett auf {{count}} Drucker(n) leeren und kann wartende Aufträge starten.',
clearPlateButton: 'Alle leeren',
},
success: '{{action}} auf {{count}} Drucker(n) abgeschlossen',
partial: '{{succeeded}} erfolgreich, {{failed}} fehlgeschlagen',
noneApplicable: 'Keine ausgewählten Drucker sind im richtigen Zustand für diese Aktion',
selectByState: 'Nach Status auswählen',
},
// Discovery
discovery: {
title: 'Drucker entdecken',
searching: 'Suche...',
scanning: 'Scanne...',
scanProgress: 'Scanne... {{scanned}}/{{total}}',
foundPrinters: '{{count}} Drucker gefunden',
noPrintersFound: 'Keine Drucker gefunden',
noPrintersFoundSubnet: 'Keine Drucker im angegebenen Subnetz gefunden.',
noPrintersFoundNetwork: 'Keine Drucker im Netzwerk gefunden.',
allConfigured: 'Alle erkannten Drucker sind bereits konfiguriert.',
alreadyAdded: 'Bereits hinzugefügt',
select: 'Auswählen',
manualEntry: 'Manuelle Eingabe',
addFromCloud: 'Aus Cloud hinzufügen',
subnetToScan: 'Zu scannendes Subnetz',
dockerNote: 'Docker erkannt. Geben Sie das Subnetz Ihres Druckers in CIDR-Notation ein. Erfordert network_mode: host in docker-compose.yml.',
scanSubnet: 'Subnetz nach Druckern scannen',
discoverNetwork: 'Drucker im Netzwerk suchen',
scanningSubnet: 'Subnetz wird nach Bambu-Druckern gescannt...',
scanningNetwork: 'Netzwerk wird gescannt...',
serialRequired: 'Seriennummer erforderlich',
unknown: 'Unbekannt',
failedToStart: 'Erkennung konnte nicht gestartet werden',
},
// AMS Drying
drying: {
start: 'Trocknung starten',
stop: 'Trocknung stoppen',
temperature: 'Temperatur',
duration: 'Dauer',
hours: 'Stunden',
timeRemaining: '{{time}} verbleibend',
active: 'Trocknung',
notSupported: 'Trocknung nicht unterstützt',
powerRequired: 'AMS-Netzteil anschließen, um Trocknung zu aktivieren',
startingDrying: 'Trocknung wird gestartet...',
stoppingDrying: 'Trocknung wird gestoppt...',
rotateTray: 'Spule während der Trocknung drehen',
},
// Filaments section
filaments: 'Filamente',
// Camera
openCameraOverlay: 'Kamera-Overlay öffnen',
openCameraWindow: 'Kamera in neuem Fenster öffnen',
// Firmware
firmwareUpdateAvailable: 'Firmware-Update verfügbar: {{current}} → {{latest}}',
firmwareUpToDate: 'Firmware {{version}} — Aktuell',
firmwareUpdateButton: 'Aktualisieren',
// Plate detection
plateDetection: {
noPermission: 'Sie haben keine Berechtigung, Drucker zu aktualisieren',
enabledClick: 'Plattenprüfung aktiviert - Klicken zum Deaktivieren',
disabledClick: 'Plattenprüfung deaktiviert - Klicken zum Aktivieren',
manageCalibration: 'Platten-Erkennungskalibrierung verwalten',
calibrationRequired: 'Kalibrierung erforderlich',
calibrationInstructions: 'Bitte stellen Sie sicher, dass die Druckplatte vollständig leer ist, und klicken Sie dann auf Kalibrieren.',
calibrationDescription: 'Die Kalibrierung erfasst ein Referenzbild der leeren Platte. Zukünftige Prüfungen vergleichen mit dieser Referenz, um Objekte zu erkennen.',
calibrationTip: 'Tipp: Sie können bis zu 5 Kalibrierungen für verschiedene Platten speichern. Das System verwendet automatisch die beste Übereinstimmung bei der Prüfung.',
plateEmpty: 'Platte erscheint leer',
objectsDetected: 'Objekte auf Platte erkannt',
confidence: 'Konfidenz',
difference: 'Differenz',
analysisPreview: 'Analysevorschau:',
analysisLegend: 'Grüner Rahmen = Erkennungsbereich, Rote Überlagerung = Unterschiede zur Kalibrierung',
savedReferences: 'Gespeicherte Referenzen ({{count}}/{{max}})',
deleteReference: 'Referenz löschen',
labelPlaceholder: 'Bezeichnung...',
clickToEdit: '{{label}} - Zum Bearbeiten klicken',
clickToAddLabel: 'Zum Hinzufügen einer Bezeichnung klicken',
},
// Speed
speed: {
title: 'Druckgeschwindigkeit',
silent: 'Leise (50%)',
standard: 'Standard (100%)',
sport: 'Sport (124%)',
ludicrous: 'Ludicrous (166%)',
},
airduct: {
title: 'Luftkanal-Modus',
cooling: 'Kühlen',
heating: 'Heizen',
},
noSdCard: 'Keine SD',
door: {
open: 'Offen',
closed: 'Zu',
},
// Fans
fans: {
partCooling: 'Bauteilkühlung',
auxiliary: 'Hilfsventilator',
chamber: 'Kammerventilator',
},
// HMS errors
clickToViewHmsErrors: 'Klicken, um HMS-Fehler anzuzeigen',
estimatedCompletion: 'Geschätzte Fertigstellungszeit',
plateNumber: 'Platte {{number}}',
slotOptions: 'Slot-Optionen',
// AMS hover popup
amsPopup: {
friendlyName: 'AMS-Name',
friendlyNamePlaceholder: 'z. B. AMS-Anzeigename',
serialNumber: 'Seriennummer',
firmwareVersion: 'Firmware',
save: 'Speichern',
clear: 'Löschen',
noEditPermission: 'Sie haben keine Berechtigung, AMS-Einheiten umzubenennen',
},
// Firmware modal
firmwareModal: {
title: 'Firmware-Update',
titleUpToDate: 'Firmware-Info',
currentVersion: 'Aktuell:',
latestVersion: 'Neueste:',
releaseNotes: 'Versionshinweise',
checkingPrereqs: 'Prüfe Voraussetzungen...',
sdCardReady: 'SD-Karte bereit. Klicken Sie unten, um die Firmware hochzuladen.',
uploadedSuccess: 'Firmware auf SD-Karte hochgeladen!',
applyInstructions: 'So wenden Sie das Update auf Ihrem Drucker an:',
step1: 'Gehen Sie auf dem Touchscreen des Druckers zu Einstellungen',
step2: 'Navigieren Sie zu Firmware',
step3: 'Wählen Sie Update von SD-Karte',
step4: 'Das Update dauert 10-20 Minuten',
done: 'Fertig',
starting: 'Starte...',
uploadFirmware: 'Firmware hochladen',
uploadFailed: 'Upload fehlgeschlagen: {{error}}',
uploadedToast: 'Firmware hochgeladen! Starten Sie das Update vom Druckerbildschirm.',
availableVersions: 'Verfügbare Versionen',
usable: 'Installierbar',
unavailable: 'Nicht verfügbar',
installed: 'Installiert',
newerBadge: 'neuer',
olderBadge: 'älter',
currentBadge: 'aktuell',
},
accessCodePlaceholder: 'Leer lassen, um den aktuellen zu behalten',
// ROI editor
roi: {
title: 'Erkennungsbereich (ROI)',
xStart: 'X-Start',
yStart: 'Y-Start',
width: 'Breite',
height: 'Höhe',
instruction: 'Passen Sie den Erkennungsbereich an, um sich auf die Druckplatte zu konzentrieren. Der grüne Rahmen in der Vorschau zeigt den aktuellen Bereich.',
},
developerModeWarning: 'Der Entwickler-LAN-Modus ist nicht aktiviert auf: {{names}}. Einige Funktionen funktionieren möglicherweise nicht.',
howToEnable: 'Aktivieren',
incompatibleFile: 'Diese Datei wurde für {{slicedFor}} geslicet, aber dieser Drucker ist ein {{printerModel}}',
dropNotPrintable: 'Nur .gcode- und .gcode.3mf-Dateien können gedruckt werden',
dropToPrint: 'Zum Drucken ablegen',
cannotPrint: 'Drucker beschäftigt',
},
// Archives page
archives: {
title: 'Druckarchiv',
searchPlaceholder: 'Archiv durchsuchen...',
filterByPrinter: 'Nach Drucker filtern',
filterByStatus: 'Nach Status filtern',
sortBy: 'Sortieren nach',
sortNewest: 'Neueste zuerst',
sortOldest: 'Älteste zuerst',
sortName: 'Name',
sortDuration: 'Dauer',
sortLargest: 'Größte zuerst',
sortSmallest: 'Kleinste zuerst',
sortSize: 'Größe',
noArchives: 'Keine Archive gefunden',
noArchivesSearch: 'Keine Archive entsprechen Ihrer Suche',
originalPrintNotVisible: 'Ursprünglicher Druck nicht sichtbar - versuchen Sie, die Filter zu löschen',
noArchivesYet: 'Noch keine Archive',
prints: 'Drucke',
pagination: {
showing: 'Zeige',
to: 'bis',
of: 'von',
show: 'Zeige',
page: 'Seite',
all: 'Alle',
},
loadingArchives: 'Lade Archive...',
releaseToUpload: 'Loslassen zum Hochladen',
showAll: 'Alle anzeigen',
showFavoritesOnly: 'Nur Favoriten anzeigen',
gridView: 'Rasteransicht',
listView: 'Listenansicht',
calendarView: 'Kalenderansicht',
logView: 'Druckprotokoll',
manageTags: 'Tags verwalten',
showFailedPrints: 'Fehlgeschlagene Drucke anzeigen',
hideFailedPrints: 'Fehlgeschlagene Drucke ausblenden',
hideDuplicates: 'Duplikate ausblenden',
viewOriginalPrint: 'Klicken, um den ursprünglichen Druck anzuzeigen (#{{id}})',
printTime: 'Druckzeit',
filamentUsed: 'Verbrauchtes Filament',
cost: 'Kosten',
reprint: 'Drucken',
preview: 'Vorschau',
deleteArchive: 'Archiv löschen',
deleteConfirm: 'Möchten Sie dieses Archiv wirklich löschen?',
favorite: 'Favorit',
unfavorite: 'Aus Favoriten entfernen',
viewDetails: 'Details anzeigen',
status: {
completed: 'Abgeschlossen',
failed: 'Fehlgeschlagen',
stopped: 'Gestoppt',
},
toast: {
source3mfAttached: 'Quell-3MF angehängt: {{filename}}',
failedUploadSource3mf: 'Fehler beim Hochladen der Quell-3MF',
source3mfRemoved: 'Quell-3MF entfernt',
failedRemoveSource3mf: 'Fehler beim Entfernen der Quell-3MF',
f3dAttached: 'F3D angehängt: {{filename}}',
failedUploadF3d: 'Fehler beim Hochladen der F3D',
f3dRemoved: 'F3D entfernt',
failedRemoveF3d: 'Fehler beim Entfernen der F3D',
timelapseAttached: 'Zeitraffer angehängt: {{filename}}',
timelapseAlreadyAttached: 'Zeitraffer bereits angehängt',
noMatchingTimelapse: 'Kein passender Zeitraffer gefunden',
failedScanTimelapse: 'Fehler beim Suchen nach Zeitraffer',
failedAttachTimelapse: 'Fehler beim Anhängen des Zeitraffers',
timelapseRemoved: 'Zeitraffer entfernt',
failedRemoveTimelapse: 'Fehler beim Entfernen des Zeitraffers',
timelapseUploaded: 'Zeitraffer hochgeladen: {{filename}}',
failedUploadTimelapse: 'Fehler beim Hochladen des Zeitraffers',
archiveDeleted: 'Archiv gelöscht',
failedDeleteArchive: 'Fehler beim Löschen des Archivs',
addedToFavorites: 'Zu Favoriten hinzugefügt',
removedFromFavorites: 'Aus Favoriten entfernt',
projectUpdated: 'Projekt aktualisiert',
failedUpdateProject: 'Fehler beim Aktualisieren des Projekts',
linkCopied: 'Link in die Zwischenablage kopiert',
failedCopyLink: 'Fehler beim Kopieren des Links',
photoDeleted: 'Foto gelöscht',
failedDeletePhoto: 'Fehler beim Löschen des Fotos',
failedDeleteArchives: 'Fehler beim Löschen der Archive',
failedUpdateFavorites: 'Fehler beim Aktualisieren der Favoriten',
exportDownloaded: 'Export heruntergeladen',
exportFailed: 'Export fehlgeschlagen',
},
menu: {
print: 'Drucken',
schedule: 'Planen',
openInBambuStudio: 'Im Slicer öffnen',
slice: 'Slicen',
externalLink: 'Externer Link',
viewOnMakerWorld: 'Auf MakerWorld ansehen',
preview3d: '3D-Vorschau',
viewTimelapse: 'Zeitraffer ansehen',
scanForTimelapse: 'Nach Zeitraffer suchen',
uploadTimelapse: 'Zeitraffer hochladen',
removeTimelapse: 'Zeitraffer entfernen',
downloadSource3mf: 'Quell-3MF herunterladen',
uploadSource3mf: 'Quell-3MF hochladen',
replaceSource3mf: 'Quell-3MF ersetzen',
removeSource3mf: 'Quell-3MF entfernen',
uploadF3d: 'F3D hochladen',
replaceF3d: 'F3D ersetzen',
downloadF3d: 'F3D herunterladen',
removeF3d: 'F3D entfernen',
download: 'Herunterladen',
copyDownloadLink: 'Download-Link kopieren',
qrCode: 'QR-Code',
viewPhotos: 'Fotos ansehen',
viewPhotosCount: 'Fotos ansehen ({{count}})',
projectPage: 'Projektseite',
addToFavorites: 'Zu Favoriten hinzufügen',
removeFromFavorites: 'Aus Favoriten entfernen',
edit: 'Bearbeiten',
printLog: 'Druckprotokoll',
goToProject: 'Zum Projekt: {{name}}',
addToProject: 'Zu Projekt hinzufügen',
removeFromProject: 'Aus Projekt entfernen',
loading: 'Laden...',
noProjectsAvailable: 'Keine Projekte verfügbar',
searchProjects: 'Projekte suchen…',
select: 'Auswählen',
deselect: 'Abwählen',
delete: 'Löschen',
},
permission: {
noReprint: 'Sie haben keine Berechtigung, dieses Archiv erneut zu drucken',
noAddToQueue: 'Sie haben keine Berechtigung, zur Warteschlange hinzuzufügen',
noUpdateArchives: 'Sie haben keine Berechtigung, Archive zu aktualisieren',
noUploadFiles: 'Sie haben keine Berechtigung, Dateien hochzuladen',
noDownload: 'Sie haben keine Berechtigung, Archive herunterzuladen',
noCopyLink: 'Sie haben keine Berechtigung, Download-Links zu kopieren',
noDelete: 'Sie haben keine Berechtigung, dieses Archiv zu löschen',
noCreate: 'Sie haben keine Berechtigung, Archive zu erstellen',
},
platePicker: {
title: 'Platte zur Vorschau auswählen',
hint: 'Dieses Archiv enthält mehrere Platten. Wähle eine, um sie im GCode-Viewer zu öffnen.',
plateLabel: 'Platte {{index}}',
objectCount: '{{count}} Objekt',
objectCount_plural: '{{count}} Objekte',
noGcode: 'Dieses Archiv enthält keinen geschnittenen G-Code zur Vorschau. Öffne es zuerst in Bambu Studio zum Slicen.',
},
card: {
previousPlate: 'Vorherige Platte',
nextPlate: 'Nächste Platte',
plateNumber: 'Platte {{index}}',
moreOptions: 'Rechtsklick für mehr Optionen',
addToFavorites: 'Zu Favoriten hinzufügen',
removeFromFavorites: 'Aus Favoriten entfernen',
cancelled: 'abgebrochen',
failed: 'fehlgeschlagen',
duplicate: 'Duplikat',
duplicateTitle: 'Dieses Modell wurde bereits zuvor gedruckt',
openSource3mf: 'Quell-3MF in Bambu Studio öffnen (Rechtsklick für mehr Optionen)',
downloadF3d: 'Fusion 360 Designdatei herunterladen',
viewTimelapse: 'Zeitraffer ansehen',
viewPhoto: '1 Foto ansehen',
viewPhotos: '{{count}} Fotos ansehen',
openFolder: 'Ordner öffnen: {{name}}',
slicedFile: 'Geslicte Datei - druckbereit',
sourceFile: 'Nur Quelldatei - keine AMS-Zuordnung verfügbar',
gcode: 'GCODE',
source: 'QUELLE',
project: 'Projekt: {{name}}',
runsBadge: '{{count}} Drucke',
runsBadgeTitle: 'Insgesamt {{count}} Drucke — {{successful}} erfolgreich, {{failed}} fehlgeschlagen. Klicken, um das vollständige Druckprotokoll zu öffnen.',
estimated: 'Geschätzt: {{time}}',
actual: 'Tatsächlich: {{time}}',
accuracy: 'Genauigkeit: {{percent}}%',
filament: '{{weight}} g',
layer: '{{count}} Schicht',
layers: '{{count}} Schichten',
object: '{{count}} Objekt',
objects: '{{count}} Objekte',
slicedFor: 'Geslict für {{model}}',
uploadedBy: 'Hochgeladen von',
noPermissionReprint: 'Sie haben keine Berechtigung, erneut zu drucken',
noFileForReprint: 'Keine 3MF-Datei verfügbar — die Datei konnte beim Aufzeichnen des Drucks nicht vom Drucker heruntergeladen werden',
noPermissionEdit: 'Sie haben keine Berechtigung, Archive zu bearbeiten',
noPermissionDelete: 'Sie haben keine Berechtigung, Archive zu löschen',
reprint: 'Drucken',
schedulePrint: 'Druck planen',
schedule: 'Planen',
openInBambuStudio: 'Im Slicer öffnen',
openInBambuStudioToSlice: 'Im Slicer öffnen zum Slicen',
slice: 'Slicen',
externalLink: 'Externer Link',
makerWorld: 'MakerWorld – {{designer}}',
viewProject: 'Projekt ansehen',
noExternalLink: 'Kein externer Link',
preview3d: '3D-Vorschau',
download: 'Herunterladen',
edit: 'Bearbeiten',
delete: 'Löschen',
},
runLog: {
title: 'Druckprotokoll',
modalTitle: 'Druckprotokoll — {{name}}',
modalTitleFallback: 'dieses Archiv',
empty: 'Für dieses Archiv wurden noch keine Druckereignisse aufgezeichnet.',
col: {
date: 'Datum',
status: 'Status',
duration: 'Dauer',
filament: 'Filament',
cost: 'Kosten',
},
status: {
completed: 'Abgeschlossen',
failed: 'Fehlgeschlagen',
cancelled: 'Abgebrochen',
stopped: 'Gestoppt',
skipped: 'Übersprungen',
printing: 'Druckt',
},
},
modal: {
deleteArchive: 'Archiv löschen',
deleteConfirm: 'Möchten Sie "{{name}}" wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.',
deleteButton: 'Löschen',
deletePurgeStats: 'Diesen Druck auch aus den Quick Stats entfernen (Filament, Zeit, Kosten, Energie)',
removeSource3mf: 'Quell-3MF entfernen',
removeSource3mfConfirm: 'Möchten Sie die Quell-3MF-Datei wirklich von "{{name}}" entfernen? Die ursprüngliche Slicer-Projektdatei wird gelöscht.',
removeButton: 'Entfernen',
removeF3d: 'F3D entfernen',
removeF3dConfirm: 'Möchten Sie die Fusion 360 Designdatei wirklich von "{{name}}" entfernen?',
removeTimelapse: 'Zeitraffer entfernen',
removeTimelapseConfirm: 'Möchten Sie das Zeitraffervideo wirklich von "{{name}}" entfernen?',
timelapse: '{{name}} - Zeitraffer',
selectTimelapse: 'Zeitraffer auswählen',
selectTimelapseDesc: 'Keine automatische Übereinstimmung gefunden. Wählen Sie den Zeitraffer für diesen Druck:',
deleteArchives: 'Archive löschen',
deleteArchivesConfirm: 'Möchten Sie wirklich {{count}} Archiv(e) löschen? Diese Aktion kann nicht rückgängig gemacht werden.',
deleteCount: '{{count}} löschen',
},
page: {
title: 'Archive',
printsCount: '{{filtered}} von {{total}} Drucken',
dropFilesHere: '.3mf-Dateien hier ablegen',
releaseToUpload: 'Loslassen zum Hochladen',
only3mfSupported: 'Nur .3mf-Dateien werden unterstützt',
close: 'Schließen',
selected: '{{count}} ausgewählt',
selectAll: 'Alle auswählen',
tags: 'Tags',
project: 'Projekt',
favorite: 'Favorit',
delete: 'Löschen',
toggledFavorites: 'Favoriten für {{count}} Archiv(e) umgeschaltet',
failedUpdateFavorites: 'Fehler beim Aktualisieren der Favoriten',
archivesDeleted: '{{count}} Archiv(e) gelöscht',
failedDeleteArchives: 'Fehler beim Löschen der Archive',
photoDeleted: 'Foto gelöscht',
failedDeletePhoto: 'Fehler beim Löschen des Fotos',
},
list: {
name: 'Name',
printer: 'Drucker',
date: 'Datum',
size: 'Größe',
actions: 'Aktionen',
hasTimelapse: 'Hat Zeitraffer',
},
log: {
date: 'Datum',
printName: 'Druckname',
printer: 'Drucker',
user: 'Benutzer',
status: 'Status',
duration: 'Dauer',
filament: 'Filament',
allPrinters: 'Alle Drucker',
allUsers: 'Alle Benutzer',
allStatuses: 'Alle Status',
cancelled: 'Abgebrochen',
skipped: 'Übersprungen',
dateFrom: 'Von',
dateTo: 'Bis',
noEntries: 'Keine Druckprotokolleinträge gefunden',
showing: '{{count}} von {{total}} Einträgen',
rowsPerPage: 'Zeilen',
page: 'Seite',
prev: 'Zurück',
next: 'Weiter',
clearLog: 'Protokoll löschen',
clearLogTitle: 'Druckprotokoll löschen',
clearLogConfirm: 'Alle Druckprotokolleinträge werden dauerhaft gelöscht. Archive und Warteschlangeneinträge sind nicht betroffen. Diese Aktion kann nicht rückgängig gemacht werden. Sind Sie sicher?',
clearLogButton: 'Alle löschen',
cleared: '{{count}} Protokolleinträge gelöscht',
clearFailed: 'Druckprotokoll konnte nicht gelöscht werden',
},
},
// Queue page
queue: {
title: 'Druckwarteschlange',
subtitle: 'Planen und verwalten Sie Ihre Druckaufträge',
addToQueue: 'Zur Warteschlange hinzufügen',
// Print modal
print: 'Drucken',
reprint: 'Erneut drucken',
schedulePrint: 'Druck planen',
editQueueItem: 'Warteschlangeneintrag bearbeiten',
printToPrinters: 'Auf {{count}} Druckern drucken',
queueToPrinters: 'Zu {{count}} Druckern hinzufügen',
queueSelectedPlates: '{{count}} Platten in die Warteschlange',
selectAllPlates: 'Alle {{count}} Platten auswählen',
deselectAll: 'Alle abwählen',
printQueued: 'Druck in Warteschlange',
itemsQueued: '{{count}} Einträge in Warteschlange',
sending: 'Wird gesendet...',
sendingProgress: 'Sende {{current}}/{{total}}...',
adding: 'Wird hinzugefügt...',
addingProgress: 'Füge hinzu {{current}}/{{total}}...',
savingProgress: 'Speichere {{current}}/{{total}}...',
clearQueue: 'Warteschlange leeren',
clearHistory: 'Verlauf löschen',
emptyQueue: 'Warteschlange ist leer',
position: 'Position',
scheduledTime: 'Geplante Zeit',
moveUp: 'Nach oben',
moveDown: 'Nach unten',
startNow: 'Jetzt starten',
printingInProgress: 'Druck läuft...',
viewArchive: 'Archiv anzeigen',
viewInFileManager: 'Im Dateimanager anzeigen',
itemCount: '{{count}} Element',
itemCount_plural: '{{count}} Elemente',
dragToReorder: 'Ziehen zum Neuordnen (nur Sofort)',
reorderHint: 'Position betrifft nur Sofort-Elemente. Geplante Elemente werden zur festgelegten Zeit ausgeführt.',
sjf: {
label: 'SJF',
tooltip: 'Kürzester Auftrag zuerst — Scheduler bevorzugt kürzere Drucke',
},
addedBy: 'Hinzugefügt von {{name}}',
nextInQueue: 'Nächster in der Warteschlange',
clearPlateSuccess: 'Druckplatte freigegeben — bereit für nächsten Druck',
plateNumber: 'Platte {{index}}',
// Batch / quantity
quantity: 'Menge',
quantityHint: 'Erstellt {{count}} Warteschlangeneinträge',
activeBatches: 'Aktive Stapel',
batchProgress: '{{completed}} von {{total}} abgeschlossen',
cancelBatch: 'Verbleibende abbrechen',
batchCancelled: 'Verbleibende Stapeleinträge abgebrochen',
cancelBatchConfirmTitle: 'Stapel abbrechen',
cancelBatchConfirmMessage: 'Alle verbleibenden ausstehenden Einträge in diesem Stapel abbrechen?',
batch: 'Stapel',
// Sections
sections: {
currentlyPrinting: 'Aktuell druckend',
queued: 'In Warteschlange',
history: 'Verlauf',
},
// Status
status: {
pending: 'Ausstehend',
waiting: 'Wartend',
printing: 'Druckt',
paused: 'Pausiert',
completed: 'Abgeschlossen',
failed: 'Fehlgeschlagen',
skipped: 'Übersprungen',
cancelled: 'Abgebrochen',
},
// Summary cards
summary: {
printing: 'Druckt',
queued: 'In Warteschlange',
totalTime: 'Gesamte Wartezeit',
totalWeight: 'Gesamtgewicht der Warteschlange',
history: 'Verlauf',
},
// Filters
filter: {
allPrinters: 'Alle Drucker',
unassigned: 'Nicht zugewiesen',
allStatus: 'Alle Status',
allLocations: 'Alle Standorte',
any: 'Beliebig',
},
// Sort
sort: {
byPosition: 'Nach Position sortieren',
byName: 'Nach Name sortieren',
byPrinter: 'Nach Drucker sortieren',
bySchedule: 'Nach Zeitplan sortieren',
byDate: 'Nach Datum sortieren',
ascendingOldest: 'Aufsteigend (älteste zuerst)',
descendingNewest: 'Absteigend (neueste zuerst)',
},
// Badges
badges: {
staged: 'Bereitgestellt',
requiresPrevious: 'Erfordert vorherigen Erfolg',
autoPowerOff: 'Automatisch ausschalten',
gcodeInjection: 'G-Code',
},
// Empty state
empty: {
title: 'Keine Drucke geplant',
description: 'Planen Sie einen Druck von der Archivseite über die Option "Planen" im Kontextmenü oder ziehen Sie Dateien hierher.',
},
// Time
time: {
asap: 'Sofort',
overdue: 'Überfällig',
now: 'Jetzt',
lessThanMinute: 'In weniger als einer Minute',
inMinutes: 'In {{count}} Min',
inHours: 'In {{count}} Stunden',
},
// Actions
actions: {
stopPrint: 'Druck stoppen',
startPrint: 'Druck starten',
requeue: 'Erneut einreihen',
},
// Bulk edit
bulkEdit: {
title: '{{count}} Element bearbeiten',
title_plural: '{{count}} Elemente bearbeiten',
description: 'Nur geänderte Einstellungen werden auf ausgewählte Elemente angewendet.',
printer: 'Drucker',
noChange: '— Keine Änderung —',
queueOptions: 'Warteschlangenoptionen',
staged: 'Bereitgestellt (manueller Start)',
autoPowerOff: 'Nach Druck automatisch ausschalten',
requirePrevious: 'Vorherigen Erfolg erfordern',
printOptions: 'Druckoptionen',
bedLevelling: 'Bett-Nivellierung',
flowCalibration: 'Fluss-Kalibrierung',
vibrationCalibration: 'Vibrations-Kalibrierung',
layerInspection: 'Erste-Schicht-Prüfung',
timelapse: 'Zeitraffer',
useAms: 'AMS verwenden',
applyChanges: 'Änderungen übernehmen',
selectAll: 'Alle auswählen',
deselectAll: 'Auswahl aufheben',
selected: '{{count}} ausgewählt',
editSelected: 'Ausgewählte bearbeiten',
cancelSelected: 'Ausgewählte abbrechen',
},
// Confirmations
confirm: {
cancelTitle: 'Geplanten Druck abbrechen',
cancelMessage: 'Möchten Sie "{{name}}" wirklich abbrechen?',
stopTitle: 'Druck stoppen',
stopMessage: 'Möchten Sie den aktuellen Druck "{{name}}" wirklich stoppen? Der Druckauftrag wird am Drucker abgebrochen.',
removeTitle: 'Aus Verlauf entfernen',
removeMessage: 'Möchten Sie "{{name}}" wirklich aus dem Warteschlangenverlauf entfernen?',
clearHistoryTitle: 'Verlauf löschen',
clearHistoryMessage: 'Möchten Sie alle {{count}} Element(e) aus dem Verlauf entfernen?',
cancelButton: 'Druck abbrechen',
stopButton: 'Druck stoppen',
thisPrint: 'diesen Druck',
thisItem: 'dieses Element',
},
// Toast messages
toast: {
cancelled: 'Warteschlangenelement abgebrochen',
cancelFailed: 'Element konnte nicht abgebrochen werden',
removed: 'Warteschlangenelement entfernt',
removeFailed: 'Element konnte nicht entfernt werden',
stopped: 'Druck gestoppt',
stopFailed: 'Druck konnte nicht gestoppt werden',
released: 'Druck in Warteschlange freigegeben',
startFailed: 'Druck konnte nicht gestartet werden',
reorderFailed: 'Warteschlange konnte nicht neu geordnet werden',
historyCleared: '{{count}} Verlaufselement(e) gelöscht',
clearHistoryFailed: 'Verlauf konnte nicht gelöscht werden',
updateFailed: 'Elemente konnten nicht aktualisiert werden',
bulkCancelled: '{{count}} Element(e) abgebrochen',
bulkCancelFailed: 'Elemente konnten nicht abgebrochen werden',
},
// Timeline view
timeline: {
listView: 'Liste',
timelineView: 'Zeitstrahl',
unassigned: 'Nicht zugewiesen',
noData: 'Keine geplanten Drucke für diesen Tag',
allDoneBy: 'Alle Drucke voraussichtlich fertig um {{time}}',
staged: 'Bereitgestellt',
filterAll: 'Alle anzeigen',
filterPrinting: 'Druckend',
filterQueued: 'Warteschlange',
time: {
anyMoment: 'jeden Moment',
minutesLeft: '{{minutes}}m übrig',
hoursLeft: '{{hours}}h übrig',
hoursMinutesLeft: '{{hours}}h {{minutes}}m übrig',
},
day: {
previous: 'Vorheriger Tag',
next: 'Nächster Tag',
today: 'Heute',
},
},
// Permissions
permissions: {
noStopPrint: 'Sie haben keine Berechtigung, Drucke zu stoppen',
noStartPrint: 'Sie haben keine Berechtigung, Drucke zu starten',
noEdit: 'Sie haben keine Berechtigung, dieses Warteschlangenelement zu bearbeiten',
noCancel: 'Sie haben keine Berechtigung, dieses Warteschlangenelement abzubrechen',
noRequeue: 'Sie haben keine Berechtigung, Elemente erneut einzureihen',
noRemove: 'Sie haben keine Berechtigung, dieses Warteschlangenelement zu entfernen',
noClearHistory: 'Sie haben keine Berechtigung, den gesamten Verlauf zu löschen',
noEditItems: 'Sie haben keine Berechtigung, Warteschlangenelemente zu bearbeiten',
noCancelItems: 'Sie haben keine Berechtigung, Warteschlangenelemente abzubrechen',
},
},
backgroundDispatch: {
unknownFile: 'Unbekannte Datei',
unknownPrinter: 'Unbekannter Drucker',
startingPrints: 'Starte Drucke',
progressSummary: '{{complete}}/{{total}} abgeschlossen • Geplant: {{dispatched}} • In Bearbeitung: {{processing}}',
expandDetails: 'Dispatch-Details ausklappen',
collapseDetails: 'Dispatch-Details einklappen',
dismissToast: 'Dispatch-Hinweis schließen',
cancelDispatchJob: 'Dispatch-Job abbrechen',
cancel: 'Abbrechen',
cancelling: 'Wird abgebrochen…',
awaitingPrinter: 'Warte auf Drucker…',
status: {
dispatched: 'Geplant',
processing: 'In Bearbeitung',
completed: 'Abgeschlossen',
failed: 'Fehlgeschlagen',
cancelled: 'Abgebrochen',
},
toast: {
cancellingUpload: 'Upload wird abgebrochen...',
cancelled: 'Dispatch abgebrochen',
cancelFailed: 'Dispatch konnte nicht abgebrochen werden',
completeWithFailures: 'Background Dispatch abgeschlossen: {{completed}} erfolgreich, {{failed}} fehlgeschlagen',
completeSuccess: 'Background Dispatch abgeschlossen: {{completed}} erfolgreich',
printStartedRemaining: '{{completed}} Druck(e) gestartet, {{remaining}} weitere werden gesendet...',
},
},
// Statistics page
stats: {
title: 'Statistiken',
subtitle: 'Widgets zum Neuanordnen ziehen. Auf das Augensymbol klicken zum Ausblenden.',
overview: 'Übersicht',
totalPrints: 'Gesamtdrucke',
successRate: 'Erfolgsrate',
totalPrintTime: 'Gesamtdruckzeit',
printTime: 'Druckzeit',
totalFilament: 'Gesamtverbrauch Filament',
filamentUsed: 'Filamentverbrauch',
filamentCost: 'Filamentkosten',
totalCost: 'Gesamtkosten',
energyUsed: 'Energieverbrauch',
energyCost: 'Energiekosten',
energyWarmingUpTooltip: 'Die Energieerfassung sammelt noch stündliche Snapshots. Zeitraumwerte werden genau, sobald vor dem gewählten Bereich mindestens ein Snapshot vorliegt. Frühe Werte können zu niedrig sein.',
averagePrintTime: 'Durchschnittliche Druckzeit',
printsPerDay: 'Drucke pro Tag',
byPrinter: 'Nach Drucker',
printsByPrinter: 'Drucke nach Drucker',
byMaterial: 'Nach Material',
byMonth: 'Nach Monat',
last7Days: 'Letzte 7 Tage',
last30Days: 'Letzte 30 Tage',
last90Days: 'Letzte 90 Tage',
allTime: 'Gesamt',
// Widgets
quickStats: 'Schnellstatistiken',
printActivity: 'Druckaktivität',
filamentTypes: 'Filamenttypen',
filamentTrends: 'Filamenttrends',
failureAnalysis: 'Fehleranalyse',
timeAccuracy: 'Zeitgenauigkeit',
successful: 'Erfolgreich:',
failed: 'Fehlgeschlagen:',
perfectEstimate: '100% = perfekte Schätzung',
noTimeAccuracyData: 'Noch keine Zeitgenauigkeitsdaten',
noFilamentData: 'Keine Filamentdaten verfügbar',
noPrinterData: 'Keine Druckerdaten verfügbar',
noPrintData: 'Keine Druckdaten verfügbar',
noPrintDataLast30Days: 'Keine Druckdaten in den letzten 30 Tagen',
failureReasons: 'Fehlerursachen',
topFailureReasons: 'Häufigste Fehlerursachen',
failedPrintsCount: '{{failed}} / {{total}} Drucke fehlgeschlagen',
lastWeekRate: 'Letzte Woche: {{rate}}%',
// Actions
resetLayout: 'Layout zurücksetzen',
recalculateCosts: 'Kosten neu berechnen',
recalculateCostsHint: 'Alle Archivkosten mit aktuellen Filamentpreisen neu berechnen',
exportStats: 'Statistiken exportieren',
exportAsCsv: 'Als CSV exportieren',
exportAsExcel: 'Als Excel exportieren',
hiddenCount: '{{count}} ausgeblendet',
// Toast
exportDownloaded: 'Export heruntergeladen',
exportFailed: 'Export fehlgeschlagen',
layoutReset: 'Layout zurückgesetzt',
recalculatedCosts: 'Kosten für {{count}} Archive neu berechnet',
recalculateFailed: 'Kosten konnten nicht neu berechnet werden',
// Loading
loadingStats: 'Statistiken werden geladen...',
// Permissions
noPermissionResetLayout: 'Sie haben keine Berechtigung, das Layout zurückzusetzen',
noPermissionRecalculate: 'Sie haben keine Berechtigung, Kosten neu zu berechnen',
noPrintDataInRange: 'Keine Druckdaten im ausgewählten Zeitraum',
periodFilament: 'Filamentverbrauch',
periodCost: 'Kosten',
avgPerPrint: 'Durchschnitt pro Druck',
usageOverTime: 'Verbrauch im Zeitverlauf',
filamentByWeight: 'Gewicht',
printDuration: 'Druckdauer',
printerUtilization: 'Druckerauslastung',
filamentSuccess: 'Erfolg nach Material',
printHabits: 'Druckgewohnheiten',
printTimeOfDay: 'Druck-Tageszeit',
colorDistribution: 'Farbverteilung',
noColorData: 'Keine Farbdaten verfügbar',
records: 'Rekorde',
longestPrint: 'Längster Druck',
heaviestPrint: 'Schwerster Druck',
mostExpensivePrint: 'Teuerster Druck',
busiestDay: 'Aktivster Tag',
successStreak: 'Erfolgsserie',
streakPrint: 'aufeinanderfolgender Druck',
streakPrints: '{{count}} aufeinanderfolgende Drucke',
printerStats: 'Druckerstatistiken',
hours: 'Stunden',
avgPrints: 'Ø Drucke',
noArchiveData: 'Keine Druckdaten verfügbar',
filamentByTime: 'Zeitverlauf',
avgWeight: 'Ø Gewicht',
avgTime: 'Ø Zeit',
filamentByPrints: 'Drucke',
timeframe: {
'today': 'Heute',
'this-week': 'Diese Woche',
'this-month': 'Dieser Monat',
'last-7': 'Letzte 7 Tage',
'last-30': 'Letzte 30 Tage',
'last-90': 'Letzte 90 Tage',
'this-year': 'Dieses Jahr',
'all-time': 'Gesamt',
'custom': 'Benutzerdefiniert',
from: 'Von',
to: 'Bis',
},
allUsers: 'Alle Benutzer',
noUser: 'Kein Benutzer (System)',
filterByUser: 'Nach Benutzer filtern',
},
// Maintenance page
maintenance: {
title: 'Wartung',
overview: 'Übersicht',
allOk: 'Alle Wartungen aktuell',
dueCount: '{{count}} Aufgabe fällig',
dueCount_plural: '{{count}} Aufgaben fällig',
warningCount: '{{count}} Warnung',
warningCount_plural: '{{count}} Warnungen',
totalPrintTime: 'Gesamtdruckzeit',
nextMaintenance: 'Nächste Wartung',
nothingDue: 'Nichts fällig',
tasks: 'Aufgaben',
lastPerformed: 'Zuletzt durchgeführt',
interval: 'Intervall',
hoursRemaining: '{{hours}}h verbleibend',
hoursOverdue: '{{hours}}h überfällig',
markDone: 'Als erledigt markieren',
performMaintenance: 'Wartung durchführen',
history: 'Verlauf',
noHistory: 'Kein Wartungsverlauf',
editPrintHours: 'Druckstunden bearbeiten',
currentHours: 'Aktuelle Stunden',
// Tabs
statusTab: 'Status',
settingsTab: 'Einstellungen',
// Status
overdueCount: '{{count}} überfällig',
dueSoonCount: '{{count}} bald fällig',
dueSoon: 'Bald fällig',
allGood: 'Alles in Ordnung',
overdueBy: 'Überfällig um {{duration}}',
dueIn: 'Fällig in {{duration}}',
timeLeft: '{{duration}} verbleibend',
// Duration formats
day: '1 Tag',
days: '{{count}} Tage',
week: '1 Woche',
weeks: '{{count}} Wochen',
month: '1 Monat',
months: '{{count}} Monate',
year: '1 Jahr',
// Settings
maintenanceTypes: 'Wartungstypen',
maintenanceTypesDescription: 'Systemtypen und Ihre benutzerdefinierten Wartungsaufgaben',
addCustomType: 'Benutzerdefinierten Typ hinzufügen',
restoreDefaults: 'Standardaufgaben wiederherstellen',
intervalType: 'Intervalltyp',
intervalValue: 'Intervall ({{type}})',
icon: 'Symbol',
documentationLink: 'Dokumentationslink (optional)',
assignToPrinters: 'Druckern zuweisen',
selectAtLeastOnePrinter: 'Wählen Sie mindestens einen Drucker',
addType: 'Typ hinzufügen',
custom: 'Benutzerdefiniert',
printHours: 'Druckstunden',
calendarDays: 'Kalendertage',
exampleName: 'z.B. HEPA-Filter ersetzen',
viewDocumentation: 'Dokumentation anzeigen',
timeBasedInterval: 'Zeitbasiertes Intervall',
// Interval overrides
intervalOverrides: 'Intervall-Überschreibungen',
intervalOverridesDescription: 'Intervalle für bestimmte Drucker anpassen',
// Printer assignment
assignedToPrinters: 'Druckern zugewiesen:',
noPrintersAssigned: 'Keine Drucker zugewiesen',
addPrinterShort: 'Hinzufügen:',
printersAssignedClick: '{{count}} Drucker zugewiesen - klicken zum Verwalten',
removeFromPrinter: 'Von diesem Drucker entfernen',
// Types
types: {
lubricateCarbonRods: 'Karbonstäbe schmieren',
lubricateRails: 'Linearschienen schmieren',
cleanNozzle: 'Düse/Hotend reinigen',
checkBelts: 'Riemenspannung prüfen',
cleanBuildPlate: 'Druckbett reinigen',
checkExtruder: 'Extruderzahnräder prüfen',
checkCooling: 'Kühlungslüfter prüfen',
generalInspection: 'Allgemeine Inspektion',
cleanCarbonRods: 'Kohlenstoffstangen reinigen',
lubricateSteelRods: 'Stahlstangen schmieren',
cleanSteelRods: 'Stahlstangen reinigen',
cleanLinearRails: 'Linearschienen reinigen',
checkPtfeTube: 'PTFE-Schlauch prüfen',
replaceHepaFilter: 'HEPA-Filter ersetzen',
replaceCarbonFilter: 'Aktivkohlefilter ersetzen',
lubricateLeftNozzleRail: 'Linke Düsenschiene schmieren',
},
// Toast
maintenanceComplete: 'Wartung als abgeschlossen markiert',
typeUpdated: 'Wartungstyp aktualisiert',
typeDeleted: 'Wartungstyp gelöscht',
defaultsRestored: '{{count}} Standardaufgabe(n) wiederhergestellt',
printHoursUpdated: 'Druckstunden aktualisiert',
printerAssigned: 'Drucker zugewiesen',
printerRemoved: 'Drucker entfernt',
// Confirmation
deleteTypeConfirm: '"{{name}}" löschen?',
deleteSystemTypeTitle: 'Standard-Wartungsaufgabe löschen?',
deleteSystemTypeMessage: 'Möchten Sie die Standard-Wartungsaufgabe "{{name}}" wirklich löschen?',
// Permissions
noPermissionUpdate: 'Sie haben keine Berechtigung, Wartungselemente zu aktualisieren',
noPermissionPerform: 'Sie haben keine Berechtigung, Wartungen durchzuführen',
noPermissionEditTypes: 'Sie haben keine Berechtigung, Wartungstypen zu bearbeiten',
noPermissionDeleteTypes: 'Sie haben keine Berechtigung, Wartungstypen zu löschen',
noPermissionEditHours: 'Sie haben keine Berechtigung, Druckstunden zu bearbeiten',
noPermissionRemovePrinter: 'Sie haben keine Berechtigung, Druckerzuweisungen zu entfernen',
noPermissionAssignPrinter: 'Sie haben keine Berechtigung, Drucker zuzuweisen',
noPermissionEditIntervals: 'Sie haben keine Berechtigung, Intervalle zu bearbeiten',
// Configure link
configureSettings: 'Wartungstypen und Intervalle konfigurieren',
},
// Settings page
settings: {
title: 'Einstellungen',
general: 'Allgemein',
// Tab names
tabs: {
general: 'Allgemein',
smartPlugs: 'Smart Plugs',
notifications: 'Benachrichtigungen',
queue: 'Workflow',
filament: 'Filament',
network: 'Netzwerk',
apiKeys: 'API-Schlüssel',
virtualPrinter: 'Virtueller Drucker',
spoolbuddy: 'SpoolBuddy',
failureDetection: 'Fehlererkennung',
users: 'Authentifizierung',
backup: 'Sicherung',
emailAuth: 'E-Mail-Authentifizierung',
ldap: 'LDAP',
twoFa: 'Zwei-Faktor-Auth',
oidc: 'SSO / OIDC',
security: 'Sicherheit',
},
spoolbuddy: {
infoTitle: 'SpoolBuddy-Geräte',
infoBody: 'SpoolBuddy-Kioske registrieren sich automatisch per Heartbeat. Ein Gerät hier abmelden, wenn es nicht mehr verwendet wird oder wenn ein veralteter Eintrag nach einem Daemon-Absturz übrig geblieben ist.',
duplicatesTitle: '{{count}} Geräte registriert',
duplicatesBody: 'Die Kiosk-Oberfläche verwendet nur das zuerst registrierte Gerät. Falls eines davon ein veralteter Doppeleintrag nach einem Absturz ist, kann es hier entfernt werden — ein laufendes Gerät registriert sich beim nächsten Heartbeat automatisch neu.',
empty: 'Noch keine SpoolBuddy-Geräte registriert.',
online: 'Online',
offline: 'Offline',
unregister: 'Abmelden',
unregisterSuccess: 'Gerät abgemeldet',
unregisterError: 'Gerät konnte nicht abgemeldet werden',
confirmTitle: 'SpoolBuddy-Gerät abmelden?',
confirmBody: 'Dies entfernt „{{hostname}}" ({{deviceId}}) aus der Datenbank. Ein laufendes Gerät registriert sich beim nächsten Heartbeat automatisch neu.',
ipAddress: 'IP-Adresse',
firmware: 'Firmware',
lastSeen: 'Zuletzt gesehen',
daemonUptime: 'Daemon-Laufzeit',
systemUptime: 'System-Laufzeit',
never: 'nie',
nfc: 'NFC',
scale: 'Waage',
cpuTemp: 'CPU-Temp.',
memory: 'Speicher',
disk: 'Festplatte',
update: 'Aktualisieren',
updateConfirmTitle: 'Spoolbuddy-Daemon aktualisieren?',
updateConfirmBody: 'Software-Update auf „{{hostname}}" auslösen? Der Daemon startet nach dem Update neu.',
restartBrowser: 'Browser neu starten',
restartBrowserConfirmTitle: 'Kiosk-Browser neu starten?',
restartBrowserConfirmBody: 'Kiosk-Browser auf „{{hostname}}" neu starten? Die Anzeige wird kurz schwarz.',
restartDaemon: 'Daemon neu starten',
restartDaemonConfirmTitle: 'Spoolbuddy-Daemon neu starten?',
restartDaemonConfirmBody: 'Spoolbuddy-Daemon auf „{{hostname}}" neu starten? Das Gerät ist für einige Sekunden offline.',
reboot: 'Neustart',
rebootConfirmTitle: 'Gerät neu starten?',
rebootConfirmBody: '„{{hostname}}" neu starten? Das Gerät ist für etwa eine Minute offline.',
shutdown: 'Herunterfahren',
shutdownConfirmTitle: 'Gerät herunterfahren?',
shutdownConfirmBody: '„{{hostname}}" herunterfahren? Physischer Zugriff ist nötig, um es wieder einzuschalten.',
commandConfirm: 'Bestätigen',
commandQueued: 'Befehl eingereiht',
commandError: 'Befehl konnte nicht gesendet werden',
},
ldap: {
title: 'LDAP-Authentifizierung',
enabledDesc: 'LDAP-Authentifizierung ist aktiviert',
disabledDesc: 'LDAP-Authentifizierung ist deaktiviert',
disabledHint: 'LDAP-Einstellungen unten konfigurieren und speichern, dann aktivieren.',
enabled: 'LDAP-Authentifizierung aktiviert',
disabled: 'LDAP-Authentifizierung deaktiviert',
feature1: 'Benutzer können sich mit LDAP-Anmeldedaten anmelden',
feature2: 'Lokales Admin-Konto bleibt als Fallback erhalten',
feature3: 'LDAP-Gruppen werden bei der Anmeldung BamBuddy-Gruppen zugeordnet',
serverConfig: 'LDAP-Server-Konfiguration',
serverUrl: 'Server-URL',
serverUrlHint: 'Verwenden Sie ldap:// für Standard oder ldaps:// für SSL-Verbindungen',
security: 'Sicherheit',
securityHint: 'StartTLS aktualisiert eine einfache Verbindung auf TLS. LDAPS verwendet TLS von Anfang an.',
bindDn: 'Bind-DN (Dienstkonto)',
bindPassword: 'Bind-Passwort',
searchBase: 'Such-Basis-DN',
userFilter: 'Benutzer-Suchfilter',
userFilterHint: '{username} wird durch den Anmeldenamen ersetzt. Verwenden Sie (uid={username}) für OpenLDAP.',
advanced: 'Erweitert',
autoProvision: 'Benutzer automatisch anlegen',
autoProvisionHint: 'Automatisch ein BamBuddy-Konto bei der ersten LDAP-Anmeldung erstellen',
defaultGroup: 'Standardgruppe',
defaultGroupNone: '— Keine (kein Fallback) —',
defaultGroupHint: 'Fallback-Gruppe, die zugewiesen wird, wenn sich ein LDAP-Benutzer authentifiziert, aber in keiner zugeordneten LDAP-Gruppe enthalten ist. Leer lassen, um nicht zugeordnete Benutzer ohne Berechtigungen zu belassen.',
groupMapping: 'Gruppenzuordnung (JSON)',
groupMappingHint: 'LDAP-Gruppen-DNs BamBuddy-Gruppen zuordnen. Verfügbare Gruppen: ',
testConnection: 'Verbindung testen',
settingsSaved: 'LDAP-Einstellungen gespeichert',
errors: {
serverRequired: 'LDAP-Server-URL ist erforderlich',
searchBaseRequired: 'Such-Basis-DN ist erforderlich',
enableAuthFirst: 'Authentifizierung zuerst aktivieren',
configureLdapFirst: 'LDAP-Einstellungen zuerst speichern',
},
},
// Email settings
email: {
smtpSettings: 'SMTP-Konfiguration',
smtpHost: 'SMTP-Server',
smtpPort: 'SMTP-Port',
security: 'Sicherheit',
authentication: 'Authentifizierung',
username: 'Benutzername',
password: 'Passwort',
fromEmail: 'Absender-E-Mail',
fromName: 'Absendername',
testConnection: 'SMTP-Verbindung testen',
testRecipient: 'Test-Empfänger-E-Mail',
sendTest: 'Test-E-Mail senden',
sending: 'Wird gesendet...',
save: 'Einstellungen speichern',
saving: 'Wird gespeichert...',
advancedAuth: 'Erweiterte Authentifizierung',
advancedAuthEnabled: 'Erweiterte Authentifizierung ist aktiviert',
advancedAuthEnabledDesc: 'E-Mail-basierte Benutzerverwaltungsfunktionen sind aktiv. Neue Benutzer erhalten automatisch generierte Passwörter per E-Mail und können ihr Passwort über die Passwort vergessen Funktion zurücksetzen.',
advancedAuthDisabled: 'Erweiterte Authentifizierung ist deaktiviert',
advancedAuthDisabledDesc: 'Aktivieren Sie die erweiterte Authentifizierung, um E-Mail-basierte Funktionen für die Benutzerverwaltung zu aktivieren.',
enable: 'Aktivieren',
disable: 'Deaktivieren',
feature1: 'Passwörter werden automatisch generiert und an neue Benutzer gesendet',
feature2: 'Benutzer können sich mit Benutzername oder E-Mail anmelden',
feature3: 'Passwort vergessen Funktion ist verfügbar',
feature4: 'Administratoren können Benutzerpasswörter per E-Mail zurücksetzen',
// Error messages
errors: {
requiredFields: 'Bitte füllen Sie alle Pflichtfelder aus',
usernameRequired: 'Benutzername ist erforderlich, wenn Authentifizierung aktiviert ist',
enterTestEmail: 'Bitte geben Sie eine Test-E-Mail-Adresse ein',
smtpServerAndEmail: 'Bitte füllen Sie SMTP-Server und Absender-E-Mail aus, bevor Sie testen',
usernamePasswordRequired: 'Benutzername und Passwort sind erforderlich, wenn Authentifizierung aktiviert ist',
configureSmtpFirst: 'Bitte konfigurieren und testen Sie zuerst die SMTP-Einstellungen',
enableAuthFirst: 'Bitte aktivieren Sie zuerst die Authentifizierung, um E-Mail-basierte Funktionen nutzen zu können.',
},
// Success messages
success: {
settingsSaved: 'SMTP-Einstellungen erfolgreich gespeichert',
},
// Security options
securityOptions: {
starttls: 'STARTTLS (Port 587)',
ssl: 'SSL/TLS (Port 465)',
none: 'Keine (Port 25)',
},
// Authentication options
authOptions: {
enabled: 'Aktiviert',
disabled: 'Deaktiviert',
},
},
appearance: 'Erscheinungsbild',
notifications: 'Benachrichtigungen',
smartPlugs: 'Smart Plugs',
spoolman: 'Spoolman',
updates: 'Aktualisierungen',
language: 'Sprache',
languageDescription: 'Wählen Sie Ihre bevorzugte Sprache',
theme: 'Design',
themeLight: 'Hell',
themeDark: 'Dunkel',
themeSystem: 'System',
defaultView: 'Standardansicht',
defaultViewDescription: 'Seite, die beim Öffnen der App angezeigt wird',
checkForUpdates: 'Nach Updates suchen',
autoUpdate: 'Automatische Updates',
currentVersion: 'Aktuelle Version',
latestVersion: 'Neueste Version',
upToDate: 'Sie sind auf dem neuesten Stand',
updateAvailable: 'Update verfügbar',
// Notifications
notificationLanguage: 'Benachrichtigungssprache',
notificationLanguageDescription: 'Sprache für Push-Benachrichtigungen',
bedCooledThreshold: 'Bett-Abkühlung Schwellenwert',
bedCooledThresholdDescription: 'Temperatur, unter der das Bett nach einem Druck als abgekühlt gilt',
userNotificationsEnabled: 'Benutzerbenachrichtigungen',
userNotificationsEnabledDescription: 'Aktiviert das Benutzerbenachrichtigungsmenü und E-Mail-Benachrichtigungen für Druckereignisse. Erfordert Erweiterte Authentifizierung.',
userNotificationsDisabledHint: 'Erweiterte Authentifizierung aktivieren, um Benutzerbenachrichtigungen zu verwenden.',
notificationProviders: 'Benachrichtigungsanbieter',
addProvider: 'Anbieter hinzufügen',
editProvider: 'Anbieter bearbeiten',
providerType: 'Anbietertyp',
testNotification: 'Testbenachrichtigung',
testSuccess: 'Testbenachrichtigung erfolgreich gesendet',
testFailed: 'Testbenachrichtigung konnte nicht gesendet werden',
quietHours: 'Ruhezeiten',
quietHoursDescription: 'Keine Störungen während dieser Zeiten',
quietHoursStart: 'Beginn',
quietHoursEnd: 'Ende',
events: {
title: 'Benachrichtigungsereignisse',
printStart: 'Druck gestartet',
printComplete: 'Druck abgeschlossen',
printFailed: 'Druck fehlgeschlagen',
printStopped: 'Druck gestoppt',
printProgress: 'Fortschrittsmeldungen',
printProgressDescription: 'Bei 25%, 50%, 75% benachrichtigen',
printerOffline: 'Drucker offline',
printerError: 'Druckerfehler',
filamentLow: 'Filament niedrig',
maintenanceDue: 'Wartung fällig',
maintenanceDueDescription: 'Benachrichtigen, wenn Wartung erforderlich',
},
// Smart Plugs
smartPlug: {
title: 'Smart Plugs',
add: 'Smart Plug hinzufügen',
edit: 'Smart Plug bearbeiten',
name: 'Name',
ipAddress: 'IP-Adresse',
linkedPrinter: 'Verknüpfter Drucker',
autoOn: 'Automatisch einschalten',
autoOnDescription: 'Einschalten beim Druckstart',
autoOff: 'Automatisch ausschalten',
autoOffDescription: 'Ausschalten nach Druckende',
offDelay: 'Ausschaltverzögerung',
offDelayMinutes: 'Minuten nach Druck',
offDelayTemp: 'Wenn Düse unter Temperatur',
currentState: 'Aktueller Status',
turnOn: 'Einschalten',
turnOff: 'Ausschalten',
},
// Filament Tracking Mode
filamentTracking: 'Filament-Verfolgung',
filamentTrackingDesc: 'Wählen Sie, wie Sie Ihre Filamentspulen verfolgen möchten. Sie können das integrierte Inventar oder einen externen Spoolman-Server verwenden.',
filamentChecks: 'Filament-Prüfungen',
disableFilamentWarnings: 'Filament-Warnungen deaktivieren',
disableFilamentWarningsDesc: 'Keine Warnungen über unzureichendes Filament beim Drucken oder Einreihen anzeigen',
preferLowestFilament: 'Niedrigsten Filamentrest bevorzugen',
preferLowestFilamentDesc: 'Bei mehreren passenden Spulen die mit dem geringsten Restfilament verwenden',
trackingModeBuiltIn: 'Integriertes Inventar',
trackingModeBuiltInDesc: 'RFID-Erkennung und Verbrauchserfassung inklusive',
trackingModeSpoolmanDesc: 'Externer Filament-Management-Server',
builtInFeatureRfid: 'Erkennt automatisch Bambu Lab RFID-Spulen im AMS',
builtInFeatureUsage: 'Erfasst den Filamentverbrauch pro Druck',
builtInFeatureCatalog: 'Spulen, Farben und K-Faktor-Profile verwalten',
builtInFeatureThirdParty: 'Drittanbieter-Spulen können Inventarspulen zugewiesen werden',
amsSyncButton: 'Gewichte vom AMS synchronisieren',
amsSyncTitle: 'Spulengewichte vom AMS synchronisieren',
amsSyncMessage: 'Alle Inventar-Spulengewichte werden mit den aktuellen AMS-Restwerten der verbundenen Drucker überschrieben. Verwenden Sie dies zur Wiederherstellung beschädigter Gewichtsdaten. Drucker müssen online sein.',
amsSyncing: 'Synchronisiere...',
amsSyncSuccess: '{{synced}} Spule(n) synchronisiert, {{skipped}} übersprungen',
amsSyncError: 'Synchronisierung der Gewichte vom AMS fehlgeschlagen',
spoolmanAmsSyncButton: 'Spoolman-Gewichte vom AMS synchronisieren',
spoolmanAmsSyncTitle: 'Spoolman-Spulengewichte vom AMS synchronisieren',
spoolmanAmsSyncMessage: 'Dabei werden alle Spoolman-Spulengewichte anhand der aktuellen AMS-Füllstandswerte der verbundenen Drucker aktualisiert. Die Drucker müssen online sein.',
spoolmanAmsSyncing: 'Synchronisiere...',
spoolmanAmsSyncSuccess: '{{synced}} Spule(n) synchronisiert, {{skipped}} übersprungen',
spoolmanAmsSyncError: 'Synchronisierung der Spoolman-Gewichte vom AMS fehlgeschlagen',
spoolmanAmsSyncErrorUnreachable: 'Synchronisierung fehlgeschlagen (Spoolman nicht erreichbar)',
spoolmanAmsSyncErrorNotConfigured: 'Synchronisierung fehlgeschlagen (Spoolman nicht konfiguriert)',
spoolmanNotConfigured: 'Spoolman nicht konfiguriert',
// Spoolman filament catalog section in spool catalog settings
spoolmanFilamentCatalogTitle: 'Spoolman-Filamentkatalog',
spoolmanFilamentCatalogDesc: 'Filamentnamen und Leergewichte aus deiner Spoolman-Instanz. Name und Spulengewicht sind hier editierbar; alle anderen Eigenschaften werden direkt in Spoolman verwaltet.',
// Spoolman settings
spoolmanUrl: 'Spoolman URL',
spoolmanUrlHint: 'URL Ihres Spoolman-Servers (z.B. http://localhost:7912)',
spoolmanConnected: 'Verbunden',
spoolmanDisconnected: 'Nicht verbunden',
status: 'Status',
connect: 'Verbinden',
disconnect: 'Trennen',
howSyncWorks: 'So funktioniert die Synchronisierung',
syncInfoRfidOnly: 'Nur offizielle Bambu Lab Spulen mit RFID werden synchronisiert',
syncInfoAutoCreate: 'Neue Spulen werden bei der ersten Synchronisierung automatisch in Spoolman erstellt',
syncInfoThirdPartySkipped: 'Nicht-Bambu-Lab-Spulen (Drittanbieter, nachgefüllt) werden übersprungen',
linkingExistingSpools: 'Vorhandene Spulen verknüpfen',
linkingExistingSpoolsDesc: 'Um vorhandene Spoolman-Spulen mit Ihrem AMS zu verknüpfen, fahren Sie über einen AMS-Slot und klicken Sie auf "Mit Spoolman verknüpfen".',
syncMode: 'Synchronisierungsmodus',
syncModeAuto: 'Automatisch',
syncModeManual: 'Nur manuell',
syncModeAutoDesc: 'AMS-Daten werden automatisch synchronisiert, wenn Änderungen erkannt werden',
syncModeManualDesc: 'Nur bei manueller Auslösung synchronisieren',
syncAmsData: 'AMS-Daten synchronisieren',
syncAmsDataDesc: 'AMS-Daten des Druckers manuell mit Spoolman synchronisieren',
allPrinters: 'Alle Drucker',
// Default printer
noDefaultPrinter: 'Kein Standard (jedes Mal fragen)',
// Sidebar
sidebarOrder: 'Seitenleisten-Reihenfolge',
// Camera
saveThumbnails: 'Vorschaubilder speichern',
captureFinishPhoto: 'Abschlussfoto aufnehmen',
noPrintersConfigured: 'Keine Drucker konfiguriert',
// Archive settings
archiveMode: {
always: 'Immer Archiveintrag erstellen',
never: 'Nie Archiveintrag erstellen',
ask: 'Jedes Mal fragen',
},
// Updates
checkForUpdatesLabel: 'Nach Updates suchen',
checkPrinterFirmware: 'Drucker-Firmware prüfen',
includeBetaUpdates: 'Beta-Versionen einschließen',
includeBetaUpdatesDesc: 'Über Beta- und Vorabversionen bei der Updateprüfung benachrichtigen',
// Queue
enableRetry: 'Wiederholung aktivieren',
// Home Assistant
homeAssistantDescription: 'Smart Plugs über Home Assistant steuern',
environmentManagedLabel: '(Umgebungsvariable)',
autoEnabledViaEnv: 'Automatisch über Umgebungsvariablen aktiviert',
urlFromEnvReadOnly: 'Wert wird über HA_URL Umgebungsvariable gesetzt (schreibgeschützt)',
tokenFromEnvReadOnly: 'Wert wird über HA_TOKEN Umgebungsvariable gesetzt (schreibgeschützt)',
// MQTT
mqttConnectedTo: 'Verbunden mit',
// Prometheus
prometheusDescription: 'Druckerdaten im Prometheus-Format bereitstellen',
// Smart plugs empty state
noSmartPlugsTitle: 'Keine Smart Plugs konfiguriert',
noSmartPlugsDescription: 'Fügen Sie einen Tasmota-basierten Smart Plug hinzu, um den Energieverbrauch zu verfolgen und die Stromsteuerung zu automatisieren.',
// Notifications empty state
noProvidersTitle: 'Keine Anbieter konfiguriert',
noProvidersDescription: 'Fügen Sie einen Anbieter hinzu, um Benachrichtigungen zu erhalten.',
noTemplatesAvailable: 'Keine Vorlagen verfügbar. Starten Sie das Backend neu, um Standardvorlagen zu laden.',
// API permissions
apiPermissionView: 'Druckerstatus und Warteschlange anzeigen',
apiPermissionEdit: 'Elemente zur Druckwarteschlange hinzufügen und entfernen',
// API keys
apiKeysEmptyTitle: 'Keine API-Schlüssel',
apiKeysEmptyDescription: 'Erstellen Sie einen API-Schlüssel zur Integration mit externen Diensten.',
// Users
noUsersFound: 'Keine Benutzer gefunden',
noGroupsFound: 'Keine Gruppen gefunden',
noGroupsAvailable: 'Keine Gruppen verfügbar',
passwordsDoNotMatch: 'Passwörter stimmen nicht überein',
systemGroupWarning: 'System-Gruppennamen können nicht geändert werden',
// Auth disabled
authDisabledTitle: 'Authentifizierung ist deaktiviert',
authDisabledFeature1: 'Anmeldung zum Zugriff auf das System erforderlich',
authDisabledFeature2: 'Mehrere Benutzer mit gruppenbasierten Berechtigungen erstellen',
authDisabledFeature3: 'Zugriff mit über 50 granularen Berechtigungen steuern',
// User deletion
userHasCreated: 'Dieser Benutzer hat erstellt:',
userItemsQuestion: 'Was möchten Sie mit diesen Elementen tun?',
deleteUserConfirm: 'Möchten Sie diesen Benutzer wirklich löschen?',
actionCannotBeUndone: 'Diese Aktion kann nicht rückgängig gemacht werden.',
// Smart plugs
addFirstSmartPlug: 'Ersten Smart Plug hinzufügen',
// Notifications
providers: 'Anbieter',
log: 'Protokoll',
testAll: 'Alle testen',
testResults: 'Testergebnisse',
testPassedCount: '{{count}} bestanden',
testFailedCount: '{{count}} fehlgeschlagen',
messageTemplates: 'Nachrichtenvorlagen',
messageTemplatesDescription: 'Passen Sie Benachrichtigungen für jedes Ereignis an.',
// API Keys section
apiKeys: 'API-Schlüssel',
apiKeysDescription: 'Erstellen Sie API-Schlüssel für externe Integrationen und Webhooks.',
createKey: 'Schlüssel erstellen',
apiKeyCreated: 'API-Schlüssel erfolgreich erstellt',
apiKeyCopyWarning: 'Kopieren Sie diesen Schlüssel jetzt - er wird nicht mehr angezeigt!',
useInApiBrowser: 'Im API-Browser verwenden',
createNewApiKey: 'Neuen API-Schlüssel erstellen',
keyName: 'Schlüsselname',
keyNamePlaceholder: 'z.B. Home Assistant, OctoPrint',
readStatus: 'Status lesen',
readStatusDescription: 'Druckerstatus und Warteschlange anzeigen',
manageQueue: 'Warteschlange verwalten',
manageQueueDescription: 'Elemente zur Druckwarteschlange hinzufügen und entfernen',
controlPrinter: 'Drucker steuern',
controlPrinterDescription: 'Drucke pausieren, fortsetzen und stoppen',
cloudAccess: 'Cloud-Zugriff erlauben',
cloudAccessDescription: 'Liest Bambu-Cloud-Presets und -Filamente in Ihrem Namen. Erfordert eine Anmeldung in Bambu Cloud.',
cloudBadge: 'Cloud',
updateEnergyCost: 'Strompreis aktualisieren',
updateEnergyCostDescription: 'Erlaubt diesem Schlüssel, einen neuen Strompreis pro kWh an /settings/electricity-price zu senden. Nützlich für Home-Assistant-Automatisierungen mit dynamischen Tarifen (Tibber, Octopus usw.). Dies ist das einzige Einstellungsfeld, das per API-Schlüssel schreibbar ist.',
energyCostBadge: 'Energie',
legacyKey: 'Alt',
legacyKeyTooltip: 'Wurde vor der nutzerbezogenen Eigentümerschaft erstellt; neu erstellen, um Cloud-Zugriff zu nutzen',
unnamedKey: 'Unbenannter Schlüssel',
lastUsed: 'Zuletzt verwendet',
read: 'Lesen',
control: 'Steuern',
createFirstKey: 'Ersten Schlüssel erstellen',
webhookEndpoints: 'Webhook-Endpunkte',
webhookApiKeyHint: 'Verwenden Sie Ihren API-Schlüssel im X-API-Key-Header.',
webhook: {
getAllStatus: 'Alle Druckerstatus abrufen',
getSpecificStatus: 'Spezifischen Druckerstatus abrufen',
addToQueue: 'Zur Druckwarteschlange hinzufügen',
pausePrint: 'Druck pausieren',
resumePrint: 'Druck fortsetzen',
stopPrint: 'Druck stoppen',
},
apiBrowser: 'API-Browser',
apiBrowserDescription: 'Erkunden und testen Sie alle verfügbaren API-Endpunkte.',
apiKeyForTesting: 'API-Schlüssel zum Testen',
apiKeyPlaceholder: 'Fügen Sie hier Ihren API-Schlüssel ein, um authentifizierte Endpunkte zu testen...',
apiKeyHint: 'Dieser Schlüssel wird als X-API-Key-Header mit Anfragen gesendet.',
deleteApiKeyTitle: 'API-Schlüssel löschen',
deleteApiKeyMessage: 'Möchten Sie diesen API-Schlüssel wirklich löschen? Alle Integrationen, die diesen Schlüssel verwenden, funktionieren nicht mehr.',
deleteKey: 'Schlüssel löschen',
// Filament tab
amsDisplayThresholds: 'AMS-Anzeigeschwellenwerte',
amsThresholdsDescription: 'Konfigurieren Sie Farbschwellenwerte für AMS-Feuchtigkeits- und Temperaturanzeigen.',
humidity: 'Luftfeuchtigkeit',
goodGreen: 'Gut (grün)',
fairOrange: 'Mittel (orange)',
aboveFairBad: 'Über dem mittleren Schwellenwert wird rot angezeigt (schlecht)',
fairAlsoDryingThreshold: 'Dieser Schwellenwert wird auch für die automatische Trocknung verwendet',
temperature: 'Temperatur',
goodBlue: 'Gut (blau)',
aboveFairHot: 'Über dem mittleren Schwellenwert wird rot angezeigt (heiß)',
historyRetention: 'Verlaufsaufbewahrung',
keepSensorHistory: 'Sensorverlauf behalten für',
historyRetentionDescription: 'Ältere Feuchtigkeits- und Temperaturdaten werden automatisch gelöscht',
defaultPrintOptions: 'Standard-Druckoptionen',
defaultPrintOptionsDescription: 'Standardwerte für Druckoptionen bei neuen Drucken festlegen. Diese können im Druckdialog pro Druck überschrieben werden.',
defaultBedLevelling: 'Bett-Nivellierung',
defaultBedLevellingDesc: 'Bett vor dem Druck automatisch nivellieren',
defaultFlowCali: 'Fluss-Kalibrierung',
defaultFlowCaliDesc: 'Extrusionsfluss kalibrieren',
defaultVibrationCali: 'Vibrationskalibrierung',
defaultVibrationCaliDesc: 'Ringing-Artefakte reduzieren',
defaultLayerInspect: 'Erste-Schicht-Inspektion',
defaultLayerInspectDesc: 'KI-Inspektion der ersten Schicht',
defaultTimelapse: 'Zeitraffer',
defaultTimelapseDesc: 'Zeitraffervideo aufnehmen',
staggeredStart: 'Versetzter Start',
staggeredStartDescription: 'Standard-Gruppengröße und -Intervall beim Staffeln von Mehrdrucker-Batchstarts. Pro Batch im Druck-Dialog überschreibbar.',
plateClear: 'Druckplatte-Bestätigung',
requirePlateClear: 'Druckplatte-Bestätigung erforderlich',
requirePlateClearDescription: 'Wenn aktiviert, wartet der Scheduler auf eine Druckplatten-Bestätigung pro Drucker, bevor geplante Drucke auf Druckern mit abgeschlossenen Aufträgen gestartet werden. Wenn dies deaktiviert ist, werden auch das Druckplatten-Status-Badge und die Schaltfläche "Druckplatte als freigegeben markieren" auf den Druckerkarten ausgeblendet.',
gcodeInjection: 'G-Code-Injektion',
gcodeInjectionDescription: 'Konfigurieren Sie benutzerdefinierten G-code, der am Anfang und/oder Ende von Drucken für Auto-Print-Systeme wie Farmloop, SwapMod, AutoClear und Printflow 3D eingefügt wird. Snippets werden pro Druckermodell konfiguriert und angewendet, wenn "G-code einfügen" bei einem Warteschlangen-Element aktiviert ist.',
gcodeInjectionNoPrinters: 'Keine Drucker gefunden. Fügen Sie Drucker hinzu, um G-code-Snippets zu konfigurieren.',
gcodeStartLabel: 'Start-G-Code',
gcodeEndLabel: 'End-G-Code',
gcodeStartPlaceholder: 'G-code, der vor dem Druckstart eingefügt wird...',
gcodeEndPlaceholder: 'G-code, der nach dem Druckende angefügt wird...',
staggerGroupSize: 'Gruppengröße',
staggerGroupSizeHelp: 'Anzahl gleichzeitig zu startender Drucker pro Gruppe',
staggerInterval: 'Intervall (Minuten)',
staggerIntervalHelp: 'Verzögerung zwischen Gruppenstart',
queueDrying: 'Automatische Trocknung',
queueDryingDescription: 'AMS-Filament automatisch trocknen, wenn der Drucker zwischen Warteschlangen-Drucken im Leerlauf ist. Verwendet den Feuchtigkeitsschwellenwert oben.',
queueDryingEnabled: 'Automatische Trocknung aktivieren',
queueDryingEnabledDescription: 'AMS-Trocknung automatisch starten, wenn der Drucker im Leerlauf ist und die Feuchtigkeit über dem Schwellenwert liegt',
queueDryingBlock: 'Auf Trocknung warten',
queueDryingBlockDescription: 'Druckwarteschlange blockieren, bis die Trocknung abgeschlossen ist. Wenn aus, haben Drucke Vorrang.',
ambientDryingEnabled: 'Umgebungstrocknung',
ambientDryingEnabledDescription: 'Filament auf inaktiven Druckern automatisch trocknen, wenn die Luftfeuchtigkeit den Schwellenwert überschreitet — auch ohne Warteschlange.',
dryingPresets: 'Trocknungsvoreinstellungen',
dryingPresetsDescription: 'Temperatur und Dauer pro Filamenttyp. AMS 2 Pro verwendet niedrigere Temperaturen, AMS-HT unterstützt höhere.',
dryingFilament: 'Filament',
printModal: 'Druckdialog',
expandCustomMapping: 'Benutzerdefinierte Zuordnung standardmäßig erweitern',
expandCustomMappingDescription: 'Bei Druck auf mehrere Drucker die AMS-Zuordnung pro Drucker erweitert anzeigen',
// User management
authentication: 'Authentifizierung',
authEnabledDescription: 'Ihre Instanz ist mit Benutzerauthentifizierung gesichert',
authDisabledDescription: 'Aktivieren Sie die Anmeldepflicht und verwalten Sie den Benutzerzugriff',
authDisabledMessage: 'Aktivieren Sie die Authentifizierung, um Benutzerkonten zu erstellen, Berechtigungen zu verwalten und Ihre Bambuddy-Instanz zu sichern.',
enableAuthentication: 'Authentifizierung aktivieren',
currentUser: 'Aktueller Benutzer',
changePassword: 'Passwort ändern',
admin: 'Admin',
users: 'Benutzer',
addUser: 'Benutzer hinzufügen',
groups: 'Gruppen',
addGroup: 'Gruppe hinzufügen',
system: 'System',
noDescription: 'Keine Beschreibung',
userCount: '{{count}} Benutzer',
permissionCount: '{{count}} Berechtigungen',
createUser: 'Benutzer erstellen',
username: 'Benutzername',
enterUsername: 'Benutzername eingeben',
password: 'Passwort',
enterPassword: 'Passwort eingeben',
passwordRequirements: 'Mindestens 8 Zeichen, davon ein Großbuchstabe, ein Kleinbuchstabe, eine Ziffer und ein Sonderzeichen.',
confirmPassword: 'Passwort bestätigen',
confirmPasswordPlaceholder: 'Passwort bestätigen',
// Title tooltips
viewReleaseOnGitHub: 'Release auf GitHub anzeigen',
turnAllPlugsOn: 'Alle Stecker einschalten',
turnAllPlugsOff: 'Alle Stecker ausschalten',
// Modal: Clear logs
clearNotificationLogs: 'Benachrichtigungsprotokolle löschen',
clearLogsMessage: 'Dadurch werden alle Benachrichtigungsprotokolle, die älter als 30 Tage sind, dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.',
clearLogs: 'Protokolle löschen',
// Modal: Reset UI
resetUiPreferences: 'UI-Einstellungen zurücksetzen',
resetUiPreferencesMessage: 'Dadurch werden alle UI-Einstellungen auf Standardwerte zurückgesetzt: Seitenleisten-Reihenfolge, Theme, Dashboard-Layout, Ansichtsmodi und Sortiereinstellungen. Ihre Drucker, Archive und Servereinstellungen werden NICHT beeinträchtigt. Die Seite wird nach dem Löschen neu geladen.',
resetPreferences: 'Einstellungen zurücksetzen',
// Modal: Delete group
deleteGroupTitle: 'Gruppe löschen',
deleteGroupMessage: 'Möchten Sie diese Gruppe wirklich löschen? Benutzer in dieser Gruppe verlieren diese Berechtigungen.',
deleteGroup: 'Gruppe löschen',
// Modal: Disable auth
disableAuthenticationTitle: 'Authentifizierung deaktivieren',
disableAuthenticationMessage: 'Möchten Sie die Authentifizierung wirklich deaktivieren? Dadurch wird Ihre Bambuddy-Instanz ohne Anmeldung zugänglich. Alle Benutzer bleiben in der Datenbank, aber die Authentifizierung wird deaktiviert.',
disableAuthentication: 'Authentifizierung deaktivieren',
// Additional settings
configureBambuddy: 'Bambuddy konfigurieren',
systemDefault: 'Systemstandard',
archiveSettings: 'Archiv-Einstellungen',
newWindow: 'Neues Fenster',
embeddedOverlay: 'Eingebettetes Overlay',
preferredSlicer: 'Bevorzugter Slicer',
preferredSlicerDescription: 'Wähle die Slicer-Anwendung zum Öffnen von Dateien',
orcaslicerKnownIssuesWarning: 'OrcaSlicer 2.3.2 / 2.4.0-dev haben bekannte CLI-Bugs, die das Slicen vieler von BambuStudio erstellter 3MF-Dateien blockieren — siehe Upstream-Issues #12426 (Segfault bei bemalten Multi-Extruder-Dateien) und #13386 (zu strikte Parameter-Range-Validierung). Bis die Upstream-Fixes verfügbar sind, wird Bambu Studio empfohlen.',
useSlicerApi: 'Slicer-API verwenden',
useSlicerApiDescription: 'Wenn aktiv, öffnen "Slice"-Aktionen das in-App Slicer-Modal und rufen den Slicer-API-Sidecar. Aus (Standard): Übergabe an den Desktop-Slicer per URI-Schema.',
slicerCard: 'Slicer',
orcaslicerApiUrl: 'OrcaSlicer Sidecar-URL',
bambuStudioApiUrl: 'Bambu Studio Sidecar-URL',
slicerApiUrlDescription: 'URL des Slicer-API-Sidecar-Containers. Leer lassen, um die SLICER_API_URL- bzw. BAMBU_STUDIO_API_URL-Umgebungsvariablen zu nutzen.',
slicerBundles: {
title: 'Slicer-Bundles',
description: 'Importiere ein Drucker-Voreinstellungspaket (.bbscfg), das aus BambuStudio exportiert wurde (Datei → Exportieren → Voreinstellungspaket exportieren → "Drucker-Voreinstellungspaket"). Nach dem Import können Slice-Anfragen Voreinstellungen aus dem Bundle per Name auswählen, ohne das JSON-Profil-Trio erneut hochzuladen.',
uploadButton: 'Bundle hochladen',
uploading: 'Hochladen…',
loading: 'Bundles werden geladen…',
empty: 'Noch keine Bundles importiert.',
summary: '{{processCount}} Prozess · {{filamentCount}} Filament-Voreinstellungen',
delete: 'Löschen',
uploadSuccess: '{{name}} importiert',
uploadError: 'Bundle-Upload fehlgeschlagen: {{message}}',
deleteSuccess: 'Bundle entfernt',
deleteError: 'Löschen des Bundles fehlgeschlagen: {{message}}',
confirmDeleteTitle: 'Dieses Bundle entfernen?',
confirmDeleteMessage: 'Slice-Anfragen, die "{{name}}" referenzieren, schlagen fehl, bis das Bundle erneut importiert wird.',
},
externalCameras: 'Externe Kameras',
costTracking: 'Kostenverfolgung',
printsOnly: 'Nur Drucke',
totalConsumption: 'Gesamtverbrauch',
dataManagement: 'Datenverwaltung',
storageUsage: 'Speichernutzung',
storageUsageDescription: 'Aufschlüsselung der Datennutzung nach Kategorie',
storageUsageTotal: 'Gesamt',
storageUsageErrors: 'Fehler',
storageUsageOtherBreakdown: 'Sonstiges (enthält statische Assets, Skripte und Konfigurationsdateien)',
storageUsageSystem: 'System',
storageUsageData: 'Daten',
storageUsageUnavailable: 'Speichernutzungsinformationen nicht verfügbar',
clearNotificationLogsDescription: 'Benachrichtigungsprotokolle älter als 30 Tage löschen',
resetUiPreferencesDescription: 'Seitenleisten-Reihenfolge, Theme, Ansichtsmodi und Layout-Einstellungen zurücksetzen. Drucker, Archive und Einstellungen werden nicht beeinflusst.',
enableHomeAssistant: 'Home Assistant aktivieren',
enableMqtt: 'MQTT aktivieren',
useTls: 'TLS verwenden',
enableMetricsEndpoint: 'Metrik-Endpunkt aktivieren',
availableMetrics: 'Verfügbare Metriken',
editUser: 'Benutzer bearbeiten',
deleteUserTitle: 'Benutzer löschen',
groupName: 'Gruppenname',
// Placeholders
leaveEmptyForAnonymous: 'Leer lassen für anonym',
leaveEmptyForNoAuth: 'Leer lassen für keine Authentifizierung',
enterNewPassword: 'Neues Passwort eingeben',
confirmNewPassword: 'Neues Passwort bestätigen',
enterGroupName: 'Gruppenname eingeben',
enterDescriptionOptional: 'Beschreibung eingeben (optional)',
enterCurrentPassword: 'Aktuelles Passwort eingeben',
enterNewPasswordMin6: 'Neues Passwort eingeben (min. 6 Zeichen)',
toast: {
keyCopied: 'Schlüssel in Zwischenablage kopiert',
copyFailed: 'Schlüssel konnte nicht kopiert werden',
keyAddedToBrowser: 'Schlüssel zum API-Browser hinzugefügt',
clearLogsFailed: 'Protokolle konnten nicht gelöscht werden',
uiPreferencesReset: 'UI-Einstellungen zurückgesetzt. Wird neu geladen...',
authDisabled: 'Authentifizierung erfolgreich deaktiviert',
authDisableFailed: 'Authentifizierung konnte nicht deaktiviert werden',
apiKeyCreated: 'API-Schlüssel erstellt',
apiKeyDeleted: 'API-Schlüssel gelöscht',
userCreated: 'Benutzer erfolgreich erstellt',
userUpdated: 'Benutzer erfolgreich aktualisiert',
userDeleted: 'Benutzer erfolgreich gelöscht',
groupCreated: 'Gruppe erfolgreich erstellt',
groupUpdated: 'Gruppe erfolgreich aktualisiert',
groupDeleted: 'Gruppe erfolgreich gelöscht',
fillRequiredFields: 'Bitte füllen Sie alle erforderlichen Felder aus',
passwordsDoNotMatch: 'Passwörter stimmen nicht überein',
passwordTooShort: 'Passwort muss mindestens 8 Zeichen lang sein',
passwordNeedsUppercase: 'Passwort muss mindestens einen Großbuchstaben enthalten',
passwordNeedsLowercase: 'Passwort muss mindestens einen Kleinbuchstaben enthalten',
passwordNeedsDigit: 'Passwort muss mindestens eine Ziffer enthalten',
passwordNeedsSpecial: 'Passwort muss mindestens ein Sonderzeichen enthalten',
enterGroupName: 'Bitte geben Sie einen Gruppennamen ein',
settingsSaved: 'Einstellungen gespeichert',
noPermissionUpdate: 'Sie haben keine Berechtigung, Einstellungen zu ändern',
cameraSettingsSaved: 'Kamera-Einstellungen gespeichert',
enterCameraUrl: 'Bitte geben Sie eine Kamera-URL ein',
passwordChanged: 'Passwort erfolgreich geändert',
connectionFailed: 'Verbindung fehlgeschlagen',
testFailed: 'Test fehlgeschlagen',
cameraConnected: 'Kamera verbunden{{resolution}}',
},
testConnection: 'Verbindung testen',
catalog: {
spoolCatalog: 'Spulenkatalog',
spoolCatalogDescription: 'Leerspulengewichte nach Marke/Typ. Wird für die automatische Gewichtssuche beim Hinzufügen von Spulen verwendet.',
searchCatalog: 'Katalog durchsuchen...',
addNewEntry: 'Neuen Eintrag hinzufügen',
namePlaceholder: 'Name (z.B. Bambu Lab - Plastik)',
weight: 'Gewicht',
type: 'Typ',
default: 'Standard',
custom: 'Benutzerdefiniert',
noMatch: 'Keine Einträge entsprechen Ihrer Suche',
empty: 'Keine Einträge im Katalog',
deleteEntry: 'Eintrag löschen',
deleteConfirm: 'Möchten Sie "{{name}}" wirklich löschen?',
resetCatalog: 'Katalog zurücksetzen',
resetConfirm: 'Katalog auf Standardwerte zurücksetzen? Alle benutzerdefinierten Einträge werden entfernt.',
loadFailed: 'Spulenkatalog konnte nicht geladen werden',
nameWeightRequired: 'Name und Gewicht sind erforderlich',
entryAdded: 'Eintrag hinzugefügt',
addFailed: 'Eintrag konnte nicht hinzugefügt werden',
entryUpdated: 'Eintrag aktualisiert',
updateFailed: 'Eintrag konnte nicht aktualisiert werden',
entryDeleted: 'Eintrag gelöscht',
deleteFailed: 'Eintrag konnte nicht gelöscht werden',
resetSuccess: 'Katalog auf Standardwerte zurückgesetzt',
resetFailed: 'Katalog konnte nicht zurückgesetzt werden',
exported: '{{count}} Einträge exportiert',
imported: '{{added}} Einträge importiert ({{skipped}} übersprungen)',
importFailed: 'Import fehlgeschlagen: ungültiges JSON-Format',
exportTooltip: 'Katalog als JSON exportieren',
importTooltip: 'Katalog aus JSON importieren',
resetTooltip: 'Auf Standardwerte zurücksetzen',
selectedCount: '{{count}} ausgewählt',
deleteSelected: 'Ausgewählte löschen',
bulkDeleteConfirm: 'Möchten Sie {{count}} Einträge wirklich löschen?',
bulkDeleted: '{{count}} Einträge gelöscht',
bulkDeleteFailed: 'Fehler beim Löschen der Einträge',
material: 'Material',
spoolWeight: 'Spulengewicht',
color: 'Farbe',
updateSpoolWeight: 'Spulengewicht aktualisieren',
filamentUpdated: 'Filament aktualisiert',
filamentUpdateFailed: 'Filament konnte nicht aktualisiert werden',
filamentUpdateInvalid: 'Ungültige Filamentdaten',
keepExistingSpoolWeight: 'Altes Gewicht für bestehende Spulen behalten',
keepExistingSpoolWeightDesc: 'Bereits erstellte Spulen dieses Filamenttyps behalten das alte Leergewicht. Neue Spulen nutzen den neuen Wert.',
applyToAllSpools: 'Auf alle Spulen anwenden',
applyToAllSpoolsDesc: 'Alle Gewichtsberechnungen für diesen Filamenttyp nutzen sofort das neue Leergewicht.',
},
colorCatalog: {
title: 'Farbkatalog',
description: 'Filamentfarben nach Hersteller/Material. Wird für die automatische Farbsuche beim Hinzufügen von Spulen verwendet.',
searchColors: 'Farben durchsuchen...',
allManufacturers: 'Alle Hersteller',
addNewColor: 'Neue Farbe hinzufügen',
manufacturer: 'Hersteller',
colorName: 'Farbname',
hex: 'Hex',
materialOptional: 'Material (optional)',
showing: '{{filtered}} von {{total}} Farben angezeigt',
noMatch: 'Keine Farben entsprechen Ihrer Suche',
empty: 'Keine Farben im Katalog',
deleteColor: 'Farbe löschen',
deleteConfirm: 'Möchten Sie "{{name}}" wirklich löschen?',
resetCatalog: 'Farbkatalog zurücksetzen',
resetConfirm: 'Katalog auf Standardwerte zurücksetzen? Alle benutzerdefinierten Farben werden entfernt.',
sync: 'Synchron.',
starting: 'Starten...',
syncTooltip: 'Von FilamentColors.xyz synchronisieren (2000+ Farben)',
loadFailed: 'Farbkatalog konnte nicht geladen werden',
fieldsRequired: 'Hersteller, Farbname und Hex-Farbe sind erforderlich',
colorAdded: 'Farbe hinzugefügt',
addFailed: 'Farbe konnte nicht hinzugefügt werden',
colorUpdated: 'Farbe aktualisiert',
updateFailed: 'Farbe konnte nicht aktualisiert werden',
colorDeleted: 'Farbe gelöscht',
deleteFailed: 'Farbe konnte nicht gelöscht werden',
resetSuccess: 'Farbkatalog auf Standardwerte zurückgesetzt',
resetFailed: 'Katalog konnte nicht zurückgesetzt werden',
syncUpToDate: 'Bereits aktuell ({{count}} Farben geprüft)',
syncComplete: '{{added}} neue Farben hinzugefügt ({{skipped}} bereits vorhanden)',
syncError: 'Sync-Fehler',
syncFailed: 'Synchronisierung von FilamentColors.xyz fehlgeschlagen',
exported: '{{count}} Farben exportiert',
imported: '{{added}} Farben importiert ({{skipped}} übersprungen)',
importFailed: 'Import fehlgeschlagen: ungültiges JSON-Format',
selectedCount: '{{count}} ausgewählt',
deleteSelected: 'Ausgewählte löschen',
bulkDeleteConfirm: 'Möchten Sie {{count}} Farben wirklich löschen?',
bulkDeleted: '{{count}} Farben gelöscht',
bulkDeleteFailed: 'Fehler beim Löschen der Farben',
},
// General tab
dateFormat: 'Datumsformat',
dateFormatUs: 'US (MM/TT/JJJJ)',
dateFormatEu: 'EU (TT/MM/JJJJ)',
dateFormatIso: 'ISO (JJJJ-MM-TT)',
timeFormat: 'Zeitformat',
timeFormat12: '12-Stunden (3:30 PM)',
timeFormat24: '24-Stunden (15:30)',
defaultPrinter: 'Standarddrucker',
defaultPrinterDescription: 'Diesen Drucker für Uploads, Nachdrucke und andere Vorgänge vorauswählen.',
slicerBambuStudio: 'Bambu Studio',
slicerOrcaSlicer: 'OrcaSlicer',
sidebarOrderDescription: 'Elemente in der Seitenleiste per Drag & Drop neu anordnen. Hier auf Standardreihenfolge zurücksetzen.',
setDefault: 'Standard setzen',
sidebarOrderSetDefaultHint: 'Standard setzen übernimmt die aktuelle Menüreihenfolge für Benutzer, die ihre noch nicht angepasst haben.',
sidebarDefaultSet: 'Standard-Menüreihenfolge wurde festgelegt.',
sidebarDefaultCleared: 'Standard-Menüreihenfolge gelöscht.',
sidebarDefaultFailed: 'Festlegen der Standard-Menüreihenfolge fehlgeschlagen.',
reset: 'Zurücksetzen',
// Appearance
darkMode: 'Dunkelmodus',
lightMode: 'Hellmodus',
active: '(aktiv)',
background: 'Hintergrund',
accent: 'Akzent',
style: 'Stil',
bgNeutral: 'Neutral',
bgWarm: 'Warm',
bgCool: 'Kühl',
bgOled: 'OLED Schwarz',
bgSlate: 'Schieferblau',
bgForest: 'Waldgrün',
accentGreen: 'Grün',
accentTeal: 'Türkis',
accentBlue: 'Blau',
accentOrange: 'Orange',
accentPurple: 'Lila',
accentRed: 'Rot',
styleClassic: 'Klassisch',
styleGlow: 'Leuchtend',
styleVibrant: 'Lebendig',
themeToggleHint: 'Zwischen Hell- und Dunkelmodus mit dem Sonnen-/Mondsymbol in der Seitenleiste wechseln.',
// Archive
autoArchivePrints: 'Drucke automatisch archivieren',
autoArchiveDescription: '3MF-Dateien automatisch speichern, wenn Drucke abgeschlossen sind',
saveThumbnailsDescription: 'Vorschaubilder aus 3MF-Dateien extrahieren und speichern',
captureFinishPhotoDescription: 'Foto von der Druckerkamera aufnehmen, wenn der Druck abgeschlossen ist',
ffmpegNotInstalled: 'ffmpeg nicht installiert',
ffmpegRequired: 'Kameraaufnahme benötigt ffmpeg. Installieren über brew install ffmpeg (macOS) oder apt install ffmpeg (Linux).',
// Camera
camera: 'Kamera',
cameraViewMode: 'Kamera-Ansichtsmodus',
cameraOverlayDescription: 'Kamera öffnet sich als größenveränderbares Overlay auf dem Hauptbildschirm',
cameraWindowDescription: 'Kamera öffnet sich in einem separaten Browserfenster',
externalCamerasDescription: 'Externe Kameras konfigurieren, um die eingebaute Druckerkamera zu ersetzen. Unterstützt MJPEG-Streams, RTSP, HTTP-Snapshots und USB-Kameras (V4L2). Wenn aktiviert, wird die externe Kamera für Live-Ansicht und Abschlussfotos verwendet.',
cameraPlaceholderUsb: 'Gerätepfad (/dev/video0)',
cameraPlaceholderUrl: 'Kamera-URL (rtsp://... oder http://...)',
cameraTypeMjpeg: 'MJPEG-Stream',
cameraTypeRtsp: 'RTSP-Stream',
cameraTypeSnapshot: 'HTTP-Snapshot',
cameraTypeUsb: 'USB-Kamera (V4L2)',
cameraSnapshotUrl: 'Snapshot-URL (optional)',
cameraSnapshotUrlPlaceholder: 'http://192.168.1.61:1984/api/frame.jpeg?src=printer',
cameraSnapshotUrlHelp: 'URL für Einzelbildaufnahmen — wird für Benachrichtigungs-Vorschaubilder, Abschlussfotos, Schicht-Zeitraffer und Plattenerkennung verwendet. Zeitraffer und Plattenerkennung benötigen jeweils eigene drucker-spezifische Schalter — diese URL ist nur die Bildquelle, die sie verwenden, wenn sie aktiv sind. Leer lassen, um Bilder aus dem oben konfigurierten Live-Stream zu verwenden. Nützlich für go2rtc (/api/frame.jpeg) und IP-Kameras mit dediziertem Snapshot-Endpunkt.',
cameraRotation: 'Drehung',
test: 'Testen',
connected: 'Verbunden',
disconnected: 'Getrennt',
// Cost tracking
currency: 'Währung',
defaultFilamentCost: 'Standard-Filamentkosten (pro kg)',
electricityCost: 'Stromkosten pro kWh',
energyDisplayMode: 'Energieanzeige-Modus',
energyModePrintDescription: 'Dashboard zeigt Summe der während Drucken verbrauchten Energie',
energyModeTotalDescription: 'Dashboard zeigt Gesamtenergie der Smart Plugs',
// File Manager
fileManager: 'Dateimanager',
createArchiveEntry: 'Archiveintrag beim Drucken erstellen',
createArchiveEntryDescription: 'Beim Drucken aus dem Dateimanager optional einen Archiveintrag erstellen',
lowDiskSpaceWarning: 'Warnung bei wenig Speicherplatz',
lowDiskSpaceDescription: 'Warnung anzeigen, wenn freier Speicherplatz unter diesen Schwellenwert fällt',
// Updates
printerFirmware: 'Drucker-Firmware',
checkFirmwareDescription: 'Nach Firmware-Updates von Bambu Lab suchen',
bambuddySoftware: 'Bambuddy-Software',
autoCheckDescription: 'Automatisch beim Start nach neuen Versionen suchen',
checkNow: 'Jetzt prüfen',
updateAvailableVersion: 'Update verfügbar: v{{version}}',
releaseNotes: 'Versionshinweise',
updateViaDocker: 'Update über Docker Compose:',
updateViaHomeAssistant: 'Updates werden vom Home Assistant Supervisor verwaltet. Öffne Einstellungen → Add-ons → Bambuddy in Home Assistant, um die neue Version zu installieren.',
installUpdate: 'Update installieren',
latestVersionRunning: 'Sie verwenden die neueste Version',
failedToCheckUpdates: 'Update-Prüfung fehlgeschlagen: {{error}}',
// Data Management
backupRestore: 'Sicherung & Wiederherstellung',
backupRestoreDescription: 'Einstellungen exportieren/importieren und GitHub-Backup konfigurieren',
goToBackup: 'Zur Sicherung',
// Network tab
externalUrl: 'Externe URL',
externalUrlDescription: 'Die externe URL, unter der Bambuddy erreichbar ist. Wird für Benachrichtigungsbilder und externe Integrationen verwendet.',
bambuddyUrl: 'Bambuddy-URL',
externalUrlHint: 'Protokoll und Port angeben (z.B. http://192.168.1.100:8000)',
ftpRetry: 'FTP-Wiederholung',
ftpRetryDescription: 'FTP-Operationen bei unzuverlässigem Drucker-WLAN wiederholen. Gilt für 3MF-Downloads, Druck-Uploads, Zeitraffer-Downloads und Firmware-Updates.',
autoRetryDescription: 'Fehlgeschlagene FTP-Operationen automatisch wiederholen',
retryAttempts: 'Wiederholungsversuche',
retryDelay: 'Wiederholungsverzögerung',
connectionTimeout: 'Verbindungs-Timeout',
time_one: '{{count}} Mal',
time_other: '{{count}} Mal',
second_one: '{{count}} Sekunde',
second_other: '{{count}} Sekunden',
nSeconds: '{{count}} Sekunden',
increaseForWeakWifi: 'Erhöhen für Drucker mit schwachem WLAN',
// Home Assistant
homeAssistant: 'Home Assistant',
homeAssistantFullDescription: 'Mit Home Assistant verbinden, um Smart Plugs über die HA REST-API zu steuern. Unterstützt Switch-, Light-, Input_Boolean- und Script-Entitäten.',
homeAssistantUrl: 'Home Assistant URL',
longLivedAccessToken: 'Langlebiges Zugriffstoken',
haTokenHint: 'Token in HA erstellen: Profil → Langlebige Zugriffstoken → Token erstellen',
connectionSuccessful: 'Verbindung erfolgreich',
connectionFailed: 'Verbindung fehlgeschlagen',
haConnectionSuccess: 'Erfolgreich mit Home Assistant verbunden.',
haConnectionFailed: 'Verbindung zu Home Assistant fehlgeschlagen.',
// MQTT
mqttPublishing: 'MQTT-Veröffentlichung',
mqttDescription: 'BamBuddy-Ereignisse an einen externen MQTT-Broker zur Integration mit Node-RED, Home Assistant und anderen Automatisierungssystemen veröffentlichen.',
mqttEnableDescription: 'Ereignisse an externen MQTT-Broker veröffentlichen',
brokerHostname: 'Broker-Hostname',
port: 'Port',
usernameOptional: 'Benutzername (optional)',
passwordOptional: 'Passwort (optional)',
topicPrefix: 'Topic-Präfix',
topicPrefixHint: 'Topics werden sein: {{prefix}}/printers//status, etc.',
// Prometheus
prometheusMetrics: 'Prometheus-Metriken',
prometheusEndpointDescription: 'Druckermetriken unter /api/v1/metrics für Prometheus/Grafana-Überwachung bereitstellen.',
bearerTokenOptional: 'Bearer-Token (optional)',
bearerTokenHint: 'Wenn gesetzt, müssen Anfragen Authorization: Bearer enthalten',
metricsConnectionStatus: 'Verbindungsstatus',
metricsPrinterState: 'Druckerstatus (idle/printing/etc)',
metricsPrintProgress: 'Druckfortschritt 0-100%',
metricsBedTemp: 'Betttemperatur',
metricsNozzleTemp: 'Düsentemperatur',
metricsPrintsTotal: 'Gesamtdrucke nach Ergebnis',
metricsMore: '...und mehr (Schichten, Lüfter, Warteschlange, Filamentverbrauch)',
// Smart Plugs
smartPlugsDescription: 'Smart Plugs (Tasmota oder Home Assistant) verbinden, um Stromsteuerung zu automatisieren und Energieverbrauch für Ihre Drucker zu verfolgen.',
allOn: 'Alle Ein',
allOff: 'Alle Aus',
addSmartPlug: 'Smart Plug hinzufügen',
energySummary: 'Energieübersicht',
currentPower: 'Aktuelle Leistung',
plugsOnline: '{{reachable}}/{{total}} Plugs online',
today: 'Heute',
yesterday: 'Gestern',
total: 'Gesamt',
enablePlugsForSummary: 'Plugs aktivieren, um Energieübersicht zu sehen',
addNotificationProvider: 'Hinzufügen',
// Users
systemBadge: '(System)',
creating: 'Erstellen...',
changing: 'Ändern...',
deleteUserAndItems: 'Benutzer UND dessen Elemente löschen',
deleteUserKeepItems: 'Benutzer löschen, Elemente behalten (werden herrenlos)',
ok: 'OK',
// 2FA settings
twoFa: {
totpTitle: 'Authenticator-App (TOTP)',
totpDesc: 'Verwende eine Authenticator-App wie Google Authenticator, Aegis oder Authy.',
emailOtpTitle: 'E-Mail OTP',
emailOtpDesc: 'Sende einen Einmalcode an {{email}} beim Einloggen.',
emailOtpNoEmail: 'Füge eine E-Mail-Adresse zu deinem Konto hinzu, um diese Methode zu aktivieren.',
addEmailFirst: 'Dein Konto hat keine E-Mail-Adresse. Bitte einen Administrator, eine hinzuzufügen.',
setupTotp: 'Authenticator-App einrichten',
setupAuthApp: 'Authenticator-App einrichten',
setupInstructions: 'Scanne den QR-Code mit deiner Authenticator-App und bestätige mit einem Code.',
manualEntry: 'Kein Scanner? Gib dieses Secret manuell ein:',
scannedContinue: 'Code gescannt — weiter',
enterCodeToConfirm: 'Gib den 6-stelligen Code aus deiner Authenticator-App ein, um die Einrichtung zu bestätigen.',
activate: 'Aktivieren',
disableTotp: 'Authenticator deaktivieren',
disableConfirmHint: 'Gib einen gültigen TOTP-Code oder einen Backup-Code ein, um den Authenticator zu deaktivieren.',
totpDisabled: 'Authenticator-App deaktiviert.',
emailOtpEnabled: 'E-Mail OTP aktiviert.',
emailOtpDisabled: 'E-Mail OTP deaktiviert.',
smtpRequired: 'Bitte konfigurieren und testen Sie zuerst die SMTP-Einstellungen.',
invalidCode: 'Ungültiger Code. Bitte erneut versuchen.',
enableEmailOtp: 'E-Mail OTP aktivieren',
disableEmailOtp: 'E-Mail OTP deaktivieren',
emailSetupEnterCode: 'Ein Bestätigungscode wurde an Ihre E-Mail-Adresse gesendet. Geben Sie ihn unten ein, um zu bestätigen, dass Ihnen dieses Postfach gehört.',
verifyAndEnable: 'Verifizieren & Aktivieren',
emailDisablePasswordHint: 'Geben Sie Ihr Kontopasswort ein, um die Deaktivierung des E-Mail OTP zu bestätigen.',
passwordPlaceholder: 'Passwort eingeben',
backupCodesTitle: 'Backup-Codes sichern',
backupCodesWarning: 'Speichere diese Codes sicher. Jeder Code kann nur einmal verwendet werden und wird nicht erneut angezeigt.',
backupCodesRemaining: '{{count}} Backup-Codes verbleibend',
savedCodes: 'Codes gespeichert',
regenBackup: 'Backup-Codes neu generieren',
regenBackupHint: 'Gib deinen aktuellen TOTP-Code ein, um 10 neue Backup-Codes zu generieren. Alle bestehenden Codes werden ungültig.',
newBackupCodes: 'Neue Backup-Codes',
linkedAccounts: 'Verknüpfte SSO-Konten',
linkedAccountsDesc: 'Diese externen Identitätsanbieter sind mit deinem Konto verknüpft.',
oidcUnlinked: 'Konto getrennt.',
},
// OIDC provider settings
oidc: {
title: 'SSO / OIDC-Anbieter',
desc: 'Konfiguriere OpenID Connect-Anbieter für Single Sign-On.',
addProvider: 'Anbieter hinzufügen',
newProvider: 'Neuer Anbieter',
empty: 'Noch keine OIDC-Anbieter konfiguriert.',
created: 'Anbieter erstellt.',
updated: 'Anbieter aktualisiert.',
deleted: 'Anbieter gelöscht.',
refreshIcon: 'Icon neu laden',
removeIcon: 'Icon entfernen',
iconRefreshed: 'Icon aktualisiert.',
iconRemoved: 'Icon entfernt.',
iconFetchFailed: 'Icon konnte von der Anbieter-URL nicht geladen werden.',
deleteTitle: 'Anbieter löschen',
deleteMessage: '"{{name}}" löschen? Alle verknüpften Benutzerkonten werden getrennt.',
form: {
name: 'Anzeigename',
issuerUrl: 'Aussteller-URL',
clientId: 'Client-ID',
clientSecret: 'Client-Secret',
scopes: 'Bereiche',
iconUrl: 'Symbol-URL (optional)',
enabled: 'Aktiviert',
autoCreate: 'Benutzer automatisch anlegen',
autoCreateDesc: 'Erstellt beim ersten Login automatisch ein lokales Konto.',
autoLink: 'Bestehende Konten automatisch verknüpfen',
autoLinkDesc: 'Verknüpft beim ersten Login vorhandene lokale Konten anhand der E-Mail-Adresse.',
secretHint: 'leer lassen zum Beibehalten',
secretPlaceholder: 'neues Secret',
emailClaim: 'E-Mail-Claim',
emailClaimDesc: "JWT-Claim für die E-Mail-Identität. Für Azure Entra ID 'preferred_username' oder 'upn' verwenden (sendet kein email_verified). Nur vertrauenswürdige Claim-Namen verwenden.",
emailClaimPlaceholder: 'E-Mail',
emailClaimCustomClaimAutoLinkWarning: "Benutzerdefinierte Claims sind für die Auto-Verknüpfung nur sicher, wenn der Wert vom Mandanten verwaltet wird (z. B. Azure Entra ID upn / preferred_username). Aktiviere Auto-Verknüpfung nicht, wenn dein IdP Benutzern erlaubt, diesen Claim selbst zu setzen.",
requireEmailVerified: 'E-Mail-Verifizierung erforderlich',
requireEmailVerifiedDesc: 'E-Mail-Claim nur akzeptieren, wenn der Provider ihn als verifiziert markiert.',
requireEmailVerifiedWarning: 'Warnung: E-Mail wird auch ohne Verifizierung akzeptiert. Nur bei vertrauenswürdigen Providern verwenden.',
requireEmailVerifiedAutoLink: 'Auto-Verknüpfung zuerst deaktivieren, um diese Einstellung zu ändern.',
defaultGroup: 'Standardgruppe',
defaultGroupDesc: 'Gruppe, der automatisch erstellte Benutzer zugewiesen werden. Fallback auf Viewers, wenn nicht gesetzt.',
defaultGroupViewersFallback: 'Viewers (Standard)',
},
},
encryption: {
title: 'MFA-Verschlüsselungsstatus',
enabledFromEnv: 'At-Rest-Verschlüsselung aktiv (Schlüssel aus Umgebungsvariable MFA_ENCRYPTION_KEY)',
enabledFromFile: 'At-Rest-Verschlüsselung aktiv (Schlüssel aus dem Datenverzeichnis geladen)',
enabledGenerated: 'At-Rest-Verschlüsselung aktiv mit automatisch generiertem Schlüssel',
notConfigured: 'At-Rest-Verschlüsselung nicht konfiguriert',
notConfiguredDesc: 'TOTP-Geheimnisse und OIDC-Client-Secrets werden im Klartext gespeichert. Setze MFA_ENCRYPTION_KEY oder starte Bambuddy mit beschreibbarem Datenverzeichnis neu, damit ein Schlüssel automatisch erzeugt wird.',
allEncrypted: 'Alle MFA-Geheimnisse sind verschlüsselt gespeichert.',
legacyRowsLabel: 'Klartext-Zeilen (Altbestand)',
encryptedRowsLabel: 'Verschlüsselte Zeilen',
legacyRowsWarning: '{{count}} Klartext-Zeile(n) erkannt. Den OIDC-Provider neu speichern oder den Authenticator des Benutzers neu einrichten, um die Daten verschlüsselt abzulegen.',
backupHint: 'Der automatisch erzeugte Schlüssel liegt unter DATA_DIR/.mfa_encryption_key und wird in lokalen Backup-ZIPs mitgesichert. Backups sicher aufbewahren oder MFA_ENCRYPTION_KEY explizit setzen.',
decryptionBrokenTitle: 'Verschlüsselungsschlüssel fehlt',
decryptionBrokenError: '{{count}} verschlüsselte Datensätze können nicht entschlüsselt werden, weil der Schlüssel nicht mehr verfügbar ist. Den vorherigen MFA_ENCRYPTION_KEY oder DATA_DIR/.mfa_encryption_key wiederherstellen.',
migrationErrorWarning: '{{count}} Legacy-Eintrag/Einträge konnten beim Start nicht verschlüsselt werden. Prüfen Sie die Server-Logs und starten Sie Bambuddy neu.',
},
},
// Notifications (for push notifications)
notification: {
printStarted: {
title: 'Druck gestartet',
body: '{{printer}}: {{filename}} wird gedruckt',
},
printCompleted: {
title: 'Druck abgeschlossen',
body: '{{printer}}: {{filename}} erfolgreich abgeschlossen',
},
printFailed: {
title: 'Druck fehlgeschlagen',
body: '{{printer}}: {{filename}} ist fehlgeschlagen',
},
printStopped: {
title: 'Druck gestoppt',
body: '{{printer}}: {{filename}} wurde gestoppt',
},
printProgress: {
title: 'Druckfortschritt',
body: '{{printer}}: {{filename}} ist zu {{percent}}% abgeschlossen',
},
printerOffline: {
title: 'Drucker offline',
body: '{{printer}} ist offline',
},
printerError: {
title: 'Druckerfehler',
body: '{{printer}} – {{error}}',
},
filamentLow: {
title: 'Filament niedrig',
body: '{{printer}}: Filament geht zur Neige',
},
maintenanceDue: {
title: 'Wartung fällig',
body: '{{printer}}: {{items}} benötigen Aufmerksamkeit',
},
},
// Errors
errors: {
generic: 'Etwas ist schiefgelaufen',
networkError: 'Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.',
notFound: 'Nicht gefunden',
unauthorized: 'Nicht autorisiert',
serverError: 'Serverfehler',
validationError: 'Bitte überprüfen Sie Ihre Eingabe',
printerConnectionFailed: 'Verbindung zum Drucker fehlgeschlagen',
saveFailed: 'Speichern fehlgeschlagen',
deleteFailed: 'Löschen fehlgeschlagen',
loadFailed: 'Laden der Daten fehlgeschlagen',
},
// HMS Errors modal
hmsErrors: {
title: 'Fehler - {{name}}',
noErrors: 'Keine Fehler',
viewOnWiki: 'Im Bambu Lab Wiki ansehen',
clearInstructions: 'Löschen Sie die Fehler am Drucker, um sie hier zu entfernen.',
clearErrors: 'Fehler löschen',
clearSuccess: 'HMS-Fehler gelöscht',
clearFailed: 'HMS-Fehler konnten nicht gelöscht werden',
},
// MQTT Debug modal
mqttDebug: {
title: 'MQTT-Debug-Protokoll',
searchPlaceholder: 'Topic oder Payload suchen...',
noMessages: 'Noch keine Nachrichten protokolliert',
startLoggingHint: 'Klicken Sie auf "Protokollierung starten", um MQTT-Nachrichten aufzuzeichnen',
noMessagesMatch: 'Keine Nachrichten entsprechen Ihrem Filter',
adjustFilterHint: 'Versuchen Sie, Ihre Such- oder Filterkriterien anzupassen',
incoming: 'Eingehend',
outgoing: 'Ausgehend',
loggingStopped: 'Protokollierung gestoppt',
loggingActive: 'Protokollierung aktiv - Nachrichten werden automatisch aktualisiert',
startLogging: 'Protokollierung starten',
stopLogging: 'Protokollierung stoppen',
clearLog: 'Protokoll löschen',
topic: 'Thema',
timestamp: 'Zeitstempel',
direction: 'Richtung',
all: 'Alle',
},
// Printer File Manager modal (printer internal storage)
printerFiles: {
title: 'Dateimanager',
storageUsed: 'Belegt:',
storageFree: 'Frei:',
filterPlaceholder: 'Dateien filtern...',
deleteButton: 'Löschen',
deleteFiles: '{{count}} Dateien löschen',
deleteFileConfirm: '"{{name}}" löschen? Dies kann nicht rückgängig gemacht werden.',
deleteFilesConfirm: '{{count}} ausgewählte Dateien löschen? Dies kann nicht rückgängig gemacht werden.',
noFiles: 'Keine Dateien auf dem Drucker',
loadingFiles: 'Dateien werden geladen...',
failedToLoad: 'Dateien konnten nicht geladen werden',
toast: {
filesDeleted: '{{count}} Datei(en) gelöscht',
deleteFailed: 'Löschen fehlgeschlagen: {{error}}',
},
},
// Confirmations
confirm: {
delete: 'Möchten Sie dies wirklich löschen?',
unsavedChanges: 'Sie haben ungespeicherte Änderungen. Möchten Sie wirklich verlassen?',
clearQueue: 'Möchten Sie die Warteschlange wirklich leeren?',
},
// Login page
login: {
title: 'Bambuddy Anmeldung',
subtitle: 'Melden Sie sich bei Ihrem Konto an',
username: 'Benutzername',
usernamePlaceholder: 'Benutzername eingeben',
usernameOrEmail: 'Benutzername oder E-Mail',
usernameOrEmailPlaceholder: 'Benutzername oder @ E-Mail',
password: 'Passwort',
passwordPlaceholder: 'Passwort eingeben',
signIn: 'Anmelden',
signingIn: 'Anmeldung läuft...',
rememberMe: 'Angemeldet bleiben',
forgotPassword: 'Passwort vergessen?',
loginSuccess: 'Erfolgreich angemeldet',
loginFailed: 'Anmeldung fehlgeschlagen',
enterCredentials: 'Bitte Benutzername und Passwort eingeben',
enterEmail: 'Bitte geben Sie Ihre E-Mail-Adresse ein',
oidcLoginFailed: 'OIDC-Anmeldung fehlgeschlagen',
oidcErrors: {
providerError: 'Der Identity-Provider hat einen Fehler zurückgegeben',
missingParameters: 'Dem OIDC-Callback fehlen erforderliche Parameter',
invalidState: 'OIDC-State ist ungültig oder wurde bereits verwendet',
stateExpired: 'OIDC-Sitzung abgelaufen — bitte erneut versuchen',
providerNotFound: 'OIDC-Provider nicht gefunden',
discoveryFailed: 'OIDC-Discovery-Dokument konnte nicht abgerufen werden',
invalidDiscovery: 'OIDC-Discovery-Dokument ist ungültig',
networkError: 'Netzwerkfehler beim OIDC-Token-Austausch',
badResponse: 'Unerwartete Antwort beim OIDC-Token-Austausch',
noIdToken: 'OIDC-Provider hat kein ID-Token zurückgegeben',
validationFailed: 'OIDC-Token-Validierung fehlgeschlagen',
nonceMismatch: 'OIDC-Nonce stimmt nicht überein — möglicher Replay-Angriff',
missingSubClaim: 'OIDC-Token enthält keinen Sub-Claim',
noLinkedAccount: 'Kein lokales Konto mit dieser OIDC-Identität verknüpft',
accountInactive: 'Ihr Konto ist inaktiv',
userResolutionFailed: 'Ihr Konto konnte nicht aufgelöst werden',
internalError: 'Interner Fehler beim OIDC-Login',
tokenExchangeFailed: 'OIDC-Token-Austausch fehlgeschlagen',
},
forgotPasswordTitle: 'Passwort vergessen',
forgotPasswordMessage: 'Wenn Sie Ihr Passwort vergessen haben, wenden Sie sich bitte an Ihren Systemadministrator.',
forgotPasswordEmailMessage: 'Geben Sie Ihre E-Mail-Adresse ein und wir senden Ihnen ein neues Passwort.',
emailAddress: 'E-Mail-Adresse',
emailPlaceholder: 'ihre.email@beispiel.de',
cancel: 'Abbrechen',
sending: 'Wird gesendet...',
sendResetEmail: 'Zurücksetzungs-E-Mail senden',
howToReset: 'So setzen Sie Ihr Passwort zurück:',
resetStep1: 'Kontaktieren Sie Ihren Bambuddy-Administrator',
resetStep2: 'Bitten Sie ihn, Ihr Passwort in der Benutzerverwaltung zurückzusetzen',
resetStep3: 'Er kann ein neues temporäres Passwort für Sie festlegen',
resetStep4: 'Melden Sie sich mit dem neuen Passwort an und ändern Sie es in den Einstellungen',
gotIt: 'Verstanden',
resetPassword: {
title: 'Neues Passwort festlegen',
subtitle: 'Geben Sie unten Ihr neues Passwort ein und bestätigen Sie es.',
newPassword: 'Neues Passwort',
newPasswordPlaceholder: 'Mindestens 8 Zeichen',
confirmPassword: 'Passwort bestätigen',
confirmPasswordPlaceholder: 'Neues Passwort wiederholen',
saving: 'Wird gespeichert\u2026',
submit: 'Neues Passwort festlegen',
backToLogin: 'Zurück zur Anmeldung',
passwordsDoNotMatch: 'Passwörter stimmen nicht überein',
passwordTooShort: 'Passwort muss mindestens 8 Zeichen lang sein',
resetFailed: 'Passwort zurücksetzen fehlgeschlagen. Der Link ist möglicherweise abgelaufen.',
},
twoFA: {
title: 'Zwei-Faktor-Authentifizierung',
subtitle: 'Ihr Konto ist mit 2FA geschützt. Geben Sie unten den Bestätigungscode ein.',
methodAuthenticator: 'Authenticator-App',
methodEmail: 'E-Mail-Code',
methodBackup: 'Wiederherstellungscode',
instructionsTotp: 'Öffnen Sie Ihre Authenticator-App und geben Sie den 6-stelligen Code für Bambuddy ein.',
instructionsEmail: 'Ein 6-stelliger Code wurde an Ihre E-Mail-Adresse gesendet. Er ist 10 Minuten gültig.',
instructionsEmailNotSent: 'Klicken Sie unten, um einen Bestätigungscode per E-Mail zu erhalten.',
instructionsBackup: 'Geben Sie einen Ihrer 8-stelligen Wiederherstellungscodes ein. Jeder Code kann nur einmal verwendet werden.',
sendCodeButton: 'Code per E-Mail senden',
sendingCode: 'Wird gesendet...',
resendCode: 'Code erneut senden',
codeLabel: 'Bestätigungscode',
backupCodeLabel: 'Wiederherstellungscode',
codePlaceholder: '000000',
backupCodePlaceholder: 'XXXXXXXX',
verifyButton: 'Bestätigen',
verifyingButton: 'Wird überprüft...',
backToLogin: '← Zurück zur Anmeldung',
orContinueWith: 'oder anmelden mit',
signInWith: 'Anmelden mit {{provider}}',
enterCode: 'Bitte geben Sie den Bestätigungscode ein',
sendCodeFailed: 'Bestätigungscode konnte nicht gesendet werden',
invalidCode: 'Ungültiger Code. Bitte erneut versuchen.',
},
},
// Setup page
setup: {
title: 'Bambuddy Einrichtung',
subtitle: 'Konfigurieren Sie die Authentifizierung für Ihre Bambuddy-Instanz',
enableAuth: 'Authentifizierung aktivieren',
adminAccount: 'Admin-Konto',
adminAccountDesc: 'Wenn bereits Admin-Benutzer existieren, wird die Authentifizierung mit den vorhandenen Admin-Konten aktiviert. Lassen Sie die Felder unten leer, um vorhandene Admins zu verwenden, oder geben Sie neue Anmeldedaten ein, um einen neuen Admin-Benutzer zu erstellen.',
adminUsername: 'Admin-Benutzername',
adminPassword: 'Admin-Passwort',
optionalIfAdminExists: '(optional, wenn Admin-Benutzer existieren)',
adminUsernamePlaceholder: 'Admin-Benutzernamen eingeben (optional)',
adminPasswordPlaceholder: 'Admin-Passwort eingeben (optional)',
confirmPassword: 'Passwort bestätigen',
confirmPasswordPlaceholder: 'Admin-Passwort bestätigen',
settingUp: 'Einrichtung läuft...',
completeSetup: 'Einrichtung abschließen',
toast: {
authEnabledAdminCreated: 'Authentifizierung aktiviert und Admin-Benutzer erstellt',
authEnabledExistingAdmins: 'Authentifizierung mit vorhandenen Admin-Benutzern aktiviert',
setupCompleted: 'Einrichtung abgeschlossen',
enterBothCredentials: 'Bitte geben Sie sowohl Admin-Benutzernamen als auch Passwort ein, oder lassen Sie beide leer, um vorhandene Admin-Benutzer zu verwenden',
passwordsDoNotMatch: 'Passwörter stimmen nicht überein',
passwordTooShort: 'Passwort muss mindestens 6 Zeichen lang sein',
},
},
// Password change
changePassword: {
title: 'Passwort ändern',
currentPassword: 'Aktuelles Passwort',
currentPasswordPlaceholder: 'Aktuelles Passwort eingeben',
newPassword: 'Neues Passwort',
newPasswordPlaceholder: 'Neues Passwort eingeben (min. 6 Zeichen)',
confirmPassword: 'Neues Passwort bestätigen',
confirmPasswordPlaceholder: 'Neues Passwort bestätigen',
passwordsDoNotMatch: 'Passwörter stimmen nicht überein',
passwordTooShort: 'Passwort muss mindestens 6 Zeichen lang sein',
changing: 'Wird geändert...',
success: 'Passwort erfolgreich geändert',
failed: 'Passwortänderung fehlgeschlagen',
},
// Plate detection alert
plateAlert: {
title: 'Druck pausiert!',
message: 'Objekte auf dem Druckbett erkannt. Der Druck wurde automatisch pausiert. Bitte räumen Sie das Druckbett und setzen Sie den Druck fort.',
understand: 'Verstanden',
},
// Camera page
camera: {
title: 'Kameraansicht',
invalidPrinterId: 'Ungültige Drucker-ID',
live: 'Live',
snapshot: 'Schnappschuss',
restartStream: 'Stream neu starten',
refreshSnapshot: 'Schnappschuss aktualisieren',
fullscreen: 'Vollbild',
exitFullscreen: 'Vollbild beenden',
connectingToCamera: 'Verbinde mit Kamera...',
capturingSnapshot: 'Schnappschuss wird aufgenommen...',
connectionLost: 'Verbindung verloren',
connectionFailed: 'Kameraverbindung fehlgeschlagen',
reconnecting: 'Neuverbindung in {{countdown}}s... (Versuch {{attempt}}/{{max}})',
reconnectNow: 'Jetzt verbinden',
cameraUnavailable: 'Kamera nicht verfügbar',
cameraUnavailableDesc: 'Stellen Sie sicher, dass der Drucker eingeschaltet und verbunden ist.',
noCamera: 'Keine Kamera verfügbar',
retry: 'Erneut versuchen',
cameraStream: 'Kamera-Stream',
zoomOut: 'Verkleinern',
zoomIn: 'Vergrößern',
resetZoom: 'Zoom zurücksetzen',
recording: 'Aufnahme',
startRecording: 'Aufnahme starten',
stopRecording: 'Aufnahme stoppen',
chamberLight: 'Kammerbeleuchtung umschalten',
},
// Groups management
groups: {
title: 'Gruppenverwaltung',
subtitle: 'Berechtigungsgruppen für Zugriffskontrolle verwalten',
backToSettings: 'Zurück zu Einstellungen',
createGroup: 'Gruppe erstellen',
noPermission: 'Sie haben keine Berechtigung, auf diese Seite zuzugreifen.',
system: 'System',
noDescription: 'Keine Beschreibung',
usersCount: '{{count}} Benutzer',
permissionsCount: '{{count}} Berechtigungen',
edit: 'Bearbeiten',
delete: 'Löschen',
toast: {
created: 'Gruppe erfolgreich erstellt',
updated: 'Gruppe erfolgreich aktualisiert',
deleted: 'Gruppe erfolgreich gelöscht',
enterGroupName: 'Bitte geben Sie einen Gruppennamen ein',
},
modal: {
editGroup: 'Gruppe bearbeiten',
createGroup: 'Gruppe erstellen',
cancel: 'Abbrechen',
saving: 'Speichern...',
creating: 'Erstellen...',
saveChanges: 'Änderungen speichern',
},
form: {
groupName: 'Gruppenname',
groupNamePlaceholder: 'Gruppennamen eingeben',
systemGroupWarning: 'Systemgruppennamen können nicht geändert werden',
description: 'Beschreibung',
descriptionPlaceholder: 'Beschreibung eingeben (optional)',
permissions: 'Berechtigungen ({{count}} ausgewählt)',
},
deleteModal: {
title: 'Gruppe löschen',
message: 'Sind Sie sicher, dass Sie diese Gruppe löschen möchten? Benutzer in dieser Gruppe verlieren diese Berechtigungen.',
confirm: 'Gruppe löschen',
},
editor: {
title: 'Gruppe bearbeiten',
createTitle: 'Gruppe erstellen',
search: 'Berechtigungen suchen...',
selectAll: 'Alle auswählen',
clearAll: 'Alle abwählen',
permissionsSelected: '{{count}} ausgewählt',
noResults: 'Keine Berechtigungen entsprechen Ihrer Suche',
},
},
// Users management
users: {
title: 'Benutzerverwaltung',
subtitle: 'Benutzer und deren Zugriff auf Ihre Bambuddy-Instanz verwalten',
backToSettings: 'Zurück zu Einstellungen',
createUser: 'Benutzer erstellen',
noPermission: 'Sie haben keine Berechtigung, auf diese Seite zuzugreifen.',
admin: 'Admin',
noGroups: 'Keine Gruppen',
active: 'Aktiv',
inactive: 'Inaktiv',
edit: 'Bearbeiten',
delete: 'Löschen',
system: 'System',
noGroupsAvailable: 'Keine Gruppen verfügbar',
table: {
username: 'Benutzername',
groups: 'Gruppen',
status: 'Status',
actions: 'Aktionen',
},
toast: {
created: 'Benutzer erfolgreich erstellt',
updated: 'Benutzer erfolgreich aktualisiert',
deleted: 'Benutzer erfolgreich gelöscht',
fillRequired: 'Bitte füllen Sie alle Pflichtfelder aus',
passwordsDoNotMatch: 'Passwörter stimmen nicht überein',
passwordTooShort: 'Passwort muss mindestens 6 Zeichen lang sein',
ldapProvisioned: 'LDAP-Benutzer „{{username}}" bereitgestellt',
},
modal: {
createUser: 'Benutzer erstellen',
editUser: 'Benutzer bearbeiten',
cancel: 'Abbrechen',
creating: 'Erstellen...',
saving: 'Speichern...',
saveChanges: 'Änderungen speichern',
advancedAuthSubtitle: 'mit erweiterter Authentifizierung',
// Manuelle LDAP-Bereitstellung (#1298)
tabsAriaLabel: 'Benutzerquelle',
localTab: 'Lokal',
ldapTab: 'LDAP',
ldapSearchLabel: 'Verzeichnis durchsuchen',
ldapSearchPlaceholder: 'Benutzername, Name oder E-Mail eingeben...',
ldapMinChars: 'Mindestens 2 Zeichen für die Suche eingeben',
ldapTypeToSearch: 'Tippen, um das LDAP-Verzeichnis zu durchsuchen',
ldapSearching: 'Verzeichnis wird durchsucht...',
ldapNoResults: 'Keine passenden Benutzer im Verzeichnis',
ldapSearchError: 'Verzeichnissuche fehlgeschlagen. Bitte LDAP-Server-Status prüfen.',
ldapAlreadyProvisioned: 'Bereits bereitgestellt',
ldapSelectedLabel: 'Ausgewählt',
ldapProvision: 'Benutzer bereitstellen',
ldapProvisioning: 'Wird bereitgestellt...',
ldapErrorProvision: 'Bereitstellung fehlgeschlagen. Bitte LDAP-Server-Status prüfen und erneut versuchen.',
},
form: {
username: 'Benutzername',
usernamePlaceholder: 'Benutzernamen eingeben',
email: 'E-Mail',
emailPlaceholder: 'benutzer@beispiel.de',
password: 'Passwort',
passwordPlaceholder: 'Passwort eingeben',
confirmPassword: 'Passwort bestätigen',
confirmPasswordPlaceholder: 'Passwort bestätigen',
newPasswordPlaceholder: 'Neues Passwort eingeben',
confirmNewPasswordPlaceholder: 'Neues Passwort bestätigen',
leaveBlankToKeep: 'leer lassen, um das aktuelle zu behalten',
groups: 'Gruppen',
optional: 'optional',
autoGeneratedPassword: 'Ein sicheres Passwort wird automatisch generiert und per E-Mail an den Benutzer gesendet.',
passwordManagedByAdvancedAuth: 'Das Passwort wird durch erweiterte Authentifizierung verwaltet. Verwenden Sie "Passwort zurücksetzen", um ein neues Passwort per E-Mail an den Benutzer zu senden.',
resetPassword: 'Passwort zurücksetzen',
resettingPassword: 'Passwort wird zurückgesetzt...',
},
deleteModal: {
title: 'Benutzer löschen',
message: 'Sind Sie sicher, dass Sie diesen Benutzer löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.',
confirm: 'Benutzer löschen',
},
},
// Stream overlay
streamOverlay: {
title: 'Stream-Overlay',
invalidPrinterId: 'Ungültige Drucker-ID',
cameraStream: 'Kamera-Stream',
progress: 'Fortschritt',
eta: 'ETA',
printerIdle: 'Drucker ist inaktiv',
printerOffline: 'Drucker offline',
status: {
printing: 'Druckt',
paused: 'Pausiert',
finished: 'Fertig',
failed: 'Fehlgeschlagen',
idle: 'Inaktiv',
unknown: 'Unbekannt',
},
},
// Profiles
profiles: {
title: 'Profile',
subtitle: 'Verwalten Sie Ihre Slicer-Voreinstellungen und Druckvorschub-Kalibrierungen',
tabs: {
cloud: 'Cloud-Profile',
local: 'Lokale Profile',
kprofiles: 'K-Profile',
},
localProfiles: {
title: 'Lokale Profile',
subtitle: 'Slicer-Voreinstellungen aus OrcaSlicer importieren und verwalten',
import: 'Profile importieren',
importDesc: '.bbscfg-, .bbsflmt-, .orca_filament-, .zip- oder .json-Dateien hier ablegen',
importing: 'Importiere...',
search: 'Lokale Voreinstellungen durchsuchen...',
noPresets: 'Noch keine lokalen Voreinstellungen',
badge: 'Lokal',
edit: 'Bearbeiten',
delete: 'Löschen',
cancel: 'Abbrechen',
deleteConfirmTitle: 'Voreinstellung löschen',
deleteConfirm: 'Möchten Sie diese Voreinstellung wirklich löschen? Dies kann nicht rückgängig gemacht werden.',
source: 'Quelle',
inheritsFrom: 'Erbt von',
filamentType: 'Typ',
vendor: 'Hersteller',
compatiblePrinters: 'Drucker',
nozzleTemp: 'Düsentemperatur',
cost: 'Kosten',
density: 'Dichte',
pressureAdvance: 'Druckvorschub',
filament: 'Filament',
process: 'Prozess',
printer: 'Drucker',
toast: {
importSuccess: '{{count}} Voreinstellung(en) importiert',
importSkipped: '{{count}} Voreinstellung(en) übersprungen (Duplikate)',
importError: '{{count}} Fehler beim Import',
deleted: 'Voreinstellung gelöscht',
updated: 'Voreinstellung aktualisiert',
},
},
connectedAs: 'Verbunden als',
logout: 'Abmelden',
noLogoutPermission: 'Sie haben keine Berechtigung zum Abmelden',
failedToLoad: 'Profile konnten nicht geladen werden',
retry: 'Erneut versuchen',
time: {
justNow: 'Gerade eben',
minsAgo: 'vor {{count}}m',
hoursAgo: 'vor {{count}}h',
daysAgo: 'vor {{count}}d',
},
toast: {
loggedOut: 'Abgemeldet',
},
login: {
title: 'Mit Bambu Cloud verbinden',
subtitle: 'Synchronisieren Sie Ihre Slicer-Voreinstellungen geräteübergreifend',
email: 'E-Mail',
password: 'Passwort',
region: 'Region',
regionGlobal: 'Global',
regionChina: 'China',
verificationCode: 'Bestätigungscode',
totpCode: 'Authenticator-Code',
checkEmail: 'Prüfen Sie Ihre E-Mail ({{email}}) für einen 6-stelligen Code',
enterTotpHint: 'Geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein',
accessToken: 'Zugriffstoken',
accessTokenHint: 'Fügen Sie Ihr Bambu-Cloud-Zugriffstoken ein. Konten der Region China müssen diesen Weg nutzen (telefonnummerngebunden — kein E-Mail-Login). Im Wiki steht, wie Sie das Token aus den MakerWorld-Cookies auslesen.',
back: 'Zurück',
loginButton: 'Anmelden',
verifyButton: 'Bestätigen',
setTokenButton: 'Token setzen',
useToken: 'Stattdessen Zugriffstoken verwenden',
useEmail: 'Stattdessen mit E-Mail anmelden',
toast: {
loggedIn: 'Erfolgreich angemeldet',
codeSent: 'Bestätigungscode an Ihre E-Mail gesendet',
enterTotp: 'Geben Sie den Code aus Ihrer Authenticator-App ein',
tokenSet: 'Token erfolgreich gesetzt',
},
},
presets: {
myPreset: 'Mein Profil (bearbeitbar)',
duplicate: 'Duplizieren',
editable: 'Bearbeitbar',
failedToLoadDetails: 'Profil-Details konnten nicht geladen werden',
deleteConfirm: 'Dieses Profil löschen?',
deleteWarning: '"{{name}}" wird dauerhaft aus Bambu Cloud gelöscht. Dies kann nicht rückgängig gemacht werden.',
noDuplicatePermission: 'Sie haben keine Berechtigung zum Duplizieren von Profilen',
noEditPermission: 'Sie haben keine Berechtigung zum Bearbeiten von Profilen',
noDeletePermission: 'Sie haben keine Berechtigung zum Löschen von Profilen',
types: {
filament: 'Filament-Profil',
printer: 'Drucker-Profil',
process: 'Prozess-Profil',
},
toast: {
deleted: 'Profil gelöscht',
created: 'Profil erstellt',
updated: 'Profil aktualisiert',
duplicated: 'Profil dupliziert',
fieldAdded: 'Feld "{{key}}" hinzugefügt',
exported: 'Profil exportiert',
},
baseLabel: 'Basis: {{name}}',
currentLabel: 'Aktuell: {{name}}',
newPreset: 'Neues Profil',
editPreset: 'Profil bearbeiten',
duplicatePreset: 'Profil duplizieren',
createNewPreset: 'Neues Profil erstellen',
customizeSettings: 'Passen Sie die Einstellungen für Ihr neues Profil an',
compareWithBase: 'Mit Basis-Profil vergleichen',
compare: 'Vergleichen',
// CreatePresetModal - Basic Info
basePreset: 'Basis-Profil',
selectBasePreset: 'Basis-Profil auswählen...',
presetName: 'Profilname',
myCustomPreset: 'Mein eigenes Profil',
inheritsFrom: 'Erbt von',
dropJsonToImport: 'JSON zum Importieren ablegen',
// CreatePresetModal - Tabs
tabs: {
common: 'Allgemein',
allFields: 'Alle Felder',
},
// CreatePresetModal - All Fields Tab
availableFields: 'Verfügbare Felder',
searchFieldsPlaceholder: 'Felder suchen...',
noMatchingFields: 'Keine passenden Felder',
allFieldsAdded: 'Alle Felder hinzugefügt',
addCustomField: 'Eigenes Feld hinzufügen',
yourOverrides: 'Ihre Überschreibungen',
noOverridesYet: 'Noch keine Überschreibungen',
clickFieldsToAdd: 'Klicken Sie links auf Felder, um sie hinzuzufügen',
saveAsTemplate: 'Als Vorlage speichern',
jsonTip: 'Tipp: Ziehen Sie eine .json-Datei auf dieses Fenster, um Einstellungen zu importieren',
},
cloudView: {
searchPlaceholder: 'Profile suchen...',
templates: 'Vorlagen',
refresh: 'Aktualisieren',
newPreset: 'Neues Profil',
clearFilters: 'Filter zurücksetzen',
// Compare mode
compareMode: 'Vergleichsmodus',
selectAnotherPreset: 'Wählen Sie ein weiteres {{type}}-Profil',
clickTwoPresets: 'Klicken Sie auf zwei Profile des gleichen Typs zum Vergleichen',
selectFirst: '1. Erstes auswählen',
selectSecond: '2. Zweites auswählen',
compareNow: 'Jetzt vergleichen',
// Status row
lastSynced: 'Zuletzt synchronisiert:',
showingCount: '{{showing}} von {{total}} Profilen',
noPresetsFound: 'Keine Profile gefunden',
// Column headers
columns: {
filament: 'Filament',
process: 'Prozess',
printer: 'Drucker',
},
noFilamentPresets: 'Keine Filament-Profile',
noProcessPresets: 'Keine Prozess-Profile',
noPrinterPresets: 'Keine Drucker-Profile',
// Filters
filters: {
type: 'Typ',
owner: 'Besitzer',
printer: 'Drucker',
nozzle: 'Düse',
filament: 'Filament',
layer: 'Schicht',
all: 'Alle',
myPresets: 'Meine Profile',
builtIn: 'Voreingestellt',
process: 'Prozess',
},
// Permissions
noTemplatesPermission: 'Sie haben keine Berechtigung, Vorlagen zu verwalten',
noRefreshPermission: 'Sie haben keine Berechtigung, Profile zu aktualisieren',
noCreatePermission: 'Sie haben keine Berechtigung, Profile zu erstellen',
},
templates: {
title: 'Schnellvorlagen',
noTemplates: 'Noch keine Vorlagen',
createFirst: 'Erstellen Sie Vorlagen aus dem Preset-Editor',
typeFilter: 'Typ:',
deleteTitle: 'Vorlage löschen',
deleteWarning: 'Diese Aktion kann nicht rückgängig gemacht werden',
deleteConfirm: 'Möchten Sie "{{name}}" wirklich löschen?',
namePlaceholder: 'Vorlagenname',
descriptionPlaceholder: 'Beschreibung',
settingsJson: 'Einstellungen (JSON)',
fieldsCount: '{{count}} Felder',
shownInModals: 'In Dialogen angezeigt',
hiddenInModals: 'In Dialogen ausgeblendet',
apply: 'Anwenden',
toast: {
deleted: 'Vorlage gelöscht',
updated: 'Vorlage aktualisiert',
created: 'Vorlage erstellt',
applied: 'Vorlage angewendet',
},
},
},
// Support/Debug
support: {
debugLoggingActive: 'Debug-Protokollierung ist aktiv',
manageLogs: 'Verwalten',
collectItem7: 'Drucker-Verbindungsstatus und Firmware-Versionen',
collectItem8: 'Integrationsstatus (Spoolman, MQTT, HA)',
collectItem9: 'Netzwerkschnittstellen (nur Subnetze)',
collectItem10: 'Python-Paketversionen',
collectItem11: 'Datenbankzustandsprüfungen',
collectItem12: 'Docker-Umgebungsdetails',
},
// File manager
fileManager: {
title: 'Dateimanager',
subtitle: 'Organisieren und verwalten Sie Ihre Druckdateien',
uploadFiles: 'Dateien hochladen',
newFolder: 'Neuer Ordner',
folderName: 'Ordnername',
folderNamePlaceholder: 'z.B. Funktionsteile',
renameFile: 'Datei umbenennen',
renameFolder: 'Ordner umbenennen',
moveFiles: '{{count}} Datei(en) verschieben',
rootNoFolder: 'Stammverzeichnis (Kein Ordner)',
current: 'aktuell',
linkFolder: 'Ordner verknüpfen',
linkFolderDescription: '"{{name}}" mit einem Projekt oder Archiv verknüpfen für schnellen Zugriff.',
project: 'Projekt',
archive: 'Archiv',
noProjectsFound: 'Keine Projekte gefunden',
noArchivesFound: 'Keine Archive gefunden',
unlink: 'Verknüpfung aufheben',
link: 'Verknüpfen',
dragDropFiles: 'Dateien hierher ziehen',
dropFilesHere: 'Dateien hier ablegen',
orClickToBrowse: 'oder klicken zum Durchsuchen',
allFileTypesSupported: 'Alle Dateitypen werden unterstützt. ZIP-Dateien werden extrahiert.',
zipFilesDetected: 'ZIP-Dateien erkannt',
zipExtractOptions: 'ZIP-Dateien werden extrahiert. Wählen Sie, wie die Ordnerstruktur behandelt werden soll:',
preserveZipStructure: 'Ordnerstruktur aus ZIP beibehalten',
createFolderFromZip: 'Ordner aus ZIP-Dateiname erstellen',
stlThumbnailGeneration: 'STL-Vorschaubildgenerierung',
zipMayContainStl: 'ZIP-Dateien können STL-Dateien enthalten. Vorschaubilder können während der Extraktion generiert werden.',
thumbnailsCanBeGenerated: 'Vorschaubilder können für STL-Dateien generiert werden. Große Modelle benötigen möglicherweise mehr Zeit.',
generateThumbnailsForStl: 'Vorschaubilder für STL-Dateien generieren',
threemfDetected: '3MF-Dateien erkannt',
threemfExtractionInfo: 'Druckermodell, Material, Farbe und Druckeinstellungen werden automatisch aus 3MF-Dateien extrahiert.',
willBeExtracted: 'Wird extrahiert',
filesExtracted: '{{count}} Dateien extrahiert',
uploadComplete: 'Upload abgeschlossen: {{succeeded}} erfolgreich',
uploadFailed: 'Hochladen fehlgeschlagen',
zipFilesFailed: '{{count}} Dateien fehlgeschlagen',
uploading: 'Hochladen...',
changeLink: 'Verknüpfung ändern...',
linkTo: 'Verknüpfen mit...',
linkToProjectOrArchive: 'Mit Projekt oder Archiv verknüpfen',
addToQueue: 'Zur Warteschlange',
schedulePrint: 'Planen',
generateThumbnail: 'Vorschaubild generieren',
generateThumbnails: 'Vorschaubilder generieren',
generateThumbnailsForMissing: 'Vorschaubilder für STL-Dateien ohne Vorschau generieren',
gridView: 'Rasteransicht',
listView: 'Listenansicht',
lowDiskSpaceWarning: 'Warnung: Wenig Speicherplatz',
lowDiskSpaceDetails: 'Nur {{free}} frei von {{total}} gesamt. Schwellenwert ist auf {{threshold}} GB eingestellt.',
files: 'Dateien',
folders: 'Ordner',
size: 'Größe',
free: 'Frei',
allFiles: 'Alle Dateien',
wrap: 'Umbrechen',
enableTextWrapping: 'Textumbruch aktivieren',
disableTextWrapping: 'Textumbruch deaktivieren',
collapse: 'Einklappen',
collapseFoldersByDefault: 'Ordner standardmäßig einklappen',
expandFoldersByDefault: 'Ordner standardmäßig ausklappen',
dragToResizeTooltip: 'Ziehen zum Ändern der Größe, Doppelklick zum Zurücksetzen',
searchFiles: 'Dateien suchen...',
allTypes: 'Alle Typen',
prints: 'Drucke',
ascending: 'Aufsteigend',
descending: 'Absteigend',
resultsCount: '{{showing}} von {{total}} Dateien',
selectAll: 'Alle auswählen',
deselectAll: 'Auswahl aufheben',
selected: '{{count}} ausgewählt',
adding: 'Hinzufügen...',
loadingFiles: 'Dateien werden geladen...',
folderIsEmpty: 'Ordner ist leer',
noFilesYet: 'Noch keine Dateien',
folderEmptyDescription: 'Laden Sie Dateien hoch oder verschieben Sie Dateien in diesen Ordner.',
noFilesDescription: 'Laden Sie Dateien hoch, um Ihre Druckdateien zu organisieren.',
noMatchingFiles: 'Keine passenden Dateien',
noMatchingFilesDescription: 'Keine Dateien entsprechen Ihren aktuellen Such- oder Filterkriterien.',
clearFilters: 'Filter zurücksetzen',
printedCount: '{{count}}x gedruckt',
uploadedBy: 'Hochgeladen von',
deleteFolder: 'Ordner löschen',
deleteFile: 'Datei löschen',
deleteFilesCount: '{{count}} Dateien löschen',
deleteFolderConfirm: 'Möchten Sie diesen Ordner wirklich löschen? Alle Dateien darin werden ebenfalls gelöscht.',
deleteFileConfirm: 'Möchten Sie diese Datei wirklich löschen?',
deleteFilesConfirm: 'Möchten Sie {{count}} ausgewählte Dateien wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.',
deleting: 'Wird gelöscht...',
noPermissionRenameFolder: 'Sie haben keine Berechtigung, Ordner umzubenennen',
noPermissionLinkFolder: 'Sie haben keine Berechtigung, Ordner zu verknüpfen',
noPermissionDeleteFolder: 'Sie haben keine Berechtigung, Ordner zu löschen',
noPermissionPrint: 'Sie haben keine Berechtigung zum Drucken',
noPermissionSlice: 'Sie haben keine Berechtigung, Dateien zu slicen',
noPermissionAddToQueue: 'Sie haben keine Berechtigung, zur Warteschlange hinzuzufügen',
noPermissionDownload: 'Sie haben keine Berechtigung, Dateien herunterzuladen',
noPermissionRenameFile: 'Sie haben keine Berechtigung, diese Datei umzubenennen',
noPermissionGenerateThumbnail: 'Sie haben keine Berechtigung, Vorschaubilder zu generieren',
noPermissionDeleteFile: 'Sie haben keine Berechtigung, diese Datei zu löschen',
noPermissionCreateFolder: 'Sie haben keine Berechtigung, Ordner zu erstellen',
noPermissionUpload: 'Sie haben keine Berechtigung, Dateien hochzuladen',
noPermissionMoveFiles: 'Sie haben keine Berechtigung, Dateien zu verschieben',
noPermissionDeleteFiles: 'Sie haben keine Berechtigung, Dateien zu löschen',
// External folder
linkExternal: 'Extern verknüpfen',
linkExternalFolder: 'Externen Ordner verknüpfen',
linkExternalFolderDescription: 'Ein Host-Verzeichnis (NAS, USB, Netzlaufwerk) in den Dateimanager einbinden. Dateien werden nicht kopiert — sie werden direkt vom Originalpfad gelesen.',
externalFolderNamePlaceholder: 'z.B. NAS-Drucke',
externalPath: 'Host-Pfad',
externalPathHelp: 'Absoluter Pfad zum Verzeichnis auf dem Docker-Host. Muss als Bind-Mount in den Container eingebunden sein.',
readOnly: 'Nur Lesen',
readOnlyHelp: 'verhindert Uploads und Löschungen',
showHiddenFiles: 'Versteckte Dateien anzeigen (Punkt-Dateien)',
externalFolder: 'Externer Ordner',
scanFolder: 'Scannen',
toast: {
folderCreated: 'Ordner erstellt',
folderDeleted: 'Ordner gelöscht',
fileDeleted: 'Datei gelöscht',
filesDeleted: '{{count}} Dateien gelöscht',
filesMoved: 'Dateien verschoben',
folderLinked: 'Ordner verknüpft',
folderUnlinked: 'Ordnerverknüpfung aufgehoben',
externalFolderLinked: 'Externer Ordner verknüpft und gescannt',
folderScanned: 'Scan abgeschlossen: {{added}} hinzugefügt, {{removed}} entfernt',
addedToQueue: '{{count}} Datei(en) zur Warteschlange hinzugefügt',
addedToQueuePartial: '{{added}} Datei(en) hinzugefügt, {{failed}} fehlgeschlagen',
failedToAddToQueue: 'Fehler beim Hinzufügen: {{error}}',
fileRenamed: 'Datei umbenannt',
folderRenamed: 'Ordner umbenannt',
thumbnailsGenerated: '{{count}} Vorschaubild(er) generiert',
thumbnailsGeneratedPartial: '{{succeeded}} Vorschaubild(er) generiert, {{failed}} fehlgeschlagen',
noStlMissingThumbnails: 'Keine STL-Dateien ohne Vorschaubild',
failedToGenerateThumbnails: 'Fehler beim Generieren der Vorschaubilder: {{error}}',
thumbnailGenerated: 'Vorschaubild generiert',
failedToGenerateThumbnail: 'Fehler beim Generieren des Vorschaubildes: {{error}}',
},
},
// Projects
projects: {
title: 'Projekte',
subtitle: 'Organisieren und verfolgen Sie Ihre 3D-Druckprojekte',
newProject: 'Neues Projekt',
editProject: 'Projekt bearbeiten',
deleteProject: 'Projekt löschen',
projectName: 'Projektname',
description: 'Beschreibung',
noProjects: 'Noch keine Projekte',
noProjectsFiltered: 'Keine {{status}} Projekte',
noProjectsFilteredHelp: 'Sie haben keine {{status}} Projekte. Projekte werden hier angezeigt, wenn sich ihr Status ändert.',
createFirst: 'Erstellen Sie Ihr erstes Projekt, um verwandte Drucke zu organisieren, den Fortschritt zu verfolgen und Ihre Builds zu verwalten.',
createFirstButton: 'Erstes Projekt erstellen',
create: 'Erstellen',
files: 'Dateien',
prints: 'Drucke',
plates: 'Platten',
parts: 'Teile',
lastModified: 'Zuletzt geändert',
deleteConfirm: 'Möchten Sie dieses Projekt wirklich löschen? Archive und Warteschlangenelemente werden getrennt, aber nicht gelöscht.',
addFiles: 'Dateien hinzufügen',
removeFile: 'Datei entfernen',
viewDetails: 'Details anzeigen',
// Modal fields
namePlaceholder: 'z.B. Voron 2.4 Build',
descriptionPlaceholder: 'Optionale Beschreibung...',
urlLabel: 'URL',
urlPlaceholder: 'https://makerworld.com/...',
urlInvalid: 'URL muss mit http:// oder https:// beginnen',
openExternalUrl: 'Projekt-URL öffnen',
coverImageLabel: 'Titelbild',
coverImageAlt: 'Projekt-Titelbild',
coverImageUpload: 'Hochladen',
coverImageReplace: 'Ersetzen',
coverImageRemove: 'Entfernen',
color: 'Farbe',
targetPlates: 'Ziel-Platten',
targetPlatesPlaceholder: 'z.B. 25',
targetPlatesHelp: 'Anzahl der Druckaufträge',
targetParts: 'Ziel-Teile',
targetPartsPlaceholder: 'z.B. 150',
targetPartsHelp: 'Benötigte Objekte insgesamt',
tagsLabel: 'Tags (kommagetrennt)',
tagsPlaceholder: 'z.B. voron, funktional, geschenk',
dueDate: 'Fälligkeitsdatum',
priority: 'Priorität',
priorityLow: 'Niedrig',
priorityNormal: 'Normal',
priorityHigh: 'Hoch',
priorityUrgent: 'Dringend',
// Status
statusActive: 'Aktiv',
statusCompleted: 'Abgeschlossen',
statusArchived: 'Archiviert',
done: 'Fertig',
completed: 'abgeschlossen',
failed: 'fehlgeschlagen',
inQueue: 'in Warteschlange',
noPrintsYet: 'Noch keine Drucke',
// Footer stats
printJobs: 'Druckaufträge (Platten)',
partsPrinted: 'Gedruckte Teile',
failedParts: 'Fehlgeschlagene Teile',
// Actions
import: 'Importieren',
export: 'Exportieren',
importProject: 'Projekt importieren',
exportAll: 'Alle Projekte exportieren',
loading: 'Projekte werden geladen...',
// Permissions
noEditPermission: 'Sie haben keine Berechtigung, Projekte zu bearbeiten',
noDeletePermission: 'Sie haben keine Berechtigung, Projekte zu löschen',
noCreatePermission: 'Sie haben keine Berechtigung, Projekte zu erstellen',
noImportPermission: 'Sie haben keine Berechtigung, Projekte zu importieren',
noExportPermission: 'Sie haben keine Berechtigung, Projekte zu exportieren',
// Toast
toast: {
created: 'Projekt erstellt',
updated: 'Projekt aktualisiert',
deleted: 'Projekt gelöscht',
imported: 'Projekt importiert',
multipleImported: '{{count}} Projekte importiert',
importFailed: 'Import fehlgeschlagen',
exported: 'Projekte exportiert (nur Metadaten)',
},
},
// Project detail page
projectDetail: {
notFound: 'Projekt nicht gefunden',
backToProjects: 'Zurück zu Projekten',
export: 'Exportieren',
exportProject: 'Projekt exportieren',
noExportPermission: 'Sie haben keine Berechtigung, Projekte zu exportieren',
noEditPermission: 'Sie haben keine Berechtigung, Projekte zu bearbeiten',
partOf: 'Teil von:',
priorityLabel: 'Priorität:',
noPrints: 'Noch keine Drucke in diesem Projekt',
status: {
active: 'Aktiv',
completed: 'Abgeschlossen',
archived: 'Archiviert',
},
priority: {
low: 'Niedrig',
normal: 'Normal',
high: 'Hoch',
urgent: 'Dringend',
},
dueDate: {
overdue: 'Überfällig',
today: 'Heute fällig',
daysLeft: '{{count}} Tage übrig',
},
progress: {
platesProgress: 'Platten-Fortschritt',
partsProgress: 'Teile-Fortschritt',
printJobs: 'Druckaufträge',
parts: 'Teile',
percentComplete: '{{percent}}% abgeschlossen',
remaining: '{{count}} verbleibend',
},
stats: {
printJobs: 'Druckaufträge',
total: 'gesamt',
failed: '{{count}} fehlgeschlagen',
partsPrinted: '{{count}} Teile gedruckt',
printTime: 'Druckzeit',
filamentUsed: 'Filament verbraucht',
},
cost: {
title: 'Kostenverfolgung',
filamentCost: 'Filamentkosten',
energy: 'Energie',
totalCost: 'Gesamtkosten',
total: 'Gesamt',
includesBom: 'inkl. Stückliste',
budget: 'Budget',
remaining: 'Verbleibend',
},
subProjects: {
title: 'Unterprojekte ({{count}})',
},
notes: {
title: 'Notizen',
noEditPermission: 'Sie haben keine Berechtigung, Notizen zu bearbeiten',
placeholder: 'Notizen zu diesem Projekt hinzufügen...',
empty: 'Noch keine Notizen. Klicken Sie auf Bearbeiten, um Notizen hinzuzufügen.',
},
files: {
title: 'Dateien',
linkFolders: 'Ordner aus dem Dateimanager verknüpfen',
forQuickAccess: 'für schnellen Zugriff auf dieses Projekt.',
fileCount: '{{count}} Datei(en)',
empty: 'Keine Ordner verknüpft. Gehen Sie zum Dateimanager und verknüpfen Sie einen Ordner mit diesem Projekt.',
noFiles: 'Keine Dateien in diesem Ordner.',
print: 'Jetzt drucken',
addToQueue: 'Zur Warteschlange',
},
bom: {
title: 'Stückliste',
acquired: '{{completed}}/{{total}} beschafft',
showAll: 'Alle anzeigen',
hideDone: 'Erledigte ausblenden',
addPart: 'Teil hinzufügen',
noAddPermission: 'Sie haben keine Berechtigung, Teile hinzuzufügen',
partNamePlaceholder: 'Teilename (z.B. M3x8 Schrauben)',
partName: 'Teilename',
qty: 'Menge',
price: 'Preis ({{currency}})',
sourcingUrlPlaceholder: 'Bezugsquelle-URL (optional)',
remarksPlaceholder: 'Bemerkungen (optional)',
deletePart: 'Teil löschen',
deleteConfirm: 'Möchten Sie "{{name}}" wirklich löschen?',
noUpdatePermission: 'Sie haben keine Berechtigung, Teile zu aktualisieren',
noEditPermission: 'Sie haben keine Berechtigung, Teile zu bearbeiten',
noDeletePermission: 'Sie haben keine Berechtigung, Teile zu löschen',
totalCost: 'Gesamtkosten:',
empty: 'Keine Teile in der Stückliste. Fügen Sie Hardware, Elektronik oder andere Komponenten hinzu, um zu verfolgen, was beschafft werden muss.',
},
timeline: {
title: 'Aktivitätsverlauf',
empty: 'Noch keine Aktivität.',
},
template: {
saveAsTemplate: 'Als Vorlage speichern',
noCreatePermission: 'Sie haben keine Berechtigung, Vorlagen zu erstellen',
},
queue: {
title: 'Warteschlange',
viewAll: 'Alle anzeigen',
printing: '{{count}} druckend',
queued: '{{count}} in Warteschlange',
},
prints: {
title: 'Drucke ({{count}})',
},
toast: {
projectUpdated: 'Projekt aktualisiert',
partAdded: 'Teil hinzugefügt',
partRemoved: 'Teil entfernt',
exportFailed: 'Export fehlgeschlagen',
projectExported: 'Projekt exportiert',
templateCreated: 'Vorlage erstellt',
},
},
// System info
system: {
title: 'Systeminformationen',
version: 'Version',
uptime: 'Laufzeit',
cpuUsage: 'CPU-Auslastung',
memoryUsage: 'Speicherauslastung',
diskUsage: 'Festplattenauslastung',
networkInfo: 'Netzwerkinformationen',
logs: 'Protokolle',
debugMode: 'Debug-Modus',
enableDebug: 'Debug-Protokollierung aktivieren',
disableDebug: 'Debug-Protokollierung deaktivieren',
downloadLogs: 'Protokolle herunterladen',
clearLogs: 'Protokolle löschen',
dockerInfo: 'Docker-Info',
containerName: 'Container-Name',
imageName: 'Image-Name',
platform: 'Plattform',
architecture: 'Architektur',
},
// Library (K Profiles)
library: {
title: 'Filament-Bibliothek',
addFilament: 'Filament hinzufügen',
editFilament: 'Filament bearbeiten',
deleteFilament: 'Filament löschen',
vendor: 'Hersteller',
material: 'Material',
color: 'Farbe',
kFactor: 'K-Faktor',
temperature: 'Temperatur',
noFilaments: 'Keine Filamente in der Bibliothek',
deleteConfirm: 'Möchten Sie dieses Filament wirklich löschen?',
importFromPrinter: 'Vom Drucker importieren',
exportToFile: 'In Datei exportieren',
},
// Slice (slicer-API integration via SliceModal)
slice: {
title: 'Modell slicen',
action: 'Slicen',
slicing: 'Slicen…',
printer: 'Drucker-Profil',
process: 'Prozess-Profil',
filament: 'Filament-Profil',
filamentSlot: 'Filament {{index}} – {{type}}',
selectPreset: '— Profil auswählen —',
loadingPresets: 'Profile werden geladen…',
analyzingPlateFilaments: 'Plattenfilamente werden analysiert…',
analyzingPlateFilamentsHint: 'Es wird ein Probeschnitt ausgeführt, um die belegten AMS-Slots dieser Platte zu ermitteln. Wird zwischengespeichert — erneutes Öffnen ist sofort.',
previewToast: '{{name}} wird analysiert — {{elapsed}}',
previewWithProgress: '{{name}} wird analysiert — {{stage}} ({{percent}}%) — {{elapsed}}',
notUsedByPlate: '— wird von dieser Platte nicht verwendet',
printerMismatch: 'Dieses 3MF wurde für {{source}} gesliced, du hast aber {{target}} ausgewählt. Der Slicer-CLI kann ein 3MF nicht für einen anderen Drucker neu slicen — öffne die Quelle in Bambu Studio, ändere den Drucker und exportiere neu.',
noPresetsForSlot: 'Keine Profile verfügbar',
presetsLoadFailed: 'Profile konnten nicht geladen werden. Importiere sie zuerst unter Einstellungen → Profile.',
allPresetsRequired: 'Alle Profile müssen ausgewählt sein',
enqueuing: 'Slice-Auftrag wird übermittelt…',
queued: 'In Warteschlange…',
failed: 'Slicen fehlgeschlagen. Logs des Slicer-Sidecars prüfen.',
startedToast: '{{name}} wird im Hintergrund gesliced…',
queuedToast: 'Warteschlange: {{name}} — {{elapsed}}',
runningToast: '{{name}} wird gesliced — {{elapsed}}',
runningWithProgress: '{{name}} – {{stage}} ({{percent}} %) – {{elapsed}}',
completedToast: '{{name}} wurde gesliced',
failedToast: 'Slicen von {{name}} fehlgeschlagen: {{detail}}',
tier: {
local: 'Importiert',
cloud: 'Cloud',
standard: 'Standard',
},
cloud: {
notAuthenticated: 'In Bambu Cloud anmelden (Einstellungen → Profile → Cloud), um deine Cloud-Profile zu sehen.',
expired: 'Bambu-Cloud-Sitzung abgelaufen — erneut anmelden, um die Cloud-Profile zu aktualisieren.',
unreachable: 'Bambu Cloud ist gerade nicht erreichbar. Lokale und Standard-Profile funktionieren weiterhin.',
},
bedType: {
label: 'Druckbett',
auto: 'Auto (aus Prozess-Profil)',
coolPlate: 'Cool Plate',
coolPlateSuperTack: 'Cool Plate SuperTack',
engineering: 'Engineering Plate',
highTemp: 'High Temp Plate',
texturedPEI: 'Textured PEI Plate',
smoothPEI: 'Smooth PEI Plate',
},
},
// Spoolman
spoolman: {
title: 'Spoolman-Integration',
enabled: 'Spoolman aktiviert',
url: 'Spoolman URL',
connected: 'Verbunden',
disconnected: 'Nicht verbunden',
testConnection: 'Verbindung testen',
sync: 'Synchronisieren',
syncing: 'Synchronisiert...',
lastSync: 'Letzte Synchronisierung',
linkToSpoolman: 'Mit Spoolman verknüpfen',
openInSpoolman: 'In Spoolman öffnen',
unlinkSpool: 'Spule trennen',
unlinkConfirmTitle: 'Spule entfernen?',
unlinkConfirmMessage: 'Die Spule wird vom Slot entfernt. Die Spulendaten selbst bleiben unverändert.',
selectSpool: 'Spule auswählen',
noUnlinkedSpools: 'Keine nicht zugewiesenen Spulen verfügbar',
linkSuccess: 'Spule erfolgreich zugewiesen',
linkFailed: 'Spule konnte nicht zugewiesen werden',
unlinkSuccess: 'Spule erfolgreich entfernt',
unlinkFailed: 'Spule konnte nicht entfernt werden',
linkedSpool: 'Zugewiesene Spule',
spoolId: 'Spulen-ID',
fillSourceLabel: '(Spoolman)',
weight: 'Gewicht',
remaining: 'Verbleibend',
disableWeightSync: 'AMS-Gewichtsschätzung deaktivieren',
disableWeightSyncDesc: 'Verbleibende Kapazität nicht aus AMS-Schätzungen aktualisieren. Verwenden Sie dies, wenn Sie die Verbrauchserfassung von Spoolman gegenüber den prozentualen AMS-Schätzungen bevorzugen. Neue Spulen verwenden weiterhin die AMS-Schätzung als Anfangsgewicht.',
reportPartialUsage: 'Teilverbrauch bei fehlgeschlagenen Drucken melden',
reportPartialUsageDesc: 'Wenn ein Druck fehlschlägt oder abgebrochen wird, den geschätzten Filamentverbrauch bis zu diesem Zeitpunkt basierend auf dem Schichtfortschritt melden.',
},
// Inventar
inventory: {
title: 'Spulen-Inventar',
subtitle: 'Verwalten Sie Ihre Spulen',
spoolmanMixedContentTitle: 'Spoolman lässt sich nicht über HTTPS laden — Browser blockiert gemischte Inhalte',
spoolmanMixedContentBody: 'Bambuddy wird über HTTPS ausgeliefert (über deinen Reverse-Proxy), aber deine Spoolman-URL ist nach wie vor HTTP. Browser blockieren gemischte Inhalte aus Sicherheitsgründen, daher kann die eingebettete Spoolman-Oberfläche nicht geladen werden. Spoolman muss ebenfalls über HTTPS erreichbar sein.',
spoolmanMixedContentFixReverseProxy: 'Stelle Spoolman hinter denselben Reverse-Proxy wie Bambuddy (Traefik / Nginx / Caddy) mit HTTPS und aktualisiere die Spoolman-URL in den Einstellungen auf die neue HTTPS-Adresse.',
spoolmanMixedContentFixOpenNewTab: 'Als Workaround kannst du Spoolman in einem neuen Tab über HTTP öffnen — gemischte Inhalte werden nur innerhalb eingebetteter Frames blockiert, ein eigener Tab funktioniert weiterhin.',
spoolmanOpenInNewTab: 'Spoolman in neuem Tab öffnen',
labels: {
title: 'Spulen-Etiketten drucken',
selectedCount: '{{count}} ausgewählt',
pickSpools: 'Wählen Sie, für welche Spulen Etiketten gedruckt werden sollen:',
searchPlaceholder: 'Name, Marke oder #ID suchen',
filterByMaterial: 'Material:',
allMaterials: 'Alle',
selectVisible: 'Alle sichtbaren auswählen ({{count}})',
deselectVisible: 'Sichtbare abwählen',
clearAll: 'Alle entfernen',
noSpoolsToShow: 'Keine Spulen anzuzeigen. Filter anpassen und erneut versuchen.',
noMatches: 'Keine Spulen entsprechen der aktuellen Suche oder dem Filter.',
printOne: 'Etikett für diese Spule drucken',
printLabels: 'Etiketten drucken…',
bulkTitle: 'Spulen aus den aktuell angezeigten {{count}} zum Etikettieren auswählen',
noSpoolsTitle: 'Keine Spulen zum Etikettieren',
error: 'Etiketten konnten nicht erstellt werden: {{msg}}',
templates: {
ams: {
label: 'AMS holder (30 × 15 mm)',
hint: 'Ein Etikett pro Seite; passt in den beliebten AMS-Filament-Etikettenhalter.',
},
box40x30: {
label: 'Boxetikett (40 × 30 mm)',
hint: 'Ein Etikett pro Seite; gängige DK/Brother-Rollengröße, ideal für Filament-Beutel und Lager-Etiketten.',
},
box: {
label: 'Box label (62 × 29 mm)',
hint: 'Ein Etikett pro Seite; für Brother PT/QL und Dymo-Kleinetiketten dimensioniert.',
},
averyL7160: {
label: 'Avery L7160 — A4 sheet (38.1 × 63.5 mm × 21)',
hint: 'EU-Bogenformat; 21 Etiketten pro A4-Seite.',
},
avery5160: {
label: 'Avery 5160 — US Letter sheet (25.4 × 66.7 mm × 30)',
hint: 'US-Bogenformat; 30 Etiketten pro Letter-Seite.',
},
},
},
addSpool: 'Spule hinzufügen',
copySpool: 'Spule kopieren',
editSpool: 'Spule bearbeiten',
material: 'Material',
selectMaterial: 'Material auswählen...',
subtype: 'Untertyp',
brand: 'Marke',
searchBrand: 'Marke suchen...',
useCustomBrand: '"{{brand}}" verwenden',
useCustomMaterial: 'Benutzerdefiniertes Material verwenden: {{material}}',
colorName: 'Farbname',
colorNamePlaceholder: 'Jadeweiß, Feuerrot...',
color: 'Farbe',
hexColor: 'Hex-Farbe',
pickColor: 'Benutzerdefinierte Farbe wählen',
labelWeight: 'Nenngewicht',
coreWeight: 'Leergewicht der Spule',
searchSpoolWeight: 'Spulengewicht suchen...',
weightUsed: 'Verbraucht',
currentWeight: 'Restgewicht',
measuredWeight: 'Gemessenes Gewicht',
spoolName: 'Spule',
costPerKg: 'Kosten pro kg',
storageLocation: 'Lagerstandort',
storageLocationPlaceholder: 'z.B. Regal A, Schublade 1',
openInInventory: 'Im Inventar öffnen',
measuredWeightError: 'Das gemessene Gewicht muss zwischen {{min}}g und {{max}}g liegen.',
slicerFilament: 'Slicer-Filament',
slicerFilamentName: 'Slicer-Preset-Name',
slicerPreset: 'Slicer-Preset',
searchPresets: 'Filament-Presets suchen...',
selectedPreset: 'Ausgewählt',
noPresetsFound: 'Keine Presets gefunden',
tempOverrides: 'Temperatur-Überschreibungen',
note: 'Notiz',
notePlaceholder: 'Zusätzliche Notizen zu dieser Spule...',
// Per-spool category + low-stock threshold override (#729)
category: 'Kategorie',
categoryPlaceholder: 'z. B. Produktion, Prototyp, Kunde A',
categoryNone: 'Ohne Kategorie',
storageLocationNone: 'Kein Lagerort',
lowStockThresholdOverride: 'Niedrigbestandsschwelle (diese Spule)',
lowStockThresholdOverrideHelp: 'Leer lassen, um den globalen Schwellenwert ({{global}}%) zu verwenden.',
// RFID button rename (was "Tag löschen")
clearRfid: 'RFID-Tag löschen',
rfidCleared: 'RFID-Tag gelöscht',
archive: 'Archivieren',
restore: 'Wiederherstellen',
noSpools: 'Noch keine Spulen. Fügen Sie Ihre erste Spule hinzu.',
noAvailableSpools: 'Keine Spulen verfügbar. Fügen Sie eine Spule zum Inventar hinzu oder lösen Sie eine aus einem anderen Slot.',
kProfiles: 'K-Profile',
addKProfile: 'K-Profil hinzufügen',
assignSpool: 'Spule zuweisen',
unassignSpool: 'Zuweisung aufheben',
assignSuccess: 'Spule zugewiesen und AMS-Slot konfiguriert',
assignFailed: 'Spulenzuweisung fehlgeschlagen',
selectSpool: 'Wählen Sie eine Spule für diesen Slot',
assigned: 'Zugewiesen',
assigning: 'Wird zugewiesen...',
searchSpools: 'Spulen suchen...',
showAllSpools: 'Alle Spulen anzeigen',
spoolmanSpools: 'Spoolman-Spulen',
allMaterials: 'Alle Materialien',
filterByBrand: 'Nach Marke filtern...',
showArchived: 'Archivierte anzeigen',
quickAdd: 'Schnellerfassung (Lager)',
quantity: 'Menge',
stock: 'Lager',
configured: 'Konfiguriert',
spoolsCreated: '{{count}} Spulen erstellt',
spoolsPartiallyCreated: '{{created}} von {{total}} Spulen erstellt (einige fehlgeschlagen)',
spoolCreated: 'Spule erstellt',
spoolUpdated: 'Spule aktualisiert',
spoolDeleted: 'Spule gelöscht',
deepLinkSpoolNotFound: 'Spule nicht gefunden',
deepLinkFetchFailed: 'Spule konnte nicht geladen werden — bitte erneut versuchen',
spoolArchived: 'Spule archiviert',
spoolRestored: 'Spule wiederhergestellt',
kProfileSaveFailed: 'K-Profil-Einstellungen konnten nicht gespeichert werden',
syncWeightSpoolNotFound: 'Spule nicht gefunden — sie wurde möglicherweise gelöscht',
syncWeightSpoolmanUnreachable: 'Spoolman ist nicht erreichbar — bitte später erneut versuchen',
syncWeightFailed: 'Gewicht konnte nicht synchronisiert werden',
spoolmanUnreachable: 'Spoolman ist nicht erreichbar — bitte später erneut versuchen',
deleteSpoolNotFound: 'Spule nicht gefunden — sie wurde möglicherweise bereits gelöscht',
deleteFailed: 'Spule konnte nicht gelöscht werden',
archiveSpoolNotFound: 'Spule nicht gefunden — sie wurde möglicherweise bereits gelöscht',
archiveFailed: 'Spule konnte nicht archiviert werden',
restoreSpoolNotFound: 'Spule nicht gefunden — sie wurde möglicherweise bereits gelöscht',
restoreFailed: 'Spule konnte nicht wiederhergestellt werden',
saveFailed: 'Änderungen konnten nicht gespeichert werden',
tagClearFailed: 'Tag konnte nicht gelöscht werden',
deleteConfirm: 'Möchten Sie diese Spule wirklich löschen? Dies kann nicht rückgängig gemacht werden.',
archiveConfirm: 'Möchten Sie diese Spule wirklich archivieren?',
advancedSettings: 'Erweiterte Einstellungen',
filamentInfoTab: 'Filament-Info',
paProfileTab: 'PA-Profil',
filamentInfo: 'Filament',
additional: 'Zusätzlich',
loadingPresets: 'Cloud-Presets werden geladen...',
cloudConnected: 'Cloud verbunden',
cloudNotConnected: 'Cloud nicht verbunden (Standardwerte)',
recentColors: 'Zuletzt',
searchColors: 'Farben suchen...',
searchResults: 'Suchergebnisse',
allColors: 'Alle Farben',
commonColors: 'Häufige Farben',
showLess: 'Weniger',
showAll: 'Alle',
noColorsFound: 'Keine Farben gefunden',
noResults: 'Keine Ergebnisse',
// Multi-Color-Verlauf + visueller Effekt (#1154)
extraColorsLabel: 'Zusätzliche Farben',
extraColorsPlaceholder: 'EC984C,#6CD4BC,A66EB9,D87694',
extraColorsHint: '2 bis 8 Hex-Stops, durch Kommas getrennt. Wird als Verlauf dargestellt.',
extraColorsInvalid: 'Ungültige Hex-Werte ignoriert: {{tokens}}',
colorEffectLabel: 'Effekt',
colorEffect: {
none: 'Keiner',
// Oberflächeneffekte
sparkle: 'Glitzer',
wood: 'Holz',
marble: 'Marmor',
glow: 'Leuchtend',
matte: 'Matt',
// Glanz- / Finish-Varianten
silk: 'Seide',
galaxy: 'Galaxie',
rainbow: 'Regenbogen',
metal: 'Metallic',
translucent: 'Lichtdurchlässig',
// Mehrfarbige Varianten
gradient: 'Verlauf',
dualColor: 'Zweifarbig',
triColor: 'Dreifarbig',
multicolor: 'Mehrfarbig',
},
selectMaterialFirst: 'Bitte zuerst ein Material im Filament-Info Tab auswählen.',
noPrintersConfigured: 'Keine Drucker konfiguriert. Fügen Sie Drucker hinzu.',
matchingFilter: 'Filter',
anyBrand: 'Jede Marke',
anyVariant: 'Jede Variante',
autoSelect: 'Auto-Auswahl',
matches: 'Treffer',
match: 'Treffer',
noMatches: 'Keine Treffer',
connected: 'Verbunden',
offline: 'Offline',
printerOffline: 'Drucker ist offline. Verbinden Sie ihn, um Kalibrierungsprofile anzuzeigen.',
noKProfilesMatch: 'Keine K-Profile stimmen mit dem gewählten Filament überein.',
leftNozzle: 'Linke Düse',
rightNozzle: 'Rechte Düse',
profilesSelected: 'Kalibrierungsprofil(e) ausgewählt',
// Stats & enhanced table
totalInventory: 'Gesamtbestand',
totalConsumed: 'Gesamtverbrauch',
byMaterial: 'Nach Material',
inPrinter: 'Im Drucker',
lowStock: 'Niedriger Bestand',
sinceTracking: 'Seit Beginn der Erfassung',
loadedInAms: 'Im AMS/Ext geladen',
remaining: 'Verbleibend',
weightCheck: 'Gewichtskontrolle',
lastWeighed: 'Zuletzt gewogen',
neverWeighed: 'Nie gewogen',
search: 'Spulen suchen...',
showing: 'Zeige',
to: 'bis',
of: 'von',
show: 'Zeige',
spools: 'Spulen',
spool: 'Spule',
page: 'Seite',
noSpoolsMatch: 'Keine Ergebnisse',
noSpoolsMatchDesc: 'Versuchen Sie, Ihre Suche oder Filter anzupassen.',
active: 'Aktiv',
archived: 'Archiviert',
all: 'Alle',
used: 'Verwendet',
new: 'Neu',
clearFilters: 'Filter löschen',
table: 'Tabelle',
cards: 'Karten',
net: 'Netto',
// Grouping
groupSimilar: 'Gruppieren',
groupedSpools: '{{count}} identische Spulen',
groupedRows: 'Zeilen',
// Column config
columns: 'Spalten',
configureColumns: 'Spalten konfigurieren',
configureColumnsDesc: 'Ziehen zum Neuordnen oder Pfeile verwenden. Sichtbarkeit mit dem Augensymbol umschalten.',
visible: 'sichtbar',
reset: 'Zurücksetzen',
cancel: 'Abbrechen',
applyChanges: 'Änderungen anwenden',
moveUp: 'Nach oben',
moveDown: 'Nach unten',
hideColumn: 'Spalte ausblenden',
showColumn: 'Spalte einblenden',
// Tag-Verknüpfung
linkToSpool: 'Mit Spule verknüpfen',
tagLinked: 'Tag mit Spule verknüpft',
tagLinkFailed: 'Tag-Verknüpfung fehlgeschlagen',
tagAlreadyLinked: 'Tag bereits mit anderer Spule verknüpft',
unknownTag: 'Unbekannter RFID-Tag erkannt',
// Verbrauchshistorie
usageHistory: 'Verbrauchshistorie',
noUsageHistory: 'Noch kein Verbrauch erfasst',
printName: 'Druckname',
weightConsumed: 'Verbrauchtes Gewicht',
clearHistory: 'Löschen',
historyCleared: 'Verbrauchshistorie gelöscht',
fillSourceLabel: '(Inv)',
lowStockThresholdError: 'Der Schwellenwert muss zwischen 0.1 und 99.9 liegen',
assignMismatchTitle: 'Material stimmt nicht überein',
assignMismatchMessage: 'Das ausgewählte Spulenmaterial "{{spoolMaterial}}" stimmt nicht mit dem Tray-Material "{{trayMaterial}}" für {{location}} überein. Trotzdem zuweisen?',
assignMismatchConfirm: 'Trotzdem zuweisen',
assignPartialMismatchMessage: 'Das Spulenmaterial "{{spoolMaterial}}" ist ähnlich, stimmt aber nicht genau mit "{{trayMaterial}}" in {{location}} überein. Möchten Sie fortfahren?',
assignProfileMismatchMessage: 'Das Spulenprofil "{{spoolProfile}}" stimmt nicht mit dem Fachprofil "{{trayProfile}}" in {{location}} überein. Möchten Sie fortfahren?',
// Spoolman filament catalog picker
spoolmanFilamentCatalog: 'Spoolman-Filamentkatalog',
pickFromSpoolmanCatalog: 'Aus Spoolman-Katalog wählen…',
spoolmanFilamentSelected: 'Filament aus Spoolman-Katalog ausgewählt',
spoolmanFilamentUnlinked: 'Verknüpfung mit Filamentkatalog aufgehoben',
noSpoolmanFilaments: 'Keine Filamente im Spoolman-Katalog gefunden',
spoolmanFilamentColorSwatch: 'Filamentfarbe',
spoolWeightManagedBySpoolman: 'Das Leerspulengewicht wird pro Filamenttyp in Spoolman verwaltet',
spoolmanCatalogLoadFailed: 'Spoolman-Filamentkatalog konnte nicht geladen werden',
},
// Timelapse
timelapse: {
title: 'Zeitraffer',
create: 'Zeitraffer erstellen',
download: 'Herunterladen',
delete: 'Löschen',
preview: 'Vorschau',
frameRate: 'Bildrate',
quality: 'Qualität',
processing: 'Wird verarbeitet...',
noTimelapses: 'Keine Zeitraffer verfügbar',
},
// AMS
ams: {
title: 'AMS',
slot: 'Slot',
empty: 'Leer',
emptySlot: 'Leerer Slot',
unknown: 'Unbekannt',
humidity: 'Luftfeuchtigkeit',
temperature: 'Temperatur',
filamentType: 'Filamenttyp',
filamentColor: 'Farbe',
remaining: 'Verbleibend',
history: 'AMS-Verlauf',
noHistory: 'Kein Verlauf verfügbar',
configureSlot: 'Slot konfigurieren',
externalSpool: 'Externe Spule',
profile: 'Profil',
kFactor: 'K-Faktor',
fill: 'Füllstand',
configure: 'Konfigurieren',
used: 'verwendet',
remainingUnit: 'verbleibend',
},
// Print modal
printModal: {
title: 'Druck starten',
selectPrinter: 'Drucker auswählen',
selectPlate: 'Platte auswählen',
filamentMapping: 'Filamentzuordnung',
totalCost: 'Gesamtkosten:',
slotRemainingShort: ' - {{grams}}g übrig',
printSettings: 'Druckeinstellungen',
bedLeveling: 'Bett-Nivellierung',
flowCalibration: 'Fluss-Kalibrierung',
vibrationCalibration: 'Vibrations-Kalibrierung',
layerInspection: 'Erste-Schicht-Prüfung',
timelapse: 'Zeitraffer',
startPrint: 'Druck starten',
addToQueue: 'Zur Warteschlange hinzufügen',
cancel: 'Abbrechen',
noPrintersAvailable: 'Keine Drucker verfügbar',
printerBusy: 'Drucker ist beschäftigt',
printerOffline: 'Drucker ist offline',
sameTypeDifferentColor: 'Gleicher Typ, andere Farbe',
filamentTypeNotLoaded: 'Filamenttyp nicht geladen',
openCalendar: 'Kalender öffnen',
leftNozzle: 'L',
rightNozzle: 'R',
leftNozzleTooltip: 'Linke Düse',
rightNozzleTooltip: 'Rechte Düse',
filamentOverride: 'Filament-Überschreibung',
filamentOverrideHint: 'Filamente für modellbasierte Zuweisung optional überschreiben. Der Planer wird gegen die ausgewählten Filamente statt der ursprünglichen 3MF-Werte abgleichen.',
originalFilament: 'Original',
overrideWith: 'Ersetzen mit',
resetToOriginal: 'Auf Original zurücksetzen',
insufficientFilamentTitle: 'Nicht genug Filament',
insufficientFilamentMessage: 'Einige zugewiesene Spulen haben weniger Filament als dieser Druck benötigt:',
insufficientFilamentLine: '{{printer}} - {{slot}}: benötigt {{required}}g, verbleibend {{remaining}}g',
printAnyway: 'Trotzdem drucken',
forceColorMatch: 'Farbe erzwingen',
staggerPrinterStarts: 'Druckerstarts staffeln',
staggerGroupSize: 'Gruppengröße',
staggerInterval: 'Intervall (Min.)',
staggerPreview: '{{printers}} Drucker → {{groups}} Gruppen à {{size}}, Start alle {{interval}} Min.',
staggerLastGroup: 'letzte Gruppe: {{count}}',
staggerTotal: 'insgesamt: {{minutes}} Min.',
staggerToPrinters: 'Gestaffelt an {{count}} Drucker senden',
gcodeInjection: 'Auto-Print G-code einfügen',
},
// Backup
backup: {
includesEncryptionKey: 'Lokale Sicherungen enthalten die MFA-Schlüsseldatei (DATA_DIR/.mfa_encryption_key), damit ein Backup-ZIP selbstkonsistent ist. Behandle das ZIP als sensibel — wer Zugriff auf die Datei hat, kann die darin enthaltenen OIDC-Client-Secrets und TOTP-Geheimnisse entschlüsseln.',
title: 'Sichern & Wiederherstellen',
createBackup: 'Sicherung erstellen',
restoreBackup: 'Sicherung wiederherstellen',
restoreDescription: 'Alle Daten aus einer Sicherungsdatei ersetzen',
downloadBackup: 'Sicherung herunterladen',
uploadBackup: 'Sicherung hochladen',
lastBackup: 'Letzte Sicherung',
autoBackup: 'Automatische Sicherung',
backupNow: 'Jetzt sichern',
restoreWarning: 'Warnung: Das Wiederherstellen einer Sicherung überschreibt alle aktuellen Daten.',
includeArchives: 'Archive einschließen',
includeSettings: 'Einstellungen einschließen',
includeProfiles: 'Profile einschließen',
backupSuccess: 'Sicherung erfolgreich erstellt',
restoreSuccess: 'Sicherung erfolgreich wiederhergestellt',
backupFailed: 'Sicherung fehlgeschlagen',
restoreFailed: 'Wiederherstellung fehlgeschlagen',
restoreNote: 'Virtueller Drucker wird während der Wiederherstellung gestoppt',
// GitHub Backup
githubBackup: 'Git-Backup',
enabled: 'Aktiviert',
cloudLoginRequired: 'Bambu Cloud Login erforderlich. Melden Sie sich unter Profile → Cloud-Profile an, um GitHub-Backup zu aktivieren.',
cloudLoginRequiredShort: 'Cloud-Login erforderlich',
githubDescription: 'Synchronisieren Sie Ihre Profile automatisch mit einem privaten GitHub-Repository für Backup und Versionsverlauf.',
repositoryUrl: 'Repository-URL',
repoUrlPlaceholderGitHub: 'https://github.com/username/repo-name',
repoUrlPlaceholderGitea: 'https://gitea.example.com/username/repo-name',
repoUrlPlaceholderForgejo: 'https://forgejo.example.com/username/repo-name',
repoUrlPlaceholderGitLab: 'https://gitlab.com/username/repo-name',
allowInsecureHttp: 'Unsicheres HTTP erlauben',
allowInsecureHttpHint: 'Für selbst gehostete Instanzen in privaten Netzwerken ohne TLS aktivieren',
personalAccessToken: 'Persönlicher Zugriffstoken',
tokenSaved: '(gespeichert)',
enterNewToken: 'Neuen Token eingeben zum Aktualisieren',
tokenHint: 'Feingranularer Token mit Lese-/Schreibberechtigung für Inhalte',
branch: 'Branch',
provider: 'Git-Anbieter',
providerGitHub: 'GitHub',
providerGitLab: 'GitLab',
providerGitea: 'Gitea',
providerForgejo: 'Forgejo',
manualOnly: 'Nur manuell',
hourly: 'Stündlich',
daily: 'Täglich',
weekly: 'Wöchentlich',
includeInBackup: 'In Sicherung einschließen',
kProfiles: 'K-Profile',
kProfilesDescription: 'Druckvorschub-Kalibrierung von verbundenen Druckern',
noPrintersConnected: 'Keine Drucker verbunden',
printersConnected: '{{connected}}/{{total}} verbunden',
cloudProfiles: 'Cloud-Profile',
cloudProfilesDescription: 'Filament-, Drucker- und Prozessprofile aus der Bambu Cloud',
appSettings: 'App-Einstellungen',
appSettingsDescription: 'Bambuddy-Konfiguration (komplette Datenbank)',
spoolInventory: 'Spulenbestand',
spoolInventoryDescription: 'Filamentspulen, Nutzungsverlauf und Kostenverfolgung',
printArchives: 'Druckarchive',
printArchivesDescription: 'Druckverlauf-Metadaten (keine GCode/3MF-Dateien)',
lastBackupAt: 'Letzte Sicherung:',
noBackupsYet: 'Noch keine Sicherungen',
next: 'Nächste:',
startingBackup: 'Sicherung wird gestartet...',
test: 'Test',
enableBackup: 'Sicherung aktivieren',
testConnection: 'Verbindung testen',
enterRepoUrl: 'Repository-URL eingeben',
enterRepoAndToken: 'Repository-URL und Zugriffstoken eingeben',
repoRequired: 'Repository-URL ist erforderlich',
tokenRequired: 'Zugriffstoken ist erforderlich',
githubBackupEnabled: 'GitHub-Backup aktiviert',
tokenUpdated: 'Token aktualisiert',
settingsSaved: 'Einstellungen gespeichert',
failedToSave: 'Speichern fehlgeschlagen: {{message}}',
backupCompleteFiles: 'Sicherung abgeschlossen - {{count}} Dateien aktualisiert',
backupSkippedNoChanges: 'Sicherung übersprungen - keine Änderungen',
backupFailed2: 'Sicherung fehlgeschlagen: {{message}}',
clearedLogs: '{{count}} Protokolle gelöscht',
failedToClearLogs: 'Protokolle löschen fehlgeschlagen: {{message}}',
// History
history: 'Verlauf',
clear: 'Löschen',
date: 'Datum',
status: 'Status',
commit: 'Commit',
// Local Backup
localBackup: 'Lokale Sicherung',
localBackupDescription: 'Erstellen Sie eine vollständige Sicherung Ihrer Bambuddy-Daten einschließlich Datenbank, Archive, Uploads und aller Dateien.',
downloadBackupLabel: 'Sicherung herunterladen',
completeBackupZip: 'Vollständige Sicherung: Datenbank + alle Dateien (ZIP)',
download: 'Herunterladen',
preparingBackup: 'Sicherung wird vorbereitet...',
creatingArchive: 'Sicherungsarchiv wird erstellt... Dies kann bei großen Archiven eine Weile dauern.',
downloadingFile: 'Sicherungsdatei wird heruntergeladen...',
backupDownloaded: 'Sicherung erfolgreich heruntergeladen',
failedToCreateBackup: 'Sicherung erstellen fehlgeschlagen: {{message}}',
restore: 'Wiederherstellen',
restoreReplacesAll: 'Wiederherstellung ersetzt alle Daten.',
restoreReplacesAllDetail: 'Ihre aktuelle Datenbank und Dateien werden vollständig ersetzt. Nach der Wiederherstellung ist ein Neustart erforderlich.',
restoreConfirmTitle: 'Sicherung wiederherstellen',
restoreConfirmMessage: 'Sind Sie sicher, dass Sie von "{{filename}}" wiederherstellen möchten? Dies ersetzt Ihre aktuelle Datenbank und alle Dateien vollständig. Die Anwendung muss nach der Wiederherstellung neu gestartet werden.',
restoreConfirmButton: 'Sicherung wiederherstellen',
uploadingFile: 'Sicherungsdatei wird hochgeladen...',
backupRestoredRestart: 'Sicherung wiederhergestellt. Bitte starten Sie Bambuddy neu.',
failedToRestore: 'Sicherung wiederherstellen fehlgeschlagen. Bitte überprüfen Sie das Dateiformat.',
reloadNow: 'Jetzt neu laden',
creatingBackup: 'Sicherung erstellen',
restoringBackup: 'Sicherung wiederherstellen',
preparing: 'Vorbereiten...',
processing: 'Verarbeiten...',
doNotClosePage: 'Bitte schließen Sie diese Seite nicht und navigieren Sie nicht weg. Dieser Vorgang kann bei großen Sicherungen mehrere Minuten dauern.',
// RestoreModal
restoring: 'Wiederherstellen...',
restoreComplete: 'Wiederherstellung abgeschlossen',
restoreFailed2: 'Wiederherstellung fehlgeschlagen',
importSettings: 'Einstellungen aus einer Sicherungsdatei importieren',
pleaseWaitRestoring: 'Bitte warten Sie, während Ihre Daten wiederhergestellt werden',
selectBackupFile: 'Klicken Sie, um eine Sicherungsdatei auszuwählen (.json oder .zip)',
duplicateHandling: 'So funktioniert die Duplikatbehandlung:',
matchPrinters: 'Drucker',
matchPrintersBy: 'abgeglichen nach Seriennummer',
matchSmartPlugs: 'Smart Plugs',
matchSmartPlugsBy: 'abgeglichen nach IP-Adresse',
matchNotificationProviders: 'Benachrichtigungsanbieter',
matchNotificationProvidersBy: 'abgeglichen nach Name',
matchFilaments: 'Filamente',
matchFilamentsBy: 'abgeglichen nach Name + Typ + Marke',
matchArchives: 'Archive',
matchArchivesBy: 'abgeglichen nach Inhaltshash (immer übersprungen)',
matchPendingUploads: 'Ausstehende Uploads',
matchPendingUploadsBy: 'abgeglichen nach Dateiname',
matchSettingsTemplates: 'Einstellungen & Vorlagen',
matchSettingsTemplatesBy: 'immer überschrieben',
replaceExisting: 'Vorhandene Daten ersetzen',
keepExisting: 'Vorhandene Daten behalten',
overwriteDescription: 'Bereits vorhandene Elemente mit Sicherungsdaten überschreiben',
keepDescription: 'Nur Elemente wiederherstellen, die noch nicht vorhanden sind',
overwriteCaution: 'Achtung:',
overwriteWarning: 'Das Überschreiben ersetzt Ihre aktuellen Konfigurationen durch Daten aus der Sicherung. Drucker-Zugangscodes werden aus Sicherheitsgründen nie überschrieben.',
cancel: 'Abbrechen',
processingBackup: 'Sicherungsdatei wird verarbeitet...',
itemsRestored: 'Wiederhergestellt',
itemsSkipped: 'Übersprungen',
restored: 'Wiederhergestellt',
skippedAlreadyExist: 'Übersprungen (bereits vorhanden)',
filesCategory: 'Dateien (3MF, Thumbnails, etc.)',
andMore: '...und {{count}} weitere',
newApiKeysGenerated: 'Neue API-Schlüssel generiert',
keysShownOnce: 'Diese Schlüssel werden nur einmal angezeigt. Kopieren Sie sie jetzt!',
copy: 'Kopieren',
noDataFound: 'In der Sicherungsdatei wurden keine Daten zur Wiederherstellung gefunden.',
close: 'Schließen',
// Scheduled local backups (#884)
scheduledBackup: 'Geplante Backups',
scheduledBackupDescription: 'Backup-Snapshots automatisch nach Zeitplan erstellen. Ausgabeverzeichnis kann auf einen NAS oder externen Speicher gemountet werden.',
frequency: 'Frequenz',
backupTime: 'Zeit',
retention: 'Aufbewahrung',
retentionDescription: 'Anzahl der zu behaltenden Backups',
outputPath: 'Ausgabepfad',
outputPathPlaceholder: 'Standard: {{path}}',
outputPathDescription: 'Leer lassen für den Standardort',
runNow: 'Jetzt ausführen',
backupFiles: 'Backup-Dateien',
noScheduledBackups: 'Noch keine Backups',
deleteBackup: 'Löschen',
deleteBackupConfirm: 'Diese Backup-Datei löschen?',
backupRunning: 'Backup läuft...',
scheduledBackupComplete: 'Backup erfolgreich abgeschlossen',
scheduledBackupFailed: 'Backup fehlgeschlagen',
nextBackup: 'Nächstes Backup',
backupSize: 'Größe',
utc: 'UTC',
defaultPathLabel: 'Standard:',
// Category labels
categories: {
settings: 'Einstellungen',
notification_providers: 'Benachrichtigungsanbieter',
notification_templates: 'Benachrichtigungsvorlagen',
smart_plugs: 'Smart Plugs',
printers: 'Drucker',
filaments: 'Filamente',
maintenance_types: 'Wartungstypen',
archives: 'Archive',
projects: 'Projekte',
pending_uploads: 'Ausstehende Uploads',
external_links: 'Externe Links',
api_keys: 'API-Schlüssel',
},
},
// Tags
tags: {
title: 'Tags',
addTag: 'Tag hinzufügen',
editTag: 'Tag bearbeiten',
deleteTag: 'Tag löschen',
tagName: 'Tag-Name',
tagColor: 'Tag-Farbe',
noTags: 'Keine Tags',
deleteConfirm: 'Möchten Sie diesen Tag wirklich löschen?',
manageTags: 'Tags verwalten',
},
// Upload modal (archives)
uploadModal: {
title: '3MF-Dateien hochladen',
dragDrop: '3MF-Dateien hierher ziehen',
or: 'oder',
browseFiles: 'Dateien durchsuchen',
extractionInfo: 'Das Druckermodell wird automatisch aus den 3MF-Datei-Metadaten extrahiert.',
uploaded: 'hochgeladen',
failed: 'fehlgeschlagen',
uploading: 'Wird hochgeladen...',
upload: 'Hochladen',
uploadFailed: 'Hochladen fehlgeschlagen',
},
// Edit archive modal
editArchive: {
title: 'Archiv bearbeiten',
name: 'Name',
namePlaceholder: 'Druckname',
printer: 'Drucker',
noPrinter: 'Kein Drucker',
project: 'Projekt',
noProject: 'Kein Projekt',
itemsPrinted: 'Gedruckte Teile',
itemsPrintedHelp: 'Anzahl der in diesem Druckauftrag produzierten Teile',
notes: 'Notizen',
notesPlaceholder: 'Notizen zu diesem Druck hinzufügen...',
externalLink: 'Externer Link',
externalLinkPlaceholder: 'https://printables.com/model/...',
externalLinkHelp: 'Link zu Printables, Thingiverse oder anderer Quelle',
tags: 'Tags',
tagsPlaceholder: 'Tags hinzufügen...',
addMoreTags: 'Weitere Tags hinzufügen...',
matchingTags: 'Übereinstimmend mit "{{query}}"',
existingTags: 'Vorhandene Tags',
clickToAdd: '(zum Hinzufügen klicken)',
status: 'Status',
failureReason: 'Fehlergrund',
selectReason: 'Grund auswählen...',
photos: 'Fotos des Druckergebnisses',
photosHelp: 'Klicken Sie auf + um Fotos Ihres Druckergebnisses hinzuzufügen',
printResult: 'Druckergebnis',
saving: 'Wird gespeichert...',
// Failure reasons
failureReasons: {
adhesionFailure: 'Haftungsfehler',
spaghettiDetached: 'Spaghetti / Abgelöst',
layerShift: 'Schichtversatz',
cloggedNozzle: 'Verstopfte Düse',
filamentRunout: 'Filament aufgebraucht',
warping: 'Verformung',
stringing: 'Fadenziehen',
underExtrusion: 'Unterextrusion',
powerFailure: 'Stromausfall',
userCancelled: 'Vom Benutzer abgebrochen',
other: 'Sonstiges',
},
// Archive statuses
statuses: {
completed: 'Abgeschlossen',
failed: 'Fehlgeschlagen',
aborted: 'Abgebrochen',
printing: 'Druckt',
},
},
// K-Profiles
kProfiles: {
title: 'K-Profile',
noPrintersConfigured: 'Keine Drucker konfiguriert',
addPrinterInSettings: 'Fügen Sie einen Drucker in den Einstellungen hinzu, um K-Profile zu verwalten',
noActivePrinters: 'Keine aktiven Drucker',
enablePrinterConnection: 'Aktivieren Sie eine Druckerverbindung, um K-Profile anzuzeigen',
loadingProfiles: 'Lade K-Profile...',
printerOffline: 'Drucker offline',
printerOfflineDesc: 'Der ausgewählte Drucker ist nicht verbunden. Schalten Sie ihn ein, um K-Profile anzuzeigen.',
noMatchingProfiles: 'Keine passenden Profile',
noMatchingProfilesDesc: 'Keine Profile entsprechen Ihren Suchkriterien',
noKProfiles: 'Keine K-Profile',
noKProfilesDesc: 'Keine Druckvorschub-Profile für {{diameter}}mm Düse gefunden',
createFirstProfile: 'Erstes Profil erstellen',
// Controls
printer: 'Drucker',
nozzle: 'Düse',
refresh: 'Aktualisieren',
addProfile: 'Profil hinzufügen',
export: 'Exportieren',
import: 'Importieren',
select: 'Auswählen',
selectAll: 'Alle auswählen',
delete: 'Löschen',
// Filters
searchPlaceholder: 'Nach Name oder Filament suchen...',
allExtruders: 'Alle Extruder',
leftOnly: 'Nur links',
rightOnly: 'Nur rechts',
allFlow: 'Alle Flusstypen',
hfOnly: 'Nur HF',
sOnly: 'Nur S',
sortName: 'Sortieren: Name',
sortKValue: 'Sortieren: K-Wert',
sortFilament: 'Sortieren: Filament',
// Dual extruder labels
leftExtruder: 'Linker Extruder',
rightExtruder: 'Rechter Extruder',
// Modal
modal: {
addTitle: 'K-Profil hinzufügen',
editTitle: 'K-Profil bearbeiten',
profileName: 'Profilname',
profileNamePlaceholder: 'Mein PLA-Profil',
kValue: 'K-Wert',
kValuePlaceholder: '0,020',
kValueHelp: 'Typischer Bereich: 0,01 - 0,06 für PLA, 0,02 - 0,10 für PETG',
filament: 'Filament',
selectFilament: 'Filament auswählen...',
noFilamentsHelp: 'Keine Filamente gefunden. Erstellen Sie zuerst ein K-Profil in Bambu Studio.',
flowType: 'Flusstyp',
highFlow: 'Hoher Durchfluss',
standard: 'Standard',
nozzleSize: 'Düsengröße',
extruder: 'Extruder',
extruders: 'Extruder',
left: 'Links',
right: 'Rechts',
notes: 'Notizen (lokal gespeichert)',
notesPlaceholder: 'Notizen zu diesem Profil hinzufügen...',
notesHelp: 'Notizen werden in Bambuddy gespeichert, nicht auf dem Drucker',
syncing: 'Synchronisiert mit Drucker...',
savingExtruder: 'Speichern auf Extruder {{current}}/{{total}}...',
pleaseWait: 'Bitte warten',
},
// Delete confirmation
deleteConfirm: {
title: 'Profil löschen',
cannotUndo: 'Dies kann nicht rückgängig gemacht werden',
message: 'Möchten Sie "{{name}}" wirklich vom Drucker löschen?',
},
// Bulk delete
bulkDelete: {
title: 'Profile löschen',
cannotUndo: 'Dies kann nicht rückgängig gemacht werden',
message: 'Möchten Sie wirklich {{count}} ausgewählte Profile vom Drucker löschen?',
},
// Toast
toast: {
profileSaved: 'K-Profil gespeichert',
profilesSaved: 'K-Profil auf {{count}} Extrudern gespeichert',
selectAtLeastOneExtruder: 'Bitte wählen Sie mindestens einen Extruder aus',
profileDeleted: 'K-Profil gelöscht',
profilesDeleted: '{{count}} Profile gelöscht',
exportedProfiles: '{{count}} Profile exportiert',
importedProfiles: '{{count}} von {{total}} Profilen importiert',
noProfilesToExport: 'Keine Profile zum Exportieren',
invalidFileFormat: 'Ungültiges Dateiformat',
failedToParseImport: 'Import-Datei konnte nicht gelesen werden',
failedToSaveBatch: 'K-Profile konnten nicht gespeichert werden',
noteSaved: 'Notiz gespeichert',
failedToSaveNote: 'Notiz konnte nicht gespeichert werden',
},
// Permissions
permission: {
noRead: 'Sie haben keine Berechtigung, Profile zu aktualisieren',
noCreate: 'Sie haben keine Berechtigung, Profile hinzuzufügen',
noUpdate: 'Sie haben keine Berechtigung, K-Profile zu aktualisieren',
noDelete: 'Sie haben keine Berechtigung, K-Profile zu löschen',
noExport: 'Sie haben keine Berechtigung, Profile zu exportieren',
noImport: 'Sie haben keine Berechtigung, Profile zu importieren',
},
},
// Virtual Printer
virtualPrinter: {
title: 'Virtueller Drucker',
running: 'Läuft',
stopped: 'Gestoppt',
description: {
default: 'Aktiviere einen virtuellen Drucker, der in Bambu Studio und OrcaSlicer erscheint. Dateien, die an diesen Drucker gesendet werden, werden direkt archiviert ohne zu drucken.',
proxy: 'Aktiviere einen Proxy, der Slicer-Datenverkehr an einen echten Drucker weiterleitet, um Ferndruck über jedes Netzwerk zu ermöglichen.',
},
enable: {
title: 'Virtuellen Drucker aktivieren',
visibleInSlicer: 'Sichtbar als "Bambuddy" in der Slicer-Erkennung',
proxyingTo: 'Proxy zu {{name}}',
notActive: 'Nicht aktiv',
},
model: {
title: 'Druckermodell',
description: 'Wähle welches Druckermodell emuliert werden soll.',
restartWarning: 'Das Ändern des Modells startet den virtuellen Drucker neu',
},
accessCode: {
title: 'Zugangscode',
isSet: 'Zugangscode ist gesetzt',
notSet: 'Kein Zugangscode gesetzt - erforderlich zum Aktivieren',
placeholder: '8-Zeichen-Code eingeben',
placeholderChange: 'Neuen Code eingeben zum Ändern',
hint: 'Muss genau 8 Zeichen lang sein. Wird von Slicern zur Authentifizierung verwendet.',
charCount: '({{count}}/8)',
},
targetPrinter: {
title: 'Zieldrucker',
configured: 'Proxy-Ziel konfiguriert',
notConfigured: 'Kein Zieldrucker ausgewählt - erforderlich für Proxy-Modus',
placeholder: 'Drucker auswählen...',
hint: 'Wähle den Drucker aus, an den der Slicer-Datenverkehr weitergeleitet werden soll. Der Drucker muss im LAN-Modus sein.',
noPrinters: 'Keine Drucker konfiguriert. Füge zuerst einen Drucker hinzu, um den Proxy-Modus zu verwenden.',
},
remoteInterface: {
title: 'Netzwerkschnittstelle überschreiben',
configured: 'Schnittstellenüberschreibung aktiv',
optional: 'Optional - verwenden wenn die automatisch erkannte IP falsch ist (z.B. mehrere NICs, Docker, VPN)',
placeholder: 'Automatisch erkennen (Standard)...',
hint: 'Überschreibt die per SSDP beworbene und im TLS-Zertifikat verwendete IP-Adresse. Nützlich wenn Bambuddy mehrere Netzwerkschnittstellen hat.',
},
mode: {
title: 'Modus',
archive: 'Archivieren',
archiveDesc: 'Dateien sofort archivieren',
review: 'Überprüfen',
reviewDesc: 'Vor dem Archivieren überprüfen',
queue: 'Warteschlange',
queueDesc: 'Archivieren und zur Warteschlange hinzufügen',
proxy: 'Proxy',
proxyDesc: 'An echten Drucker weiterleiten',
},
autoDispatch: {
title: 'Automatisch starten',
description: 'Drucke automatisch starten, wenn sie zur Warteschlange hinzugefügt werden. Wenn deaktiviert, warten Drucke auf manuellen Start.',
},
queueForceColorMatch: {
title: 'Farbabgleich erzwingen',
description: 'Druckaufträge nur an Drucker senden, bei denen der genaue Filament-Typ und die genaue Farbe geladen sind. Standardmäßig deaktiviert — ohne diese Option verwendet die Warteschlange nur den Drucker-Modell-Abgleich und wählt möglicherweise einen Drucker mit der falschen Farbe.',
},
tailscaleDisabled: {
title: 'Tailscale-Integration',
description: 'Aktivieren, um diesen VP als per Tailscale erreichbar zu markieren. Zeigt die Tailscale-Adresse des Hosts an, damit du weißt, welche IP du im Slicer eintragen musst. Der CA-Import bleibt unverändert — diese Option hat keinen Einfluss auf Zertifikate.',
},
setupRequired: {
title: 'Einrichtung erforderlich',
description: 'Die virtuelle Druckerfunktion erfordert zusätzliche Systemkonfiguration, bevor sie funktioniert. Dies beinhaltet Portweiterleitung, Firewall-Regeln und plattformspezifische Einstellungen.',
readGuide: 'Lese die Einrichtungsanleitung vor dem Aktivieren',
},
archiveNameSource: {
title: 'Quelle des Archivnamens',
description: 'Lege fest, wie neue Archive benannt werden, wenn Dateien über den virtuellen Drucker eintreffen. "Metadaten" verwendet den im 3MF eingebetteten Titel des Slicers (Standard). "Dateiname" nutzt den Dateinamen, den Bambu Studio per FTP gesendet hat — praktisch, wenn der Job im Dialog "Zum Drucker senden" umbenannt wurde.',
metadata: 'Metadaten',
filename: 'Dateiname',
},
howItWorks: {
title: 'So funktioniert es',
step1: 'Im selben LAN erscheinen virtuelle Drucker automatisch in deinem Slicer (Bambu Studio / OrcaSlicer). Aus anderen Netzwerken füge sie manuell per IP-Adresse und Zugangscode hinzu.',
step2: 'Im Archiv-, Überprüfungs- und Warteschlangen-Modus verwende die "Senden"-Funktion im Slicer, um 3MF-Dateien an Bambuddy zu senden. Der Slicer zeigt "Druck erfolgreich" — die Datei wird gespeichert, nicht gedruckt.',
step3: 'Im Proxy-Modus leitet der virtuelle Drucker den gesamten Datenverkehr an einen echten Drucker weiter — Drucke starten sofort wie bei einer direkten Verbindung.',
},
status: {
title: 'Status-Details',
printerName: 'Druckername',
model: 'Modell',
serialNumber: 'Seriennummer',
mode: 'Modus',
pendingFiles: 'Ausstehende Dateien',
targetPrinter: 'Zieldrucker',
ftpPort: 'FTP-Port',
mqttPort: 'MQTT-Port',
ftpConnections: 'FTP-Verbindungen',
mqttConnections: 'MQTT-Verbindungen',
},
toast: {
updated: 'Virtuelle Druckereinstellungen aktualisiert',
failedToUpdate: 'Einstellungen konnten nicht aktualisiert werden',
copyFailed: 'Kopieren fehlgeschlagen — bitte Text manuell markieren',
accessCodeRequired: 'Bitte zuerst einen Zugangscode setzen',
targetPrinterRequired: 'Bitte zuerst einen Zieldrucker auswählen',
bindIpRequired: 'Bitte zuerst eine Bind-IP setzen',
accessCodeEmpty: 'Zugangscode darf nicht leer sein',
accessCodeLength: 'Zugangscode muss genau 8 Zeichen lang sein',
created: 'Virtueller Drucker erstellt',
failedToCreate: 'Virtueller Drucker konnte nicht erstellt werden',
deleted: 'Virtueller Drucker gelöscht',
failedToDelete: 'Virtueller Drucker konnte nicht gelöscht werden',
},
list: {
title: 'Virtuelle Drucker',
add: 'Hinzufügen',
addFirst: 'Virtuellen Drucker hinzufügen',
empty: 'Keine virtuellen Drucker konfiguriert. Fügen Sie einen hinzu, um zu beginnen.',
},
bindIp: {
title: 'Bind-Interface',
placeholder: 'Interface auswählen...',
hint: 'Netzwerkinterface, an das dieser virtuelle Drucker gebunden wird. Muss pro Drucker eindeutig sein.',
},
proxy: {
accessCodeHint: 'Im Proxy-Modus den Zugangscode des Zieldruckers im Slicer verwenden. Die Verbindung wird transparent zum echten Drucker weitergeleitet.',
},
addDialog: {
title: 'Virtuellen Drucker hinzufügen',
name: 'Name',
hint: 'Sie können Zugangscode, Zieldrucker und andere Einstellungen nach dem Erstellen konfigurieren.',
create: 'Erstellen',
},
deleteConfirm: {
title: 'Virtuellen Drucker löschen',
message: 'Möchten Sie "{{name}}" wirklich löschen? Dies stoppt alle Dienste für diesen Drucker.',
},
},
// Model Viewer
modelViewer: {
openInSlicer: 'Im Slicer öffnen',
tabs: {
model: '3D-Modell',
gcode: 'G-Code Vorschau',
},
notAvailable: 'nicht verfügbar',
notSliced: 'nicht geslicet',
plates: 'Platten',
allPlates: 'Alle Platten',
plateNumber: 'Platte {{number}}',
plateCount: '{{count}} Platte',
plateCount_other: '{{count}} Platten',
objectCount: '{{count}} Objekt',
objectCount_other: '{{count}} Objekte',
filamentCount: '{{count}} Filament',
filamentCount_other: '{{count}} Filamente',
eta: 'ETA {{minutes}} Min',
noPreview: 'Keine Vorschau für diese Datei verfügbar',
pagination: {
pageOf: 'Seite {{current}} von {{total}}',
prev: 'Zurück',
next: 'Weiter',
},
errors: {
failedToLoad: 'Datei konnte nicht geladen werden',
noMeshes: 'Keine Meshes in 3MF-Datei gefunden',
unsupportedFormat: 'Nicht unterstütztes Dateiformat',
},
},
// Maintenance type descriptions (built-in)
maintenanceDescriptions: {
lubricateCarbonRods: 'Schmiermittel auf Karbonstäbe für sanfte Bewegung auftragen',
lubricateRails: 'Schmiermittel auf Linearschienen für sanfte Bewegung auftragen',
cleanNozzle: 'Hotend und Düse reinigen, um Verstopfungen zu verhindern',
checkBelts: 'Riemenspannung für präzise Drucke überprüfen',
cleanBuildPlate: 'Druckplatte für bessere Haftung reinigen',
checkExtruder: 'Extruderzahnräder auf Verschleiß prüfen',
checkCooling: 'Sicherstellen, dass Lüfter ordnungsgemäß funktionieren',
generalInspection: 'Allgemeine Druckerinspektion',
cleanCarbonRods: 'Karbonstäbe reinigen, um Reibung zu reduzieren',
lubricateSteelRods: 'Schmiermittel auf Stahlstangen für sanfte Bewegung auftragen',
cleanSteelRods: 'Stahlstangen reinigen, um Reibung zu reduzieren',
cleanLinearRails: 'Linearschienen abwischen, um Staub und Schmutz zu entfernen',
checkPtfeTube: 'PTFE-Schlauch auf Verschleiß oder Beschädigung prüfen',
replaceHepaFilter: 'HEPA-Filter für Luftqualität ersetzen',
replaceCarbonFilter: 'Aktivkohlefilter ersetzen',
lubricateLeftNozzleRail: 'Linke Düsenschiene schmieren (H2-Serie)',
},
// Smart Plugs
smartPlugs: {
offline: 'Offline',
admin: 'Admin',
openPlugAdminPage: 'Plug-Admin-Seite öffnen',
deleteSmartPlug: 'Smart Plug löschen',
turnOnSmartPlug: 'Smart Plug einschalten',
turnOffSmartPlug: 'Smart Plug ausschalten',
turnOn: 'Einschalten',
turnOff: 'Ausschalten',
addSmartPlug: {
scanningNetwork: 'Netzwerk wird durchsucht...',
chooseEntity: 'Entität auswählen...',
connectionFailed: 'Verbindung fehlgeschlagen',
searchEntities: 'Entitäten suchen...',
searchPowerSensors: 'Leistungssensoren suchen...',
searchEnergySensors: 'Energiesensoren suchen...',
placeholders: {
plugName: 'Wohnzimmer Steckdose',
mqttStateOnValue: 'ON, true, 1',
mqttSameAsPower: 'Gleich wie Leistungs-Topic oder anders',
},
},
// SmartPlugCard
linkedTo: 'Verbunden mit:',
monitorOnly: 'Nur Überwachung',
alerts: 'Alarme',
scheduleOn: 'Ein {{time}}',
scheduleOff: 'Aus {{time}}',
on: 'Ein',
off: 'Aus',
power: 'Leistung',
kwhToday: 'kWh Heute',
settings: 'Einstellungen',
automationSettings: 'Automatisierungseinstellungen',
showInSwitchbar: 'In Schaltleiste anzeigen',
quickAccessSidebar: 'Schnellzugriff über Seitenleiste',
enabled: 'Aktiviert',
enableAutomation: 'Automatisierung für diesen Stecker aktivieren',
autoOn: 'Auto Ein',
autoOnDescription: 'Einschalten wenn Druck startet',
autoOff: 'Auto Aus',
autoOffDescription: 'Ausschalten wenn Druck abgeschlossen (einmalig)',
autoOffPersistent: 'Aktiviert lassen',
autoOffPersistentDescription: 'Zwischen Drucken aktiviert bleiben statt einmalig',
autoOffAfterDrying: 'Automatisch aus nach Trocknung',
autoOffAfterDryingDescription: 'Ausschalten, wenn AMS-Trocknung abgeschlossen ist',
delayAfterDryingMinutes: 'Verzögerung nach Trocknung (Minuten)',
turnOffDelayMode: 'Ausschaltverzögerungsmodus',
time: 'Zeit',
temp: 'Temp.',
delayMinutes: 'Verzögerung (Minuten)',
tempThreshold: 'Temperaturschwelle (°C)',
tempThresholdDescription: 'Schaltet aus wenn die Düse unter diese Temperatur abkühlt',
edit: 'Bearbeiten',
deleteConfirm: 'Möchten Sie "{{name}}" wirklich löschen? Dies kann nicht rückgängig gemacht werden.',
turnOnConfirm: 'Möchten Sie "{{name}}" wirklich einschalten?',
turnOffConfirm: 'Möchten Sie "{{name}}" wirklich ausschalten? Dies unterbricht die Stromversorgung des angeschlossenen Geräts.',
failedToTurn: '{{name}}" konnte nicht {{action}} werden',
unknown: 'Unbekannt',
// AddSmartPlugModal
addTitle: 'Smart Plug hinzufügen',
editTitle: 'Smart Plug bearbeiten',
stopScanning: 'Suche beenden',
discoverTasmota: 'Tasmota Geräte suchen',
foundDevices: '{{count}} Gerät(e) gefunden - zum Auswählen klicken:',
noDevicesFound: 'Keine Tasmota Geräte in Ihrem Netzwerk gefunden',
haNotConfigured: 'Home Assistant ist nicht konfiguriert. Einrichtung unter',
haSettingsPath: 'Einstellungen → Netzwerk → Home Assistant',
selectEntity: 'Entität auswählen *',
ipAddress: 'IP-Adresse *',
nameLabel: 'Name *',
username: 'Benutzername',
password: 'Passwort',
authHint: 'Leer lassen, wenn Ihr Tasmota-Gerät keine Authentifizierung benötigt',
linkToPrinter: 'Mit Drucker verbinden',
noPrinter: 'Kein Drucker (nur manuelle Steuerung)',
linkingDescription: 'Verknüpfung ermöglicht automatisches Ein-/Ausschalten bei Druckstart/-ende',
powerAlerts: 'Leistungsalarme',
alertAbove: 'Alarm wenn über (W)',
alertBelow: 'Alarm wenn unter (W)',
alertDescription: 'Benachrichtigung wenn der Stromverbrauch diese Schwellenwerte überschreitet. Leer lassen um diese Richtung zu deaktivieren.',
dailySchedule: 'Tagesplan',
turnOnAt: 'Einschalten um',
turnOffAt: 'Ausschalten um',
scheduleDescription: 'Den Stecker automatisch täglich zu diesen Zeiten ein-/ausschalten. Leer lassen um diese Aktion zu überspringen.',
showOnPrinterCard: 'Auf Druckerkarte anzeigen',
displayOnPrinterCard: 'Schaltfläche auf Druckerkarte anzeigen',
connectedResult: 'Verbunden!',
deviceLabel: 'Gerät: {{name}} - ',
stateLabel: 'Status: {{state}}',
test: 'Test',
delete: 'Löschen',
save: 'Speichern',
add: 'Hinzufügen',
cancel: 'Abbrechen',
failedToStartScan: 'Suche konnte nicht gestartet werden',
nameRequired: 'Name ist erforderlich',
entityRequired: 'Entität ist für Home Assistant Stecker erforderlich',
mqttTopicRequired: 'Mindestens ein MQTT-Topic muss für Leistung, Energie oder Statusüberwachung konfiguriert sein',
loadingEntities: 'Entitäten werden geladen...',
loading: 'Laden...',
failedToLoadEntities: 'Entitäten konnten nicht geladen werden: {{error}}',
noEntitiesMatching: 'Keine Entitäten gefunden die "{{search}}" entsprechen',
noEntitiesAvailable: 'Keine Entitäten verfügbar',
searchingEntities: 'Alle Entitäten durchsuchen ({{count}} gefunden)',
showingEntities: 'Zeige switch, light, input_boolean ({{count}} verfügbar)',
energyMonitoringOptional: 'Energieüberwachung (Optional)',
energyMonitoringHint: 'Sensoren suchen und auswählen, die Leistungs-/Energiedaten liefern.',
powerSensorW: 'Leistungssensor (W)',
energyTodayKwh: 'Energie Heute (kWh)',
totalEnergyKwh: 'Gesamtenergie (kWh)',
noMatchingSensors: 'Keine passenden Sensoren',
none: 'Keine',
mqttNotConfigured: 'MQTT-Broker nicht konfiguriert. Broker-Adresse einstellen unter',
mqttSettingsPath: 'Einstellungen → Netzwerk → MQTT-Veröffentlichung',
mqttNotConfiguredSuffix: '(Sie müssen die Veröffentlichung nicht aktivieren, nur die Broker-Details ausfüllen).',
mqttMonitorOnlyDescription: 'MQTT-Stecker empfangen Leistungs-/Energiedaten über MQTT-Abonnement. Ein-/Ausschalten ist nicht verfügbar - verwenden Sie Ihren MQTT-Broker oder Ihr Home-Automation-System.',
powerMonitoring: 'Leistungsüberwachung',
energyMonitoring: 'Energieüberwachung',
stateMonitoring: 'Statusüberwachung',
optional: 'optional',
topic: 'Thema',
jsonPath: 'JSON-Pfad',
multiplier: 'Multiplikator',
onValue: 'EIN-Wert',
mqttPowerHint: 'JSON-Pfad extrahiert Wert aus JSON-Payload (z.B. "power_l1"). Leer lassen wenn Topic rohe numerische Werte sendet.\nMultiplikator 0.001 für mW→W, 1000 für kW→W verwenden.',
mqttEnergyHint: 'JSON-Pfad extrahiert Wert aus JSON-Payload. Leer lassen für rohe Werte.\nMultiplikator 0.001 für Wh→kWh, 1000 für MWh→kWh verwenden.',
mqttStateHint: 'JSON-Pfad extrahiert Wert aus JSON-Payload. Leer lassen für rohe Werte.\nEIN-Wert: der genaue String der "EIN" bedeutet. Leer lassen für Auto-Erkennung (ON, true, 1).',
// REST smart plug
restControl: 'Steuerung',
restOnUrl: 'Einschalt-URL',
restOffUrl: 'Ausschalt-URL',
restOnBody: 'EIN-Anforderungstext',
restOffBody: 'AUS-Anforderungstext',
restMethod: 'HTTP-Methode',
restHeaders: 'Custom Headers (JSON)',
restStatusUrl: 'Status-URL',
restStatusPath: 'JSON-Pfad für Status',
restStatusOnValue: 'EIN-Wert',
restPowerUrl: 'Strom-URL',
restPowerPath: 'JSON-Pfad für Leistung',
restPowerMultiplier: 'Power Multiplikator',
restEnergyUrl: 'Energie URL',
restEnergyPath: 'JSON-Pfad für Energie',
restEnergyMultiplier: 'Energie Multiplikator',
restUrlRequired: 'Mindestens eine URL (ON oder OFF) ist für REST-Steckdosen erforderlich',
restHeadersHint: 'z. B. {"Authorization": "Bearer your-token"}',
restBodyHint: 'z. B. ON, {"state": "on"}',
restStatusHint: 'URL zum Abfragen des aktuellen Status',
restPathHint: 'z. B. state oder data.power.status',
restPowerUrlHint: 'Eigene URL für Leistungsdaten (nutzt Status URL wenn leer)',
restEnergyUrlHint: 'Eigene URL für Energiedaten (nutzt Status URL wenn leer)',
restEnergyHint: 'Jeder Wert kann eine eigene URL verwenden oder auf die Status URL zurückgreifen. Multiplikatoren für Einheitenumrechnung verwenden (z.B. 0.001 für Wh zu kWh).',
testConnection: 'Verbindung testen',
connectionSuccess: 'Verbindung erfolgreich',
noSwitchesInSwitchbar: 'Keine Schalter in der Schaltleiste',
enableSwitchbarHint: '"In Schaltleiste anzeigen" unter Einstellungen > Smart Plugs aktivieren',
},
// Notifications
notifications: {
// Provider types
providerTypes: {
callmebot: 'CallMeBot/WhatsApp',
ntfy: 'ntfy',
pushover: 'Pushover',
telegram: 'Telegram',
email: 'E-Mail',
discord: 'Discord',
webhook: 'Webhook',
homeassistant: 'Home Assistant',
},
// Provider descriptions
providerDescriptions: {
email: 'SMTP-E-Mail-Benachrichtigungen',
telegram: 'Benachrichtigungen über Telegram-Bot',
discord: 'An Discord-Kanal per Webhook senden',
ntfy: 'Kostenlose, selbst-hostbare Push-Benachrichtigungen',
pushover: 'Einfache, zuverlässige Push-Benachrichtigungen',
callmebot: 'Kostenlose WhatsApp-Benachrichtigungen über CallMeBot',
webhook: 'Generischer HTTP-POST an beliebige URL',
homeassistant: 'Dauerhafte Benachrichtigungen im Home Assistant Dashboard',
},
// NotificationProviderCard
lastSuccess: 'Zuletzt: {{date}}',
error: 'Fehler',
printer: 'Drucker:',
allPrinters: 'Alle Drucker',
sendTestNotification: 'Testbenachrichtigung senden',
eventSettings: 'Ereigniseinstellungen',
enabled: 'Aktiviert',
sendFromProvider: 'Benachrichtigungen von diesem Anbieter senden',
// Event categories
printEvents: 'Druckereignisse',
printerStatus: 'Druckerstatus',
amsAlarms: 'AMS-Alarme',
amsHtAlarms: 'AMS-HT-Alarme',
printQueue: 'Druckwarteschlange',
// Event tags (badges)
start: 'Start',
plateCheck: 'Plattenkontrolle',
complete: 'Abgeschlossen',
failed: 'Fehlgeschlagen',
stopped: 'Gestoppt',
progress: 'Fortschritt',
offline: 'Offline',
lowFilament: 'Filament niedrig',
maintenance: 'Wartung',
amsHumidity: 'AMS-Feuchtigkeit',
amsTemp: 'AMS-Temperatur',
amsHtHumidity: 'AMS-HT-Feuchtigkeit',
amsHtTemp: 'AMS-HT-Temperatur',
bedCooled: 'Bett abgekühlt',
firstLayer: 'Erste Schicht',
quiet: 'Ruhe',
digest: 'Zusammenfassung {{time}}',
// Event labels (expanded settings)
printStarted: 'Druck gestartet',
plateNotEmpty: 'Platte nicht leer',
plateNotEmptyDescription: 'Objekte vor dem Druck erkannt',
printCompleted: 'Druck abgeschlossen',
bedCooledLabel: 'Bett abgekühlt',
bedCooledDescription: 'Bett nach dem Druck unter Schwellenwert abgekühlt',
firstLayerCompleteLabel: 'Erste Schicht fertig',
firstLayerCompleteDescription: 'Benachrichtigung mit Foto nach erster Schicht',
missingSpoolAssignmentLabel: 'Fehlende Spulenzuordnung',
missingSpoolAssignmentDescription: 'Benachrichtigen, wenn ein Druck startet und benoetigte Schaechte keine zugeordnete Spule haben',
printFailed: 'Druck fehlgeschlagen',
printStopped: 'Druck gestoppt',
progressMilestones: 'Fortschrittsmeilensteine',
progressMilestonesDescription: 'Benachrichtigung bei 25%, 50%, 75%',
printerOffline: 'Drucker offline',
printerError: 'Druckerfehler',
lowFilamentLabel: 'Filament niedrig',
maintenanceDue: 'Wartung fällig',
maintenanceDueDescription: 'Benachrichtigen, wenn Wartung erforderlich ist',
amsHumidityHigh: 'AMS-Feuchtigkeit hoch',
amsHumidityHighDescription: 'Normale AMS-Feuchtigkeit überschreitet Schwellenwert',
amsTemperatureHigh: 'AMS-Temperatur hoch',
amsTemperatureHighDescription: 'Normale AMS-Temperatur überschreitet Schwellenwert',
amsHtHumidityHigh: 'AMS-HT-Feuchtigkeit hoch',
amsHtHumidityHighDescription: 'AMS-HT-Feuchtigkeit überschreitet Schwellenwert',
amsHtTemperatureHigh: 'AMS-HT-Temperatur hoch',
amsHtTemperatureHighDescription: 'AMS-HT-Temperatur überschreitet Schwellenwert',
// Inventory stock alert events
inventoryAlerts: 'Bestandswarnungen',
stockReorderAlert: 'Nachbestellungswarnung',
stockReorderAlertDescription: 'SKU hat seinen Nachbestellungspunkt erreicht',
stockBreakAlert: 'Bestandsunterbrechungswarnung',
stockBreakAlertDescription: 'Der Bestand wird vor dem Eintreffen der Nachbestellung aufgebraucht sein',
// Queue events
jobAdded: 'Auftrag hinzugefügt',
jobAddedDescription: 'Auftrag zur Warteschlange hinzugefügt',
jobAssigned: 'Auftrag zugewiesen',
jobAssignedDescription: 'Modellbasierter Auftrag einem Drucker zugewiesen',
jobStarted: 'Auftrag gestartet',
jobStartedDescription: 'Warteschlangenauftrag hat Druck begonnen',
jobWaiting: 'Auftrag wartet',
jobWaitingDescription: 'Auftrag wartet auf Filament oder Drucker',
jobSkipped: 'Auftrag übersprungen',
jobSkippedDescription: 'Auftrag übersprungen (vorheriger fehlgeschlagen)',
jobFailed: 'Auftrag fehlgeschlagen',
jobFailedDescription: 'Auftrag konnte nicht gestartet werden',
queueComplete: 'Warteschlange abgeschlossen',
queueCompleteDescription: 'Alle Warteschlangenaufträge beendet',
// Quiet hours
quietHours: 'Ruhezeiten',
noNotificationsDuring: 'Keine Benachrichtigungen während dieser Zeiten',
editProviderToChangeQuietHours: 'Anbieter bearbeiten, um Ruhezeiten zu ändern',
// Daily digest
dailyDigest: 'Tägliche Zusammenfassung',
batchNotifications: 'Benachrichtigungen zu einer täglichen Zusammenfassung bündeln',
sendAt: 'Senden um {{time}}',
editProviderToChangeDigestTime: 'Anbieter bearbeiten, um Zusammenfassungszeit zu ändern',
// Actions
edit: 'Bearbeiten',
deleteProvider: 'Benachrichtigungsanbieter löschen',
deleteConfirm: 'Sind Sie sicher, dass Sie "{{name}}" löschen möchten? Dies kann nicht rückgängig gemacht werden.',
delete: 'Löschen',
// AddNotificationModal
addTitle: 'Benachrichtigungsanbieter hinzufügen',
editTitle: 'Benachrichtigungsanbieter bearbeiten',
nameLabel: 'Name *',
namePlaceholder: 'Meine Benachrichtigungen',
providerTypeLabel: 'Anbietertyp *',
configuration: 'Konfiguration',
testConfiguration: 'Konfiguration testen',
printerFilter: 'Druckerfilter',
onlyFromPrinter: 'Nur Benachrichtigungen für Ereignisse von diesem Drucker senden',
quietHoursDnd: 'Ruhezeiten (Nicht stören)',
quietStart: 'Start',
quietEnd: 'Ende',
dailyDigestLabel: 'Tägliche Zusammenfassung',
sendDigestAt: 'Zusammenfassung senden um',
digestCollected: 'Ereignisse werden gesammelt und als einzelne Zusammenfassung zu dieser Zeit gesendet',
notificationEvents: 'Benachrichtigungsereignisse',
progressPercent: '(25 %, 50 %, 75 %)',
bedCooledAfterPrint: '(nach Druckabschluss)',
// Per-event ntfy priority (#990)
eventPriority: {
sectionTitle: 'ntfy-Priorität',
helpNtfy: 'Wähle eine Priorität pro aktiviertem Ereignis. ntfy nutzt diese, um Hinweise (Ton, Sichtbarkeit, Push-Verhalten) zu eskalieren. Hier nicht gesetzte Stufen verwenden den ntfy-Server-Standard.',
min: 'Min.',
low: 'Niedrig',
default: 'Standard',
high: 'Hoch',
urgent: 'Dringend',
},
cancel: 'Abbrechen',
save: 'Speichern',
add: 'Hinzufügen',
nameRequired: 'Name ist erforderlich',
fieldRequired: '{{field}} ist erforderlich',
// Config field labels
phoneNumber: 'Telefonnummer',
apiKey: 'API-Schlüssel',
serverUrl: 'Server-URL',
topic: 'Thema',
authToken: 'Auth-Token',
userKey: 'Benutzerschlüssel',
appToken: 'App-Token',
priority: 'Priorität',
botToken: 'Bot-Token',
chatId: 'Chat-ID',
smtpServer: 'SMTP-Server',
smtpPort: 'SMTP-Port',
security: 'Sicherheit',
authentication: 'Authentifizierung',
username: 'Benutzername',
password: 'Passwort',
fromEmail: 'Absender-E-Mail',
toEmail: 'Empfänger-E-Mail',
webhookUrl: 'Webhook-URL',
payloadFormat: 'Payload-Format',
authorization: 'Autorisierung',
titleFieldName: 'Titel-Feldname',
messageFieldName: 'Nachrichten-Feldname',
// NotificationTemplateEditor
editTemplate: 'Vorlage bearbeiten: {{name}}',
titleLabel: 'Titel',
bodyLabel: 'Inhalt',
titlePlaceholder: 'Benachrichtigungstitel...',
bodyPlaceholder: 'Benachrichtigungsinhalt...',
availableVariables: 'Verfügbare Variablen',
clickToInsert: 'Klicken, um an Cursorposition im Inhalt einzufügen',
livePreview: 'Live-Vorschau',
hide: 'Ausblenden',
show: 'Anzeigen',
loadingPreview: 'Vorschau wird geladen...',
enterTemplateContent: 'Vorlageninhalt eingeben, um Vorschau zu sehen',
titlePreview: 'Titel:',
bodyPreview: 'Inhalt:',
resetToDefault: 'Auf Standard zurücksetzen',
titleRequired: 'Titel ist erforderlich',
bodyRequired: 'Inhalt ist erforderlich',
// NotificationLogViewer
notificationLog: 'Benachrichtigungsprotokoll',
showFailedOnly: 'Nur fehlgeschlagene',
last24Hours: 'Letzte 24 Stunden',
last7Days: 'Letzte 7 Tage',
last30Days: 'Letzte 30 Tage',
last90Days: 'Letzte 90 Tage',
justNow: 'Gerade eben',
noFailedNotifications: 'Keine fehlgeschlagenen Benachrichtigungen',
noNotificationsLogged: 'Keine Benachrichtigungen protokolliert',
unknownProvider: 'Unbekannter Anbieter',
logTitle: 'Titel',
logMessage: 'Nachricht',
logError: 'Fehler',
logProvider: 'Anbieter: {{type}}',
logTime: 'Zeit: {{time}}',
refresh: 'Aktualisieren',
clearOld: 'Alte löschen',
statsSummary: 'Letzte {{days}} Tage:',
statsNotifications: 'Benachrichtigungen',
statsSent: '{{count}} gesendet',
statsFailed: '{{count}} fehlgeschlagen',
// Event type labels (for log viewer)
eventTypes: {
print_start: 'Druck gestartet',
print_complete: 'Druck abgeschlossen',
print_failed: 'Druck fehlgeschlagen',
print_stopped: 'Druck gestoppt',
print_progress: 'Fortschritt',
printer_offline: 'Drucker offline',
printer_error: 'Druckerfehler',
filament_low: 'Filament niedrig',
maintenance_due: 'Wartung fällig',
test: 'Test',
},
// User email notification preferences
userEmail: {
title: 'Benachrichtigungen',
emailNotifications: 'E-Mail-Benachrichtigungen',
emailNotificationsDesc: 'Erhalten Sie E-Mail-Benachrichtigungen für Ihre eigenen Druckaufträge. E-Mails werden über die in der erweiterten Authentifizierung konfigurierten SMTP-Einstellungen gesendet.',
sendingTo: 'Benachrichtigungen werden gesendet an',
noEmailWarning: 'Ihr Konto hat keine E-Mail-Adresse. Wenden Sie sich an einen Administrator, um eine hinzuzufügen.',
printJobNotifications: 'Druckauftrags-Benachrichtigungen',
printJobNotificationsDesc: 'Wählen Sie aus, welche Ereignisse E-Mail-Benachrichtigungen für von Ihnen gesendete Druckaufträge auslösen.',
printJobStarts: 'Druckauftrag startet',
printJobStartsDesc: 'Benachrichtigt werden, wenn Ihr Druckauftrag beginnt.',
printJobFinishes: 'Druckauftrag fertig',
printJobFinishesDesc: 'Benachrichtigt werden, wenn Ihr Druckauftrag erfolgreich abgeschlossen wurde.',
printErrors: 'Druckfehler',
printErrorsDesc: 'Benachrichtigt werden, wenn Ihr Druckauftrag fehlschlägt oder auf einen Fehler stößt.',
printJobStops: 'Druckauftrag gestoppt',
printJobStopsDesc: 'Benachrichtigt werden, wenn Ihr Druckauftrag abgebrochen oder gestoppt wird.',
saveSuccess: 'Benachrichtigungseinstellungen gespeichert.',
saveError: 'Benachrichtigungseinstellungen konnten nicht gespeichert werden.',
},
},
// Rich Text Editor
richTextEditor: {
bold: 'Fett',
italic: 'Kursiv',
underline: 'Unterstrichen',
bulletList: 'Aufzählungsliste',
numberedList: 'Nummerierte Liste',
alignLeft: 'Linksbündig',
alignCenter: 'Zentriert',
alignRight: 'Rechtsbündig',
addLink: 'Link hinzufügen',
removeLink: 'Link entfernen',
},
// External Links
externalLinks: {
noLinksConfigured: 'Keine externen Links konfiguriert',
deleteLink: 'Link löschen',
removeCustomIcon: 'Benutzerdefiniertes Symbol entfernen',
openInNewTab: 'In neuem Tab öffnen',
placeholders: {
linkName: 'Mein Link',
},
},
// Keyboard Shortcuts Modal
keyboardShortcuts: {
title: 'Tastaturkürzel',
navigation: 'Navigation',
archivesSection: 'Archive',
kProfilesSection: 'K-Profile',
generalSection: 'Allgemein',
shortcuts: {
goToPrinters: 'Zu Drucker gehen',
goToArchives: 'Zu Archiv gehen',
goToQueue: 'Zur Warteschlange gehen',
goToStats: 'Zu Statistiken gehen',
goToProfiles: 'Zu Cloud-Profilen gehen',
goToSettings: 'Zu Einstellungen gehen',
focusSearch: 'Suche fokussieren',
openUploadModal: 'Upload-Modal öffnen',
clearSelection: 'Auswahl löschen / Eingabe aufheben',
contextMenu: 'Kontextmenü auf Karten',
refreshProfiles: 'Profile aktualisieren',
newProfile: 'Neues Profil',
exitSelectionMode: 'Auswahlmodus beenden',
showHelp: 'Diese Hilfe anzeigen',
},
footer: 'Drücken Sie Esc oder klicken Sie außerhalb, um zu schließen',
},
// Notification Log
notificationLog: {
title: 'Benachrichtigungsprotokoll',
events: {
printStarted: 'Druck gestartet',
printComplete: 'Druck abgeschlossen',
printFailed: 'Druck fehlgeschlagen',
printStopped: 'Druck gestoppt',
progress: 'Fortschritt',
printerOffline: 'Drucker offline',
printerError: 'Druckerfehler',
lowFilament: 'Wenig Filament',
maintenanceDue: 'Wartung fällig',
test: 'Test',
},
timeAgo: {
justNow: 'Gerade eben',
minutesAgo: 'vor {{minutes}}m',
hoursAgo: 'vor {{hours}}h',
},
},
// Restore/Backup Modal
restoreBackup: {
title: 'Backup wiederherstellen',
restoring: 'Wird wiederhergestellt...',
restoreComplete: 'Wiederherstellung abgeschlossen',
restoreFailed: 'Wiederherstellung fehlgeschlagen',
importSettings: 'Einstellungen aus Backup-Datei importieren',
pleaseWait: 'Bitte warten Sie, während Ihre Daten wiederhergestellt werden',
clickToSelect: 'Klicken Sie, um Backup-Datei auszuwählen (.json oder .zip)',
howDuplicateHandling: 'So funktioniert die Duplikatbehandlung:',
categories: {
printers: 'Drucker',
smartPlugs: 'Smart Plugs',
notificationProviders: 'Benachrichtigungsanbieter',
filaments: 'Filamente',
archives: 'Archive',
pendingUploads: 'Ausstehende Uploads',
settingsTemplates: 'Einstellungen & Vorlagen',
},
matchingInfo: {
printers: 'abgeglichen nach Seriennummer',
smartPlugs: 'abgeglichen nach IP-Adresse',
notificationProviders: 'abgeglichen nach Name',
filaments: 'abgeglichen nach Name + Typ + Marke',
archives: 'abgeglichen nach Inhalts-Hash',
pendingUploads: 'abgeglichen nach Dateiname',
settingsTemplates: 'immer überschrieben',
},
replaceExisting: 'Vorhandene Daten ersetzen',
keepExisting: 'Vorhandene Daten behalten',
replaceDescription: 'Bereits vorhandene Elemente mit Backup-Daten überschreiben',
keepDescription: 'Nur Elemente wiederherstellen, die noch nicht existieren',
caution: 'Vorsicht:',
cautionText: 'Das Überschreiben ersetzt Ihre aktuellen Konfigurationen durch Backup-Daten. Drucker-Zugangscodes werden aus Sicherheitsgründen niemals überschrieben.',
itemsRestored: 'Wiederhergestellte Elemente',
itemsSkipped: 'Übersprungene Elemente',
restored: 'Wiederhergestellt',
skipped: 'Übersprungen (existieren bereits)',
filesLabel: 'Dateien (3MF, Thumbnails, etc.)',
newApiKeysGenerated: 'Neue API-Schlüssel generiert',
newApiKeysWarning: 'Diese Schlüssel werden nur einmal angezeigt. Kopieren Sie sie jetzt!',
processingBackup: 'Backup-Datei wird verarbeitet...',
noDataFound: 'In der Backup-Datei wurden keine wiederherzustellenden Daten gefunden.',
failedToRestore: 'Backup konnte nicht wiederhergestellt werden. Bitte überprüfen Sie das Dateiformat.',
},
// Backup Export Modal
backupExport: {
title: 'Backup exportieren',
selectData: 'Zu exportierende Daten auswählen',
selectAll: 'Alle auswählen',
selectNone: 'Keine auswählen',
categoryDescriptions: {
settings: 'Sprache, Theme, Update-Einstellungen',
notifications: 'ntfy, Pushover, Discord, usw.',
templates: 'Benutzerdefinierte Nachrichtenvorlagen',
smartPlugs: 'Tasmota-Plug-Konfigurationen',
externalLinks: 'Seitenleiste Links zu externen Diensten',
printers: 'Druckerinformationen (Zugangscodes ausgeschlossen)',
plateDetection: 'Leere Platten-Referenzbilder',
filaments: 'Filamenttypen und -kosten',
maintenance: 'Benutzerdefinierte Wartungspläne',
archives: 'Alle Druckdaten + Dateien (3MF, Thumbnails, Fotos)',
projects: 'Projekte, BOM-Elemente und Anhänge',
pendingUploads: 'Virtueller Drucker-Uploads zur Überprüfung',
apiKeys: 'Webhook-API-Schlüssel (neue Schlüssel bei Import generiert)',
},
requiresPrinters: 'Drucker müssen ausgewählt sein',
zipFileWarning: 'ZIP-Datei wird erstellt.',
zipFileDescription: 'Enthält alle 3MF-Dateien, Thumbnails, Zeitraffer und Fotos. Dies kann eine Weile dauern und zu einer großen Datei führen.',
includeAccessCodes: 'Zugangscodes einschließen',
includeAccessCodesDescription: 'Für die Übertragung auf eine andere Maschine',
includeAccessCodesWarning: 'Zugangscodes werden im Klartext eingeschlossen. Bewahren Sie diese Backup-Datei sicher auf!',
categoriesSelected: '{{selectedCount}} Kategorien ausgewählt',
},
// Pending Uploads Panel
pendingUploads: {
placeholders: {
notes: 'Notizen zu diesem Druck hinzufügen...',
},
discardUpload: 'Upload verwerfen',
archiveAllUploads: 'Alle Uploads archivieren',
discardAllUploads: 'Alle Uploads verwerfen',
archive: 'Archivieren',
timeAgo: {
justNow: 'Gerade eben',
minutesAgo: 'vor {{minutes}}m',
hoursAgo: 'vor {{hours}}h',
daysAgo: 'vor {{days}}d',
},
},
// API Browser
apiBrowser: {
placeholders: {
requestBody: 'JSON-Anforderungstext...',
searchEndpoints: 'Endpunkte suchen...',
},
},
// Configure AMS Slot Modal
configureAmsSlot: {
title: 'AMS-Slot konfigurieren',
slotConfigured: 'Slot konfiguriert!',
configuringSlot: 'Slot wird konfiguriert:',
slotLabel: '{{ams}} – Slot {{slot}}',
searchPresets: 'Voreinstellungen suchen...',
colorPlaceholder: 'Farbname oder Hex (z.B. braun, FF8800)',
clearCustomColor: 'Benutzerdefinierte Farbe löschen',
noCloudPresets: 'Keine Cloud-Voreinstellungen. Melden Sie sich bei Bambu Cloud an, um zu synchronisieren.',
noPresetsAvailable: 'Keine Voreinstellungen verfügbar. Melden Sie sich bei Bambu Cloud an oder importieren Sie lokale Profile.',
noMatchingPresets: 'Keine passenden Voreinstellungen gefunden.',
custom: 'Benutzerdefiniert',
builtin: 'Integriert',
settingsSentToPrinter: 'Einstellungen an Drucker gesendet',
filamentProfile: 'Filamentprofil',
kProfileLabel: 'K-Profil (Pressure Advance)',
filteringFor: 'Filtern nach: {{material}}',
noKProfile: 'Kein K-Profil (Standard 0.020 verwenden)',
noMatchingKProfiles: 'Keine passenden K-Profile gefunden. Standard K=0.020 wird verwendet.',
selectFilamentFirst: 'Zuerst ein Filamentprofil auswählen',
kFromCalibration: 'K={{value}} aus Druckerkalibrierung',
customColorLabel: 'Benutzerdefinierte Farbe (optional)',
presetColors: '{{name}} Farben:',
showLessColors: 'Weniger Farben anzeigen',
showMoreColors: 'Mehr Farben anzeigen',
clear: 'Löschen',
hexLabel: 'Hex – #{{hex}}',
resetting: 'Wird zurückgesetzt...',
resetSlot: 'Slot zurücksetzen',
cancel: 'Abbrechen',
configuring: 'Wird konfiguriert...',
configureSlot: 'Slot konfigurieren',
},
// Git Backup Settings
githubBackup: {
title: 'Git-Backup',
history: 'Verlauf',
downloadBackup: 'Backup herunterladen',
restoreBackup: 'Backup wiederherstellen',
noBackupsYet: 'Noch keine Backups',
},
// Email Settings
emailSettings: {
placeholders: {
fromName: 'Bambuddy',
},
},
// Tag Management Modal
tagManagement: {
searchTags: 'Tags suchen...',
renameTag: 'Tag umbenennen',
deleteTag: 'Tag löschen',
},
// Notification Template Editor
notificationTemplates: {
placeholders: {
title: 'Benachrichtigungstitel...',
body: 'Benachrichtigungstext...',
},
},
// Batch Tag Modal
batchTag: {
placeholders: {
newTag: 'Neuen Tag eingeben...',
},
},
// Photo Gallery Modal
photoGallery: {
deletePhoto: 'Foto löschen',
},
// Filament Hover Card
filamentHoverCard: {
copySpoolUuid: 'Spulen-UUID kopieren',
},
// K Profiles View
kProfilesView: {
hasNote: 'Hat Notiz',
copyProfile: 'Profil kopieren',
},
// Layout/Navigation
layout: {
openMenu: 'Menü öffnen',
noPermissionSystemInfo: 'Sie haben keine Berechtigung zum Anzeigen von Systeminformationen',
},
// Dashboard
dashboard: {
dragToReorder: 'Ziehen zum Neuordnen',
hideWidget: 'Widget ausblenden',
},
// Notification Provider Card
notificationProviderCard: {
deleteNotificationProvider: 'Benachrichtigungsanbieter löschen',
},
// File Manager Modal
fileManagerModal: {
closeFileManager: 'Dateimanager schließen',
sortFiles: 'Dateien sortieren',
goToParentFolder: 'Zum übergeordneten Ordner gehen',
threeView: '3D-Ansicht',
},
// Embedded Camera Viewer
embeddedCameraViewer: {
refreshStream: 'Stream aktualisieren',
close: 'Schließen',
zoomOut: 'Verkleinern',
resetZoom: 'Zoom zurücksetzen',
zoomIn: 'Vergrößern',
dragToResize: 'Ziehen zum Größe ändern',
},
// Timelapse Viewer
timelapseViewer: {
skipBack5s: '5s zurückspringen',
skipForward5s: '5s vorspringen',
},
// Notification Providers
notificationProviders: {
descriptions: {
email: 'SMTP-E-Mail-Benachrichtigungen',
telegram: 'Benachrichtigungen über Telegram-Bot',
discord: 'An Discord-Kanal über Webhook senden',
ntfy: 'Kostenlose, selbst hostbare Push-Benachrichtigungen',
pushover: 'Einfache, zuverlässige Push-Benachrichtigungen',
callmebot: 'Kostenlose WhatsApp-Benachrichtigungen über CallMeBot',
webhook: 'Generischer HTTP POST zu beliebiger URL',
},
},
// Log Viewer
logViewer: {
searchPlaceholder: 'Nachricht oder Logger-Name suchen...',
noLogEntries: 'Keine Logeinträge gefunden',
},
// Switchbar Popover
switchbarPopover: {
noSwitchesInSwitchbar: 'Keine Schalter in Schalterleiste',
},
// Project Page Modal
projectPageModal: {
placeholders: {
title: 'Titel',
designer: 'Designer',
license: 'Lizenz',
description: 'Beschreibung eingeben...',
profileTitle: 'Profil-Titel',
profileDescription: 'Profilbeschreibung...',
},
},
// Spoolman Settings
spoolmanSettings: {},
// Time
time: {
unknown: '-',
waiting: 'Wartend',
justNow: 'Gerade eben',
now: 'Jetzt',
minsAgo: 'vor {{count}}m',
inMins: 'in {{count}}min',
hoursAgo: 'vor {{count}}h',
inHours: 'in {{count}}Std',
daysAgo: 'vor {{count}}d',
inDays: 'in {{count}}T',
},
// SpoolBuddy Kiosk
spoolbuddy: {
nav: {
dashboard: 'Übersicht',
ams: 'AMS',
inventory: 'Inventar',
writeTag: 'Schreiben',
settings: 'Einstellungen',
},
status: {
nfcReady: 'NFC bereit',
nfcOff: 'NFC aus',
offline: 'Offline',
online: 'Online',
noPrinters: 'Keine Drucker',
deviceOffline: 'Gerät offline',
waitingConnection: 'Warte auf Geräteverbindung...',
systemReady: 'System bereit',
status: 'Status',
},
dashboard: {
readyToScan: 'Bereit zum Scannen',
idleMessage: 'Spule auf die Waage legen zum Identifizieren',
nfcHint: 'NFC-Tag wird automatisch gelesen',
device: 'Gerät',
syncWeight: 'Gewicht sync.',
weightSynced: 'Synchronisiert!',
unknownTag: 'Unbekannter Tag',
newTag: 'Neuer Tag erkannt',
onScale: 'auf der Waage',
linkSpool: 'Mit Spule verknüpfen',
linkTagTitle: 'Tag mit Spule verknüpfen',
linkTag: 'Tag verknüpfen',
selectSpool: 'Spule zum Verknüpfen auswählen:',
noUntagged: 'Keine Spulen ohne Tags gefunden',
tagDetected: 'Tag erkannt',
noTag: 'Kein Tag',
tagId: 'Tag',
grossWeight: 'Bruttogewicht',
spoolSize: 'Spulengröße',
close: 'Schließen',
currentSpool: 'Aktuelle Spule',
plateReady: 'Druckplatte bereit: {{name}}',
plateReadyLabel: 'Bereit-zum-Quittieren-Liste',
plateClearAction: 'Frei',
plateClearedToast: 'Druckplatte als geleert markiert',
plateClearFailed: 'Druckplatte konnte nicht als geleert markiert werden',
},
modal: {
spoolDetected: 'Spule erkannt',
assignToAms: 'AMS zuweisen',
syncWeight: 'Gewicht sync.',
weightSynced: 'Synchronisiert!',
syncing: 'Synchronisiere...',
newTagDetected: 'Neuer Tag erkannt',
addToInventory: 'Zum Inventar hinzufügen',
assignToAmsTitle: 'AMS zuweisen',
selectSlot: 'Slot auswählen',
assign: 'Zuweisen',
assigning: 'Zuweisen...',
assignSuccess: 'Zugewiesen!',
assignPendingInsert: 'Zugewiesen. Slot wird beim Einsetzen der Spule konfiguriert.',
assignError: 'Fehler beim Zuweisen. Bitte erneut versuchen.',
noPrinterSelected: 'Drucker auswählen...',
noAmsDetected: 'Kein AMS an diesem Drucker erkannt',
slot: 'Slot',
},
weight: {
noReading: 'Kein Messwert',
stable: 'Stabil',
measuring: 'Messen...',
tare: 'Tarieren',
calibrate: 'Kalibrieren',
},
spool: {
remaining: 'Verbleibend',
material: 'Material',
brand: 'Marke',
color: 'Farbe',
coreWeight: 'Kern',
labelWeight: 'Etikett',
scaleWeight: 'Waage',
netWeight: 'Netto',
lastUsed: 'Zuletzt verwendet',
},
ams: {
noData: 'Kein AMS erkannt',
connectAms: 'AMS anschließen um Filament-Slots zu sehen',
noPrinter: 'Kein Drucker ausgewählt',
selectPrinter: 'Drucker in der oberen Leiste auswählen',
printerDisconnected: 'Drucker getrennt',
humidity: 'Feuchtigkeit',
level: 'Stufe',
active: 'Aktiv',
slot: 'Slot',
empty: 'Leer',
},
inventory: {
search: 'Spulen suchen...',
empty: 'Keine Spulen im Inventar',
noResults: 'Keine passenden Spulen',
spools: 'Spulen',
addSpool: 'Spule hinzufügen',
},
settings: {
// Tabs
tabDevice: 'Gerät',
tabDisplay: 'Anzeige',
tabScale: 'Waage',
tabUpdates: 'Aktualisierungen',
// Device tab
nfcReader: 'NFC-Leser',
type: 'Typ',
connection: 'Verbindung',
notConnected: 'N/V',
deviceInfo: 'Geräteinfo',
hostname: 'Host',
uptime: 'Betriebszeit',
systemConfig: 'Backend & Auth',
backendUrl: 'Bambuddy Backend URL',
apiToken: 'API-Token',
apiTokenPlaceholder: 'API-Token eingeben',
saveConfig: 'Konfiguration speichern',
systemQueued: 'Konfiguration in Warteschlange.',
nfcDiagnostic: 'NFC-Diagnose',
scaleDiagnostic: 'Waagen-Diagnose',
readTagDiagnostic: 'Tag-Lese-Diagnose',
testNfc: 'Leser testen',
testScale: 'Genauigkeit testen',
testReadTag: 'Tag lesen',
systemFieldsRequired: 'Backend-URL ist erforderlich.',
// Display tab
brightness: 'Helligkeit',
saved: 'Gespeichert',
noBacklight: 'Keine DSI-Hintergrundbeleuchtung erkannt. Helligkeitssteuerung erfordert ein DSI-Display.',
screenBlank: 'Bildschirm-Abschaltzeit',
screenBlankDesc: 'Bildschirm schaltet sich nach Inaktivität ab. Zum Aufwecken berühren.',
displayNote: 'Helligkeit wird als Software-Filter angewendet.',
// Scale tab
scaleCalibration: 'Waagen-Kalibrierung',
currentWeight: 'Aktuelles Gewicht',
tareOffset: 'Tara',
calFactor: 'Faktor',
knownWeight: 'Bekanntes Gewicht',
calStep1: 'Alle Gegenstände von der Waage entfernen und Nullpunkt setzen.',
calStep2: 'Bekanntes Gewicht auf die Waage legen.',
setZero: 'Nullpunkt setzen',
calibrateNow: 'Kalibrieren',
calibrated: 'Kalibriert',
tareSet: 'Tara-Befehl gesendet. Warte auf Gerät...',
tareFailed: 'Tara-Befehl fehlgeschlagen',
zeroSet: 'Nullpunkt gesetzt. Bekanntes Gewicht auf die Waage legen.',
calibrationDone: 'Kalibrierung abgeschlossen!',
calibrationFailed: 'Kalibrierung fehlgeschlagen',
lastCalibrated: 'Zuletzt kalibriert',
stable: 'Stabil',
settling: 'Stabilisierung...',
firmware: 'Firmware',
scale: 'Waage',
noDevice: 'Kein SpoolBuddy-Gerät gefunden',
// Updates tab
daemonVersion: 'Daemon-Version',
currentVersion: 'Aktuell',
versionPending: 'Warte auf Daemon...',
checking: 'Prüfe...',
checkUpdates: 'Nach Updates suchen',
updateAvailable: 'Update verfügbar',
updateInstructions: 'Update per SSH: SpoolBuddy-Installationsskript ausführen.',
upToDate: 'Aktuell',
includeBeta: 'Beta-Versionen einschließen',
},
writeTag: {
tabExisting: 'Vorhandene Spule',
tabNew: 'Neue Spule',
tabReplace: 'Tag ersetzen',
searchPlaceholder: 'Suche nach Material, Farbe, Marke...',
noUntaggedSpools: 'Keine Spulen ohne Tags',
noTaggedSpools: 'Keine Spulen mit Tags',
selectSpool: 'Spule auswählen, dann einen NTAG auf den Leser legen',
placeTag: 'NTAG auf den Leser legen',
tagReady: 'Tag erkannt — bereit zum Schreiben',
writeTag: 'Tag beschreiben',
replaceTag: 'Tag ersetzen',
writing: 'Tag wird beschrieben...',
waiting: 'Warte auf SpoolBuddy...',
writeSuccess: 'Tag erfolgreich beschrieben!',
writeFailed: 'Schreiben fehlgeschlagen',
queueFailed: 'Schreibbefehl konnte nicht eingereiht werden',
tryAgain: 'Erneut versuchen',
cancel: 'Abbrechen',
replaceWarning: 'Alter Tag wird getrennt. Neuer Tag ersetzt ihn.',
deviceOffline: 'SpoolBuddy ist offline',
material: 'Material',
colorName: 'Farbname',
color: 'Farbe',
brand: 'Marke',
weight: 'Gewicht (g)',
createSpool: 'Spule erstellen',
creating: 'Wird erstellt...',
spoolCreated: 'Spule erstellt! Bereit zum Schreiben.',
createFailed: 'Spule konnte nicht erstellt werden',
incompleteDataWarning: 'Tag mit unvollständigen Spoolman-Daten geschrieben',
},
quickMenu: {
printerPower: 'Drucker-Strom',
systemControls: 'System',
restartDaemon: 'Daemon neustarten',
restartBrowser: 'Browser neustarten',
reboot: 'Neustart',
shutdown: 'Herunterfahren',
swipeToClose: 'Nach unten wischen zum Schließen',
confirmTitle: 'Bestätigen',
confirmShutdown: 'Möchten Sie das SpoolBuddy wirklich herunterfahren? Sie benötigen physischen Zugang, um es wieder einzuschalten.',
confirmReboot: 'Möchten Sie das SpoolBuddy wirklich neu starten?',
confirmRestartDaemon: 'SpoolBuddy-Daemon neustarten? NFC und Waage sind vorübergehend nicht verfügbar.',
confirmRestartBrowser: 'Kiosk-Browser neustarten? Das Display wird kurz schwarz.',
confirm: 'Bestätigen',
confirmPlugOn: '{{name}} einschalten?',
confirmPlugOff: '{{name}} ausschalten?',
turnOn: 'Einschalten',
turnOff: 'Ausschalten',
},
},
bugReport: {
title: 'Fehler melden',
description: 'Beschreibung',
descriptionPlaceholder: 'Was ist schiefgelaufen? Bitte beschreiben Sie das Problem...',
email: 'E-Mail (optional)',
emailPlaceholder: 'ihre@email.de',
emailPrivacy: 'Falls angegeben, wird Ihre E-Mail in einem eingeklappten Abschnitt des GitHub-Issues aufgeführt, damit der Betreuer sich melden kann.',
screenshot: 'Screenshot',
uploadOrPaste: 'Bild hochladen, einfügen oder ziehen',
dataCollectedSummary: 'Welche Daten werden im Bericht gesendet?',
dataIncluded: 'Enthalten:',
dataIncludedList: 'App-Version, Betriebssystem, Architektur, Python-Version, Datenbankstatistiken (nur Anzahl), Druckermodelle, Düsenanzahl, Firmware-Versionen, Verbindungsstatus, Integrationsstatus (Spoolman, MQTT, HA), nicht-sensible Einstellungen, Netzwerkschnittstellenanzahl, Docker-Details, Abhängigkeitsversionen.',
dataNeverIncluded: 'Nie enthalten:',
dataNeverIncludedList: 'Druckernamen, Seriennummern, Zugangscodes, Passwörter, IP-Adressen, E-Mail-Adressen, API-Schlüssel, Tokens, Webhook-URLs, Hostnamen oder Benutzernamen.',
submit: 'Absenden',
startLogging: 'Debug-Protokollierung starten',
stepEnableLogging: 'Debug-Protokollierung aktiviert',
stepReproduce: 'Problem jetzt reproduzieren',
stepStopLogging: 'Stoppen & Bericht senden',
stopAndSubmit: 'Stoppen & Senden',
maxDuration: 'Stoppt automatisch nach {{minutes}} Min.',
stoppingLogs: 'Protokolle sammeln & senden...',
submitting: 'Fehlerbericht wird gesendet...',
submitSuccess: 'Fehlerbericht erfolgreich gesendet!',
submitFailed: 'Fehlerbericht konnte nicht gesendet werden',
thankYou: 'Vielen Dank!',
submitted: 'Ihr Fehlerbericht wurde eingereicht.',
viewIssue: 'Issue ansehen',
unexpectedError: 'Ein unerwarteter Fehler ist aufgetreten',
},
failureDetection: {
title: 'KI-Fehlererkennung',
description: 'Überwacht Drucke über eine selbst gehostete Obico-ML-API und reagiert automatisch auf erkannte Fehldrucke.',
mlUrl: 'Obico-ML-API-URL',
mlUrlHint: 'Basis-URL deines selbst gehosteten Obico-ml_api-Containers (z. B. http://192.168.1.10:3333).',
test: 'Testen',
testSuccess: 'ML-API erreichbar und funktionsfähig.',
testFailed: 'ML-API konnte nicht erreicht werden.',
sensitivity: 'Empfindlichkeit',
sensitivityLow: 'Niedrig (weniger Fehlalarme)',
sensitivityMedium: 'Mittel (ausgewogen)',
sensitivityHigh: 'Hoch (frühe Erkennung, mehr Fehlalarme)',
sensitivityHint: 'Passt die Konfidenz-Schwellwerte an, die Warnungen und Fehler auslösen.',
action: 'Aktion bei erkanntem Fehler',
actionNotify: 'Nur benachrichtigen',
actionPause: 'Druck pausieren',
actionPauseOff: 'Pausieren und Strom abschalten',
pollInterval: 'Prüfintervall (Sekunden)',
pollIntervalHint: 'Wie oft jeder Drucker während eines laufenden Drucks geprüft wird. Minimum 5 s, Maximum 120 s.',
externalUrlMissing: 'Externe URL ist nicht gesetzt.',
externalUrlHint: 'Die ML-API ruft das Kamera-Snapshot per URL ab. Setze die externe URL in den allgemeinen Einstellungen, damit der ML-API-Container Bambuddy erreichen kann.',
perPrinterTitle: 'Überwachte Drucker',
perPrinterHint: 'Wähle, welche Drucker vom Erkennungsdienst überwacht werden.',
monitorAll: 'Alle verbundenen Drucker überwachen',
statusTitle: 'Status',
serviceRunning: 'Dienst läuft',
thresholds: 'Niedrig / Hoch-Schwellwerte',
activePrinters: 'Aktive Drucke',
noActivePrints: 'Derzeit laufen keine Drucke.',
historyTitle: 'Letzte Erkennungen',
noHistory: 'Noch keine Erkennungen.',
},
makerworld: {
title: 'MakerWorld',
description: 'Füge eine MakerWorld-Modell-URL ein, um es direkt aus Bambuddy zu importieren und zu drucken — ohne die Bambu Handy App zu öffnen.',
pasteUrlHeader: 'Von MakerWorld importieren',
pasteUrlPlaceholder: 'https://makerworld.com/de/models/… oder beliebigen MakerWorld-Link einfügen',
resolveButton: 'Laden',
signInRequiredTitle: 'Bambu-Cloud-Anmeldung für Download erforderlich',
signInRequiredBody: 'Modell-Details können anonym angezeigt werden, aber MakerWorld verlangt eine Bambu-Cloud-Anmeldung zum Herunterladen der 3MF-Dateien.',
openCloudSettings: 'Cloud-Einstellungen öffnen',
untitledModel: 'Unbenanntes Modell',
byCreator: 'von {{name}}',
downloadsCount: '{{count}} Downloads',
licensePrefix: 'Lizenz',
alreadyImported: 'Bereits in Bibliothek',
openOnMakerworld: 'Auf MakerWorld öffnen',
alreadyInLibrary: 'Dieses Modell ist bereits in deiner Bibliothek — zu finden im Dateimanager → MakerWorld',
importSuccess: '{{filename}} importiert — gespeichert im Dateimanager → MakerWorld',
platesHeader: 'Platten ({{count}})',
plateDefaultName: 'Platte {{n}}',
materialCount: '{{count}} Filamente',
amsRequired: 'AMS erforderlich',
slicedFor: 'Gesliced für {{printer}}',
alsoCompatible: 'Auch kompatibel: {{printers}}',
importToLibrary: 'Speichern',
sliceIn: 'Speichern & in {{slicer}} öffnen',
disclaimer: 'Die MakerWorld-Integration verwendet von der Community dokumentierte API-Endpunkte. Bambuddy ist nicht mit MakerWorld oder Bambu Lab verbunden oder von diesen unterstützt.',
lastImportSuccess: 'In deine Bibliothek importiert',
lastImportAlreadyInLibrary: 'Bereits in deiner Bibliothek',
viewInLibrary: 'Im Dateimanager anzeigen',
openInBambuStudio: 'In Bambu Studio öffnen',
openInOrcaSlicer: 'In OrcaSlicer öffnen',
importTo: 'In Dateimanager importieren',
recentImportsHeader: 'Zuletzt importiert',
phaseResolving: 'Auflösen',
phaseDownloading: 'Lade herunter',
folderAuto: 'MakerWorld (Standard)',
importAll: 'Alle importieren',
importAllProgress: 'Importiere {{current}}/{{total}}',
openGallery: 'Bildergalerie öffnen',
galleryPrev: 'Vorheriges Bild',
galleryNext: 'Nächstes Bild',
deleteImport: 'Aus Bibliothek entfernen',
importDeleting: 'Wird entfernt…',
importDeleted: 'Aus Bibliothek entfernt',
confirmDelete: '{{filename}} aus der Bibliothek entfernen? Die lokale Datei wird gelöscht, die Platte kann aber erneut von MakerWorld importiert werden.',
errors: {
resolveFailed: 'Diese MakerWorld-URL konnte nicht aufgelöst werden.',
downloadFailed: 'Download fehlgeschlagen. Bitte erneut versuchen.',
deleteFailed: 'Datei konnte nicht aus der Bibliothek entfernt werden.',
},
},
gcodeViewer: {
back: 'Zurück',
backToArchives: 'Zurück zum Druckarchiv',
backToFiles: 'Zurück zum Dateimanager',
},
libraryTrash: {
title: 'Papierkorb',
headerButton: 'Papierkorb',
headerTooltip: 'In den Papierkorb verschobene Dateien anzeigen',
backToFiles: 'Zurück zum Dateimanager',
subtitleAdmin: 'Gelöschte Dateien bleiben {{days}} Tage hier und werden dann automatisch entfernt. Diese Ansicht zeigt Papierkorb-Dateien aller Benutzer.',
subtitleUser: 'Gelöschte Dateien bleiben {{days}} Tage hier und werden dann automatisch entfernt.',
loading: 'Papierkorb wird geladen…',
loadError: 'Papierkorb konnte nicht geladen werden.',
empty: 'Der Papierkorb ist leer.',
summary: '{{count}} Dateien · {{size}}',
emptyTrash: 'Papierkorb leeren',
restore: 'Wiederherstellen',
purgeNow: 'Jetzt löschen',
autoPurgeIn: 'Wird in {{when}} gelöscht',
days: 'Tage',
retentionLabel: 'Automatisch löschen nach',
selectAll: 'Alle auswählen',
selectOne: '{{filename}} auswählen',
selectionCount: '{{count}} ausgewählt',
bulkRestore: 'Auswahl wiederherstellen',
bulkPurge: 'Auswahl löschen',
col: {
filename: 'Datei',
folder: 'Ordner',
size: 'Größe',
deleted: 'Verschoben',
autoPurge: 'Löschung',
owner: 'Besitzer',
actions: 'Aktionen',
},
confirm: {
purgeTitle: 'Endgültig löschen?',
purgeBody: '{{filename}} wird von der Festplatte gelöscht und kann nicht wiederhergestellt werden.',
emptyTitle: 'Papierkorb leeren?',
emptyBody: 'Alle {{count}} Dateien werden endgültig von der Festplatte gelöscht.',
bulkPurgeTitle: 'Ausgewählte Dateien endgültig löschen?',
bulkPurgeBody: 'Die {{count}} ausgewählten Dateien werden von der Festplatte gelöscht und können nicht wiederhergestellt werden.',
cta: 'Endgültig löschen',
},
toast: {
restored: 'Datei wiederhergestellt.',
restoreFailed: 'Datei konnte nicht wiederhergestellt werden.',
purged: 'Datei endgültig gelöscht.',
purgeFailed: 'Datei konnte nicht gelöscht werden.',
emptied: '{{count}} Datei(en) aus dem Papierkorb gelöscht.',
emptyFailed: 'Papierkorb konnte nicht geleert werden.',
retentionSaved: 'Automatisches Löschen auf {{days}} Tage gesetzt.',
retentionFailed: 'Einstellung konnte nicht gespeichert werden.',
bulkRestored: '{{count}} Datei(en) wiederhergestellt.',
bulkPurged: '{{count}} Datei(en) gelöscht.',
},
},
libraryPurge: {
title: 'Alte Dateien entfernen',
headerButton: 'Alte entfernen',
headerTooltip: 'Alte Dateien im Block in den Papierkorb verschieben',
description: 'Räume alte Dateien in einem Rutsch aus deiner Bibliothek. Dateien mit Druckverlauf werden nach dem letzten Druckdatum bewertet; nie gedruckte Dateien nach dem Upload-Datum.',
ageLabel: 'Dateien älter als',
days: 'Tage',
includeNeverPrinted: 'Dateien einbeziehen, die nie gedruckt wurden',
effectsTitle: 'Was passiert, wenn du auf „Entfernen" klickst',
effect1: 'Passende Dateien werden in den Papierkorb verschoben — noch nicht von der Festplatte gelöscht.',
effect2: 'Du kannst sie bis zum Ablauf der Aufbewahrungsfrist jederzeit wiederherstellen.',
effect3: 'Nach Ablauf der Frist löscht der Papierkorb-Sweeper sie endgültig von der Festplatte.',
effect4: 'Dateien in externen (verknüpften) Ordnern werden übersprungen — Bambuddy löscht keine Bytes, die ihm nicht gehören.',
previewLoading: 'Prüfe, wie viele Dateien passen…',
previewFailed: 'Vorschau konnte nicht geladen werden.',
previewSummary: '{{count}} Dateien · {{size}} würden in den Papierkorb verschoben',
andMore: '…und {{count}} weitere',
warning: 'Dateien im Papierkorb zählen weiterhin zum Speicher, bis die Aufbewahrungsfrist abgelaufen ist. Leere den Papierkorb danach, um sofort Speicher freizugeben.',
confirmCta: '{{count}} in den Papierkorb verschieben',
purging: 'Wird verschoben…',
toast: {
success: '{{count}} Datei(en) in den Papierkorb verschoben.',
failed: 'Dateien konnten nicht verschoben werden.',
},
},
libraryAutoPurge: {
enableLabel: 'Alte Dateien automatisch entfernen',
enableDescription: 'Führt die Admin-Bereinigung einmal pro Tag aus. Dateien landen zuerst im Papierkorb — sie werden nicht sofort gelöscht.',
ageLabel: 'Dateien älter als',
ageDescription: 'Minimum 7 Tage, Maximum 10 Jahre. Verwendet dieselbe Altersregel wie die manuelle „Alte entfernen“-Schaltfläche.',
days: 'Tage',
includeNeverPrinted: 'Dateien einbeziehen, die nie gedruckt wurden',
saveFailed: 'Einstellungen konnten nicht gespeichert werden.',
},
archivePurge: {
headerButton: 'Alte löschen',
headerTooltip: 'Alte Archive in einem Rutsch löschen',
title: 'Alte Archive löschen',
description: 'Räume alte Druckhistorie auf. Jedes Archiv wird nach seinem letzten abgeschlossenen Druck bewertet — ein erneuter Druck setzt die Frist zurück, aktive Arbeit bleibt sicher.',
ageLabel: 'Archive löschen, die zuletzt gedruckt wurden vor',
days: 'Tage',
effectsTitle: 'Was passiert, wenn du auf „Löschen" klickst',
effect1: 'Jedes passende Archiv wird aus der Listenansicht ausgeblendet und seine Dateien werden von der Festplatte entfernt (3MF, Vorschau, Timelapse, Quell-3MF, F3D, Fotos).',
effect2: 'Die Archivzeile bleibt in der Datenbank, damit die Quick Stats den Filament-, Zeit-, Kosten- und Energiebeitrag behalten — wie der Standard beim Einzel-Löschen.',
effect3: 'Aktiviere unten „Auch aus Statistiken entfernen", um zusätzlich den Quick-Stats-Beitrag zu verwerfen (entspricht dem Einzel-Löschen-Häkchen). Dieser Pfad ist unwiderruflich.',
effect4: 'Ein erneuter Druck setzt die Frist zurück, Archive, die du weiterhin nutzt, bleiben sicher.',
purgeStatsLabel: 'Auch aus Statistiken entfernen',
purgeStatsHint: 'Verwirft die passenden Archive aus den Quick Stats (Filament, Zeit, Kosten, Energie). Ohne diese Option behalten die Quick Stats jeden Beitrag und nur die Dateien werden gelöscht.',
previewLoading: 'Prüfe passende Archive…',
previewFailed: 'Vorschau konnte nicht erstellt werden.',
previewSummary: '{{count}} Archive · {{size}} würden entfernt',
andMore: '…und {{count}} weitere',
warning: 'Dateien werden von der Festplatte entfernt und können nicht wiederhergestellt werden. Lade wichtige Archive vorher herunter oder markiere sie als Favorit.',
confirmCta: '{{count}} Archiv(e) entfernen',
purging: 'Entferne…',
toast: {
success: '{{count}} Archiv(e) entfernt.',
failed: 'Archive konnten nicht gelöscht werden.',
},
},
archiveAutoPurge: {
enableLabel: 'Alte Archive automatisch löschen',
enableDescription: 'Blendet einmal pro Tag Archive aus der Listenansicht aus und entfernt ihre Dateien von der Festplatte, wenn sie im angegebenen Zeitraum nicht gedruckt wurden. Ein erneuter Druck setzt die Frist zurück.',
ageLabel: 'Archive automatisch löschen, die zuletzt gedruckt wurden vor',
ageDescription: 'Minimum 7 Tage, Maximum 10 Jahre. Basiert auf dem letzten abgeschlossenen Druck — ein erneuter Druck setzt die Frist zurück. Entfernt 3MF, Vorschau, Timelapse, Quell-3MF, F3D und Fotos.',
days: 'Tage',
purgeStatsLabel: 'Auch aus Statistiken entfernen',
purgeStatsDescription: 'Wenn aktiviert, verwirft der tägliche Sweeper auch den Quick-Stats-Beitrag (Filament, Zeit, Kosten, Energie) jedes gelöschten Archivs. Standard aus — Quick Stats behalten den Beitrag, nur die Dateien werden gelöscht.',
runNow: 'Archive jetzt löschen',
saveFailed: 'Einstellungen konnten nicht gespeichert werden.',
},
cameraTokens: {
title: 'Kamera-API-Tokens',
navTitle: 'Kamera-API-Tokens',
description:
'Langlebige Tokens zum Einbetten des Kamerastreams in Home Assistant, Frigate, Kioske oder andere Tools, die eine stabile URL benötigen. Jeder Token ist nur für den Kamerastream und kann jederzeit widerrufen werden.',
loading: 'Laden…',
confirmRevoke: {
title: 'Dieses Token widerrufen?',
body: 'Jedes Gerät, das "{{name}}" verwendet, verliert sofort den Zugriff. Dies kann nicht rückgängig gemacht werden.',
cancel: 'Abbrechen',
confirm: 'Widerrufen',
},
create: {
title: 'Neues Token erstellen',
nameLabel: 'Token-Name',
namePlaceholder: 'z. B. Home Assistant',
daysLabel: 'Tage bis Ablauf',
submit: 'Erstellen',
hint:
'Maximale Lebensdauer 365 Tage. Der Token-Wert wird nur einmal bei der Erstellung angezeigt – jetzt kopieren.',
},
created: {
title: 'Token erstellt – jetzt kopieren',
warning:
'Dies ist das einzige Mal, dass dieser Token sichtbar ist. Nach dem Schließen dieses Dialogs können Sie ihn nie wieder anzeigen.',
copy: 'Kopieren',
dismiss: 'Ich habe es gespeichert',
},
list: {
myTitle: 'Meine Tokens',
allTitle: 'Alle Benutzer (Admin-Ansicht)',
empty: 'Noch keine Tokens.',
name: 'Name',
owner: 'Eigentümer',
prefix: 'Präfix',
created: 'Erstellt',
expires: 'Läuft ab',
lastUsed: 'Zuletzt verwendet',
revoke: 'Widerrufen',
expired: 'Abgelaufen',
},
toast: {
created: 'Token erstellt',
createFailed: 'Token konnte nicht erstellt werden',
revoked: 'Token widerrufen',
revokeFailed: 'Token konnte nicht widerrufen werden',
loadFailed: 'Tokens konnten nicht geladen werden',
copied: 'In Zwischenablage kopiert',
copyFailed: 'Kopieren fehlgeschlagen – manuell auswählen und kopieren',
},
},
// Forecast & Inventory Intelligence
forecast: {
title: 'Bestandsprognose',
noSpools: 'Keine aktiven Spulen gefunden. Fügen Sie Spulen zu Ihrem Inventar hinzu, um Prognosedaten zu sehen.',
noUsageData: 'Keine Verbrauchsdaten verfügbar — die Bestandszeitlinie kann nicht projiziert werden.',
sku: 'SKU',
// Table headers
material: 'Material',
stock: 'Bestand',
dailyRate: 'Rate',
daysLeft: 'Verbleibende Tage',
emptyBy: 'Aufgebraucht am',
reorderBy: 'Nachbestellen bis',
actions: 'Aktionen',
// Rate tier badges
trend: 'Trend',
estimated: 'Gesch.',
noData: 'Keine Daten',
// Timeframe
timeframe: 'Zeitraum',
// Chart
chartTitle: 'Bestandsprognose — Top 5 Materialien',
dashedLinesROP: 'Gestrichelte Linien = Nachbestellpunkte',
stockLevel: 'Bestandsniveau',
reorderPoint: 'Nachbestellpunkt',
safetyMargin: 'Sicherheitspuffer',
trendLegend: 'Trend (verlaufsbasiert, 95 % Serviceniveau)',
estimatedLegend: 'Geschätzt (Gewichtsdelta)',
noDataLegend: 'Keine Daten',
ropLabel: 'NBP',
ssLabel: 'SB',
safetyStockLegend: 'Sicherheitsbestand',
stockArrivalLegend: 'Wareneingang',
stockoutLegend: 'Fehlbestand',
// Alerts toolbar
alertCount_one: '{{count}} Warnung',
alertCount_other: '{{count}} Warnungen',
order: 'Bestellen',
// Settings
globalLeadTime: 'Globale Lieferzeit',
globalLeadTimeHint: 'Globale Lieferzeitvorgabe — wird in der Nachbestellpunktberechnung für alle SKUs verwendet',
save: 'Speichern',
cancel: 'Abbrechen',
settingsSaved: 'Einstellungen gespeichert',
failedSaveSettings: 'Einstellungen konnten nicht gespeichert werden',
globalLeadTimeSaved: 'Globale Lieferzeit gespeichert',
skuLeadTimeOverride: 'SKU-Lieferzeitüberschreibung',
skuLeadTimeHint: '0 = globale Lieferzeit verwenden. Größer 0 setzen, um für diesen SKU zu überschreiben.',
safetyMarginLabel: 'Sicherheitspuffer',
effectiveLeadTime: 'Effektive Lieferzeit',
effectiveLeadTimeHint: 'max(global {{global}}T, SKU {{sku}}T)',
reorderPointHint: 'd̄ × LT + safety margin — bei diesem Bestand bestellen',
safetyMarginHint: 'Statistischer Sicherheitsbestand (z=1,65 × σ × √LT) + benutzerdefinierter Puffer',
safetyMarginHintDays: 'Zusätzlicher Puffer auf den statistischen Sicherheitsbestand.{{approx}}',
safetyMarginHintDaysApprox: ' ≈ {{g}}g beim aktuellen Verbrauch.',
safetyMarginHintG: 'Fester Gewichtspuffer auf den statistischen Sicherheitsbestand.{{approx}}',
safetyMarginHintGApprox: ' ≈ {{days}}d beim aktuellen Verbrauch.',
individualSpools: 'Einzelne Spulen',
labelWeight: 'Etikett',
spoolCount_one: '{{count}} Spule',
spoolCount_other: '{{count}} Spulen',
// Alerts
stockBreakRisk: 'Bestandsunterbrechungsrisiko',
stockBreakBefore: 'Bestandsunterbrechung vor Auffüllung',
stockBreakDetail: '{{days}}d verbleibend, Lieferzeit {{lt}}d.',
reorderNow: 'Jetzt nachbestellen',
reorderTriggerPassed: 'Auslösedatum {{date}} ist überschritten.',
// Shopping list
shoppingList: 'Einkaufsliste',
shoppingListItems_one: '({{count}} Artikel)',
shoppingListItems_other: '({{count}} Artikel)',
shoppingListEmpty: 'Einkaufsliste ist leer. Klicken Sie auf das Warenkorbsymbol in einer Zeile, um Artikel hinzuzufügen.',
addToCart: 'Zur Einkaufsliste hinzufügen',
alertsSnoozed: 'Benachrichtigungen für diese SKU stummschalten',
alertsEnabled: 'Benachrichtigungen für diese SKU aktivieren',
addedToCart: 'Zur Einkaufsliste hinzugefügt',
failedAddItem: 'Artikel konnte nicht hinzugefügt werden',
listView: 'Liste',
logisticsView: 'Logistik',
qty: 'Menge',
weight: 'Gewicht',
leadTime: 'Lieferzeit',
expectedRestock: 'Erwartete Auffüllung',
status: 'Status',
note: 'Notiz',
pending: 'Ausstehend',
purchased: 'Bestellt',
received: 'Erhalten',
markPurchased: 'Als bestellt markieren',
markReceived: 'Als erhalten markieren — fügt Spulen dem Lagerbestand hinzu',
resetToPending: 'Auf ausstehend zurücksetzen',
remove: 'Entfernen',
clearAll: 'Alle löschen',
downloadCsv: 'CSV',
// Add to cart modal
addToCartTitle: 'Zur Einkaufsliste hinzufügen',
byQuantity: 'Nach Menge',
byDuration: 'Nach Dauer',
numberOfSpools: 'Anzahl der Spulen',
lastHowManyDays: 'Wie viele Tage soll es reichen?',
noUsageQty: 'Keine Verbrauchsdaten — Menge auf 1 gesetzt.',
noteOptional: 'Notiz (optional)',
notePlaceholder: 'z. B. für Projekt X, dringend…',
addNSpools_one: '{{count}} Spule hinzufügen',
addNSpools_other: '{{count}} Spulen hinzufügen',
// Cart logistics
onArrival: 'Bei Ankunft',
stockBreakIn: 'Bestandsunterbrechung in {{days}}d.',
stockRunsOutBefore: 'Bestand läuft vor Ablauf der {{lt}}d Lieferzeit aus.',
atRate: 'Bei {{rate}}g/Tag benötigen Sie',
moreSpools_one: '{{count}} weitere Spule',
moreSpools_other: '{{count}} weitere Spulen',
bridgeGap: 'um die Lücke zu überbrücken.',
// Permissions
noReadAccess: 'Sie haben keine Berechtigung, Bestandsprognosen anzuzeigen.',
noWriteAccess: 'Sie haben keine Berechtigung, Prognoseeinstellungen zu ändern.',
},
};