export const de = { // ── Common ────────────────────────────────────────────────────────────────── 'common.save': 'Speichern', 'common.cancel': 'Abbruch', 'common.delete': 'Löschen', 'common.edit': 'Bearbeiten', 'common.add': 'Hinzufügen', 'common.create': 'Erstellen', 'common.close': 'Schließen', 'common.ok': 'OK', 'common.yes': 'Ja', 'common.no': 'Nein', 'common.search': 'Suchen…', 'common.loading': 'Lade…', 'common.all': 'Alle', 'common.none': 'Kein', 'common.auto': 'Automatisch', 'common.on': 'An', 'common.off': 'Aus', 'common.confirm': 'Bestätigen', 'widget.confirm.defaultPrompt': 'Wirklich schalten?', 'common.duplicate': 'Duplizieren', 'common.export': 'Exportieren', 'common.move': 'Verschieben', 'common.reset': 'Zurücksetzen', 'common.remove': 'Entfernen', 'common.sizeSmall': 'Klein', 'common.sizeMedium': 'Mittel', 'common.sizeLarge': 'Groß', 'common.seconds': 'Sek.', // ── Admin Navigation ───────────────────────────────────────────────────────── 'admin.nav.overview': 'Übersicht', 'admin.nav.editor': 'Dashboard-Editor', 'admin.nav.layouts': 'Layouts', 'admin.nav.cssjs': 'CSS & JS', 'admin.nav.loadtimes': 'Ladezeiten', 'admin.nav.widgets': 'Widgets', 'admin.nav.widgetDesigner': 'Widget-Designer', 'admin.nav.popups': 'Popups', 'admin.nav.design': 'Frontend-Design', 'admin.nav.settings': 'Einstellungen', 'admin.nav.openFrontend': 'Frontend öffnen', 'admin.nav.docs': 'Dokumentation', 'admin.nav.logout': 'Abmelden', 'admin.nav.lightMode': 'Hell-Modus', 'admin.nav.darkMode': 'Dunkel-Modus', // ── Admin Save Bar ──────────────────────────────────────────────────────────── 'admin.save.unsaved': 'Ungespeicherte Änderungen', 'admin.save.undo': 'Rückgängig', 'admin.save.save': 'Speichern', 'admin.save.saved': 'Alle Änderungen gespeichert', 'admin.save.autoIn': 'Automatisch in {s}s…', // ── Editor settings ─────────────────────────────────────────────────────────── 'settings.editor.title': 'Editor', 'settings.editor.autoSave': 'Automatisch speichern', 'settings.editor.delay': 'Verzögerung', 'settings.editor.ctrlS': 'Strg+S speichert sofort', // ── Settings ────────────────────────────────────────────────────────────────── 'settings.title': 'Einstellungen', 'settings.subtitle': 'Frontend, Grid, Sicherheit und Backup', 'settings.language.title': 'Sprache', 'settings.language.de': 'Deutsch', 'settings.language.en': 'Englisch', 'settings.client.title': 'Dieses Gerät', 'settings.client.hint': 'Jeder Client bekommt eine eindeutige ID. Über {ns}.clients.{id}.navigate.url lässt sich dieses Gerät individuell steuern.', 'settings.client.name': 'Gerätename', 'settings.client.namePh': 'z.B. Küche Tablet, Wohnzimmer TV…', 'settings.client.id': 'ioBroker-Datenpunkt', 'settings.clients.title': 'Verbundene Geräte', 'settings.clients.hint': 'Alle Geräte, die sich je verbunden haben.', 'settings.clients.none': 'Noch keine Geräte registriert.', 'settings.clients.thisDevice': 'Dieses Gerät', 'settings.clients.copyId': 'Client-ID kopieren', 'settings.clients.showIdBadge': 'ID-Badge auf jedem Gerät anzeigen', 'settings.clients.justNow': 'gerade eben', 'settings.clients.minsAgo': 'vor {n} min', 'settings.clients.hoursAgo': 'vor {n} Std', 'settings.clients.daysAgo': 'vor {n} d', 'settings.adminBaseUrl.title': 'Admin-Basis-URL', 'settings.adminBaseUrl.description': 'Wird relativen Bildpfaden in JSON-Tabellen-Widgets vorangestellt (z.B. /meteoalarm.admin/icons/...). Greift bei Pfaden im Format /.admin/...', 'settings.adminBaseUrl.hint': 'Leer = automatisch (gleicher Host, Port 8081). Per Spalte überschreibbar im JSON-Tabellen-Widget.', 'settings.frontend.title': 'Frontend', 'settings.behavior.title': 'Verhalten', 'settings.frontend.layoutDrawer': 'Bereichs-Menü (Hamburger)', 'settings.frontend.layoutDrawerHint': 'Wird angezeigt, wenn das Layout mehr als einen Bereich hat (oder immer, wenn unten aktiviert).', 'settings.frontend.layoutDrawerShowSingle': 'Menü schon ab einem Bereich anzeigen', 'settings.frontend.layoutDrawerShowSingleHint': 'Bereichs-Menü auch anzeigen, wenn das Layout nur einen Bereich hat.', 'settings.frontend.layoutDrawerSize': 'Größe des Hamburger-Buttons', 'settings.frontend.layoutDrawerAutoHide': 'Auto-Ausblenden', 'settings.frontend.layoutDrawerAutoHideHint': 'Button erscheint nur, wenn die Maus oben am Rand ist (oder bei Touch nach Tipp im oberen Bereich). Wirkt nur wenn der Header ausgeblendet ist.', 'settings.frontend.layoutDrawerPlacement': 'Platzierung', 'settings.frontend.layoutDrawerPlacementFloating': 'Schwebend', 'settings.frontend.layoutDrawerPlacementTabbar': 'In Tab-Leiste', 'settings.frontend.layoutDrawerPlacementSidebar': 'Feste Seitenleiste', 'settings.frontend.layoutDrawerPlacementTop': 'Leiste oben', 'settings.frontend.layoutDrawerPlacementBottom': 'Leiste unten', 'settings.frontend.layoutDrawerPlacementHint': 'Schwebend/Tab-Leiste zeigen einen Hamburger mit Overlay (nur bei ausgeblendetem Header). Feste Seitenleiste ist ein dauerhaft sichtbares Menü links. Leiste oben/unten ist eine waagerechte Bereichsleiste wie die Tab-Leiste – oben liegt sie über der Tab-Leiste.', 'settings.frontend.layoutDrawerWidth': 'Breite der Seitenleiste', 'settings.frontend.layoutDrawerTopOffset': 'Abstand nach oben', 'settings.frontend.layoutDrawerBottomOffset': 'Abstand nach unten', 'settings.frontend.layoutDrawerShowTitle': 'Titel des Menüs anzeigen', 'settings.frontend.layoutDrawerHamburger': 'Hamburger-Button', 'settings.frontend.layoutDrawerEntryHeight': 'Höhe der Einträge', 'settings.frontend.layoutDrawerPlacementDisabledHeader': 'Nicht relevant, solange der Header sichtbar ist – der Hamburger wird dann im Header angezeigt.', 'settings.frontend.layoutDrawerPlacementTabbarDisabledAutoHide': 'Nicht verfügbar, wenn Auto-Ausblenden aktiv ist.', 'settings.frontend.layoutDrawerTitle': 'Titel des Menüs', 'settings.frontend.layoutDrawerEntryStyle': 'Darstellung der Einträge', 'settings.frontend.layoutDrawerEntryStyleIconAndName': 'Icon + Name', 'settings.frontend.layoutDrawerEntryStyleIconOnly': 'Nur Icon', 'settings.frontend.layoutDrawerEntryStyleNameOnly': 'Nur Name', 'settings.frontend.layoutDrawerEntryStyleBulletAndName': 'Aufzählungspunkt + Name', 'settings.frontend.layoutDrawerIndicatorStyle': 'Stil des ausgewählten Bereichs', 'settings.frontend.layoutDrawerFontSize': 'Schriftgröße', 'settings.frontend.layoutDrawerIconSize': 'Icon-Größe', 'settings.frontend.layoutDrawerItems': 'Elemente', 'settings.frontend.layoutDrawerItemPosTop': 'Oben', 'settings.frontend.layoutDrawerItemPosBottom': 'Unten', 'settings.frontend.layoutDrawerItemMarginTop': 'Abstand oben', 'settings.frontend.layoutDrawerItemMarginBottom': 'Abstand unten', 'settings.frontend.idleReturn': 'Automatisch zum Standard-Tab zurückkehren', 'settings.frontend.idleReturnDelay': 'Verzögerung', 'settings.frontend.idleReturnHint': 'Wechselt nach der angegebenen Inaktivitätszeit zum Standard-Bereich des Layouts und dessen Standard-Tab.', 'settings.frontend.optimisticUpdates': 'Sofortige Rückmeldung beim Schalten', 'settings.frontend.optimisticUpdatesHint': 'Zeigt geschriebene Werte direkt an, ohne auf die Bestätigung von ioBroker zu warten. Behebt hängende Anzeigen bei Datenpunkten ohne Rückmeldung (z. B. reine 0_userdata-Variablen).', 'settings.frontend.showHeader': 'Header anzeigen', 'settings.frontend.dashboardTitle': 'Dashboard-Titel', 'settings.frontend.connectionBadge': 'Verbindungsstatus', 'settings.frontend.showAdminLink': 'Admin-Link im Header anzeigen', 'settings.frontend.headerClock': 'Uhrzeit/Datum im Header', 'settings.frontend.headerClockDisplay': 'Anzeige', 'settings.frontend.headerClockSeconds': 'Sekunden', 'settings.frontend.headerClockDateLen': 'Datumsformat', 'settings.frontend.headerClockCustom': 'Eigenes Format (leer = Standard)', 'settings.frontend.headerDatapoint': 'Datenpunkt im Header', 'settings.frontend.headerDatapointPh': 'z.B. hm-rpc.0.NEQ123.1.ACTUAL_TEMPERATURE', 'settings.frontend.headerDatapointTemplate': 'HTML-Template (optional)', 'settings.frontend.headerDatapointTemplatePh': '{dp} °C', 'settings.frontend.headerDatapointTemplateHint': '{dp} wird durch den Datenpunkt-Wert ersetzt · Beispiel: {dp} kW', 'settings.tabBar.title': 'Tableiste', 'settings.tabBar.height': 'Höhe', 'settings.tabBar.style': 'Tab-Stil', 'settings.tabBar.styleText': 'Farbig', 'settings.tabBar.styleUnderline': 'Unterstrich', 'settings.tabBar.styleFilled': 'Gefüllt', 'settings.tabBar.stylePills': 'Pill', 'settings.tabBar.fontSize': 'Schriftgröße', 'settings.tabBar.iconSize': 'Icon-Größe', 'settings.tabBar.fontSm': 'Klein', 'settings.tabBar.fontMd': 'Mittel', 'settings.tabBar.fontLg': 'Groß', 'settings.tabBar.background': 'Hintergrund', 'settings.tabBar.activeColor': 'Aktiv-Farbe', 'settings.tabBar.inactiveColor': 'Inaktiv-Farbe', 'settings.tabBar.items': 'Elemente in der Tableiste', 'settings.tabBar.addItem': '+ Element hinzufügen', 'settings.tabBar.itemTypeClock': 'Uhrzeit', 'settings.tabBar.itemTypeDatapoint': 'Datenpunkt', 'settings.tabBar.itemTypeText': 'Text', 'settings.tabBar.posLeft': 'Links', 'settings.tabBar.posCenter': 'Mitte', 'settings.tabBar.posRight': 'Rechts', 'settings.tabBar.datapointId': 'Datenpunkt-ID', 'settings.tabBar.datapointTemplate': 'Template (optional)', 'settings.tabBar.datapointTemplateHint': '{dp} = Wert. HTML wird unterstützt.', 'settings.tabBar.staticText': 'Text', 'settings.tabBar.clockDisplay': 'Anzeige', 'settings.tabBar.clockSeconds': 'Sekunden', 'settings.tabBar.clockDateLen': 'Datumsformat', 'settings.tabBar.clockCustom': 'Eigenes Format', 'settings.tabBar.tabsAlignment': 'Menü-Position', 'settings.tabBar.alignLeft': 'Links', 'settings.tabBar.alignCenter': 'Mitte', 'settings.tabBar.alignRight': 'Rechts', 'settings.tabBar.hideMobileScrollbar': 'Laufleiste ausblenden (mobil)', 'settings.tabBar.showSingle': 'Leiste schon ab einem Tab anzeigen', 'settings.tabBar.position': 'Position', 'settings.tabBar.positionTop': 'Oben', 'settings.tabBar.positionBottom': 'Unten (Footer)', 'settings.tabBar.clearAll': '↩ Alles zurücksetzen', 'settings.grid.title': 'Grid & Mobil', 'settings.grid.rowHeight': 'Rastergröße (Zeile)', 'settings.grid.snapX': 'Rastergröße (Spalte)', 'settings.grid.mobileBreak': 'Mobile-Breakpoint', 'settings.grid.wizardMaxDp': 'Wizard Max-Datenpunkte', 'settings.grid.mobileOff': 'Aus', 'settings.grid.hideScrollbar': 'Scrollbalken ausblenden', 'settings.grid.hideScrollbarHint': 'Blendet den ziehbaren Scrollbalken über dem Dashboard auf Touch-Geräten aus.', 'settings.pin.title': 'Admin-PIN', 'settings.pin.newPin': 'Neuer PIN (min. 4 Zeichen)', 'settings.pin.confirm': 'PIN bestätigen', 'settings.pin.save': 'PIN speichern', 'settings.pin.tooShort': 'Mindestens 4 Zeichen', 'settings.pin.mismatch': 'PINs stimmen nicht überein', 'settings.pin.success': 'PIN erfolgreich geändert', 'settings.pin.wrong': 'Falscher PIN', 'settings.backup.title': 'Backup & Restore', 'settings.backup.description': 'Dashboard ({count} Tab{s}), Theme und Config als JSON.', 'settings.backup.download': 'Download Backup', 'settings.backup.import': 'Backup importieren', 'settings.backup.invalidFile': 'Ungültige Backup-Datei', 'settings.autobackup.title': 'Automatisches Backup', 'settings.autobackup.description': 'Wird bei jedem Speichern als Datei unter {ns}.backups/ abgelegt.', 'settings.autobackup.lastBackup': 'Letztes Backup', 'settings.autobackup.noBackup': 'Noch kein Backup vorhanden', 'settings.autobackup.download': 'Backup herunterladen', 'settings.autobackup.restore': 'Aus Backup wiederherstellen', 'settings.autobackup.restoreConfirm': 'Jetzt wiederherstellen?', 'settings.autobackup.restoring': 'Wird wiederhergestellt …', 'settings.autobackup.success': 'Wiederhergestellt', 'settings.autobackup.error': 'Fehler beim Wiederherstellen', 'settings.autobackup.noData': 'Backup enthält keine Daten', 'settings.autobackup.count': 'Anzahl Backups', 'settings.autobackup.latest': 'aktuellstes', 'settings.autobackup.changed': 'Geändert', 'settings.autobackup.store.aura-dashboard': 'Dashboard', 'settings.autobackup.store.aura-theme': 'Theme', 'settings.autobackup.store.aura-groups': 'Gruppen', 'settings.autobackup.store.aura-config': 'App-Konfiguration', 'settings.autobackup.store.aura-global-settings': 'Globale Einstellungen', 'settings.autobackup.store.aura-group-defs': 'Gruppen-Inhalte', 'settings.autobackup.store.aura-popup-config': 'Popups', 'settings.autobackup.store.aura-widget-presets': 'Widget-Vorlagen', 'settings.autobackup.change.widget-added': 'Widget „{label}“ hinzugefügt', 'settings.autobackup.change.widget-added.n': '{count} Widgets hinzugefügt', 'settings.autobackup.change.widget-removed': 'Widget „{label}“ entfernt', 'settings.autobackup.change.widget-removed.n': '{count} Widgets entfernt', 'settings.autobackup.change.widget-moved': 'Widget „{label}“ verschoben', 'settings.autobackup.change.widget-moved.n': '{count} Widgets verschoben', 'settings.autobackup.change.widget-edited': 'Widget „{label}“ bearbeitet', 'settings.autobackup.change.widget-edited.n': '{count} Widgets bearbeitet', 'settings.autobackup.change.widget-dp': 'Widget „{label}“: Datenpunkt geändert', 'settings.autobackup.change.widget-dp.n': '{count}× Datenpunkt geändert', 'settings.autobackup.change.widget-renamed': 'Widget in „{label}“ umbenannt', 'settings.autobackup.change.widget-renamed.n': '{count} Widgets umbenannt', 'settings.autobackup.change.series-added': 'Diagramm „{label}“: Serie hinzugefügt', 'settings.autobackup.change.series-added.n': '{count}× Serie hinzugefügt', 'settings.autobackup.change.series-removed': 'Diagramm „{label}“: Serie entfernt', 'settings.autobackup.change.series-removed.n': '{count}× Serie entfernt', 'settings.autobackup.change.widget-item-added': 'Widget „{label}“: Eintrag hinzugefügt', 'settings.autobackup.change.widget-item-added.n': '{count}× Eintrag hinzugefügt', 'settings.autobackup.change.widget-item-removed': 'Widget „{label}“: Eintrag entfernt', 'settings.autobackup.change.widget-item-removed.n': '{count}× Eintrag entfernt', 'settings.autobackup.change.tab-added': 'Tab „{label}“ hinzugefügt', 'settings.autobackup.change.tab-added.n': '{count} Tabs hinzugefügt', 'settings.autobackup.change.tab-removed': 'Tab „{label}“ entfernt', 'settings.autobackup.change.tab-removed.n': '{count} Tabs entfernt', 'settings.autobackup.change.tab-renamed': 'Tab „{label}“ umbenannt', 'settings.autobackup.change.tab-renamed.n': '{count} Tabs umbenannt', 'settings.autobackup.change.layout-added': 'Layout „{label}“ hinzugefügt', 'settings.autobackup.change.layout-added.n': '{count} Layouts hinzugefügt', 'settings.autobackup.change.layout-removed': 'Layout „{label}“ entfernt', 'settings.autobackup.change.layout-removed.n': '{count} Layouts entfernt', 'settings.autobackup.change.layout-renamed': 'Layout „{label}“ umbenannt', 'settings.autobackup.change.layout-renamed.n': '{count} Layouts umbenannt', 'settings.autobackup.change.section-added': 'Bereich „{label}“ hinzugefügt', 'settings.autobackup.change.section-added.n': '{count} Bereiche hinzugefügt', 'settings.autobackup.change.section-removed': 'Bereich „{label}“ entfernt', 'settings.autobackup.change.section-removed.n': '{count} Bereiche entfernt', 'settings.autobackup.change.section-renamed': 'Bereich „{label}“ umbenannt', 'settings.autobackup.change.section-renamed.n': '{count} Bereiche umbenannt', 'settings.expert.title': 'Experten', 'settings.expert.locked': 'Zugang mit Admin-PIN', 'settings.expert.unlocked': 'Entsperrt', 'settings.expert.unlock': 'Entsperren', 'settings.expert.lock': 'Sperren', 'settings.reset.title': 'Alles zurücksetzen', 'settings.reset.description': 'Löscht alle Dashboards, Widgets, Themes und Einstellungen. Nicht rückgängig.', 'settings.reset.button': 'Zurücksetzen…', 'settings.reset.confirm': 'Ja, alles löschen', // ── Dashboard Overview ──────────────────────────────────────────────────────── 'dashboard.title': 'Übersicht', 'dashboard.subtitle': 'Status und Statistiken', 'dashboard.stats.layouts': 'Layouts', 'dashboard.stats.tabs': 'Tabs gesamt', 'dashboard.stats.widgets': 'Widgets gesamt', 'dashboard.stats.connected': 'Verbunden', 'dashboard.stats.disconnected': 'Getrennt', 'dashboard.tabs.title': 'Tabs & Widgets', 'dashboard.tabs.widgets': 'Widgets', 'dashboard.aura.title': 'Was bedeutet AURA?', 'dashboard.aura.adaptive': 'Passt sich flexibel an Geräte, Räume und Layouts an', 'dashboard.aura.unified': 'Alle Datenpunkte und Räume in einer einheitlichen Oberfläche', 'dashboard.aura.room': 'Raumbasierte Organisation – jedes Tablet sein eigenes Layout', 'dashboard.aura.automation': 'ioBroker-Automatisierungen live steuern und visualisieren', 'dashboard.nav.title': 'Tablet-Navigation via ioBroker', 'dashboard.nav.description': 'Setze den folgenden Datenpunkt aus einem ioBroker-Skript oder einer Automatisierung, um das Tablet auf einen bestimmten Tab oder eine externe URL zu navigieren. Der Datenpunkt wird nach der Navigation automatisch zurückgesetzt.', 'dashboard.nav.datapoint': 'Datenpunkt', 'dashboard.nav.tabSlugs': 'Tab-Slugs (Wert für den Datenpunkt)', 'dashboard.nav.example': 'Beispiel (JavaScript-Skript)', 'dashboard.nav.externalUrl': 'Für externe URLs die vollständige URL angeben (https://…).', 'dashboard.nav.copy': 'Kopieren', 'dashboard.orphans.title': '{count} verwaiste DPs in ioBroker', 'dashboard.orphans.titleClean': 'Keine verwaisten DPs in ioBroker', 'dashboard.orphans.hint': 'Diese Datenpunkte existieren in ioBroker, gehören aber zu keinem Widget mehr. Bereinigen entfernt sie aus dem Objektbaum.', 'dashboard.orphans.hintClean': 'Jeder {ns}.timers.* und {ns}.lists.* Datenpunkt gehört zu einem existierenden Widget.', 'dashboard.orphans.timerLabel': 'Zeitschaltuhr-DPs ohne Widget', 'dashboard.orphans.listLabel': 'Listen-DPs ohne Widget', 'dashboard.orphans.refresh': 'Aktualisieren', 'dashboard.orphans.cleanup': 'Aufräumen', 'dashboard.brokenDps.title': '{count} Widget-Referenz(en) auf fehlende DPs', 'dashboard.brokenDps.titleClean': 'Alle Widget-DP-Referenzen sind gültig', 'dashboard.brokenDps.hint': 'Die folgenden Widgets verweisen auf Datenpunkte, die in ioBroker nicht (mehr) existieren. Datenpunkt im Widget anpassen oder im Adapter wieder anlegen.', 'dashboard.brokenDps.hintClean': 'Jeder von einem Widget verwendete Datenpunkt existiert in ioBroker.', 'dashboard.brokenDps.colWidget': 'Widget', 'dashboard.brokenDps.colLocation': 'Ort', 'dashboard.brokenDps.colField': 'Feld', 'dashboard.brokenDps.colDp': 'Datenpunkt', // ── Layouts ─────────────────────────────────────────────────────────────────── 'layouts.title': 'Layouts', 'layouts.subtitle': 'Jedes Layout hat eigene Tabs und Widgets — ideal für verschiedene Tablets oder Räume.', 'layouts.newLayout': 'Neues Layout', 'layouts.placeholder': 'Layout-Name, z.B. Schlafzimmer-Tablet', 'layouts.create': 'Erstellen', 'layouts.urlSchema': 'URL-Schema', 'layouts.default': 'Standard-Layout (erstes Layout)', 'layouts.specific': 'Bestimmtes Layout', 'layouts.specificTab': 'Bestimmtes Layout + Tab', 'layouts.duplicateName': 'Name der Kopie:', 'layouts.duplicate': 'Duplizieren', 'layouts.open': 'Im Frontend öffnen', 'layouts.edit': 'Bearbeiten', 'layouts.delete': 'Layout löschen', 'layouts.export': 'Layout exportieren', 'layouts.import': 'Layout importieren', 'layouts.importInvalidFile': 'Ungültige Layout-Datei', 'layouts.changeIcon': 'Icon ändern', 'layouts.dragToReorder': 'Ziehen, um die Reihenfolge zu ändern', 'layouts.defaultTab': 'Standard-Tab', 'layouts.setDefaultTab': 'Als Standard-Tab setzen (wird geöffnet wenn kein Tab in der URL angegeben ist)', 'layouts.designSettings': 'Frontend-Design öffnen', 'layouts.designHint': 'Theme, Typografie, Header, Menü und Tab-Leiste werden unter Frontend-Design eingestellt.', 'layouts.designHintLink': 'Zum Frontend-Design →', // ── Bereiche — die Menü-Ebene im linken Menü eines Layouts ── 'sections.title': 'Bereiche', 'sections.subtitle': 'Ein Bereich ist ein Eintrag im linken Menü eines Layouts und enthält eigene Tabs.', 'sections.manage': 'Bereiche verwalten', 'sections.newSection': 'Neuer Bereich', 'sections.placeholder': 'Bereichs-Name, z.B. Übersicht', 'sections.one': 'Bereich', 'sections.count': '{count} Bereiche', 'sections.countOne': '1 Bereich', 'sections.delete': 'Bereich löschen', 'sections.export': 'Bereich exportieren', 'sections.import': 'Bereich importieren', 'sections.importInvalidFile': 'Ungültige Bereichs-Datei', 'sections.moveTitle': 'Bereich in Layout verschieben / kopieren', 'sections.moveTargetLabel': 'Ziel-Layout', 'sections.moveTargetPlaceholder': 'Ziel-Layout wählen…', 'sections.move': 'Verschieben', 'sections.copy': 'Kopieren', 'sections.moveLastHint': 'Der einzige Bereich eines Layouts kann nicht verschoben werden', 'sections.hideFromMenu': 'Aus Menü ausblenden', 'sections.hideFromMenuHint': 'Bereich aus dem linken Menü entfernen. Bleibt per direkter URL erreichbar.', 'sections.hideMenuHere': 'Menü hier verbergen', 'sections.hideMenuHereHint': 'Bereichs-Menü ausblenden, wenn dieser Bereich geöffnet ist – z.B. für ein festgelegtes Tablet.', 'sections.defaultSection': 'Layout-Standard', 'sections.setDefaultSection': 'Diesen Bereich als Standard des Layouts festlegen – das Layout öffnet hier und die Idle-Rückkehr führt hierher.', 'sections.isDefault': 'Standard', 'sections.makeDefault': 'Als Standard', 'design.title': 'Frontend-Design', 'design.subtitle': 'Theme, Typografie, Grid und Tab-Leiste — global oder pro Layout.', 'design.frameGroup': 'Globaler Rahmen', 'design.header.hint': 'Kopfleiste des Frontends: Titel, Uhr, Status-Badge und ein optionaler Datenpunkt. Global oder pro Layout konfigurierbar.', 'design.menu.hint': 'Linkes Navigations-Menü zum Wechseln zwischen den Bereichen eines Layouts (Hamburger-Button oder angedockte Sidebar). Global oder pro Layout konfigurierbar.', 'design.nav.hint': 'Nach einer Zeit ohne Aktivität automatisch zum Layout-Standard zurückkehren. Global oder pro Layout konfigurierbar.', 'layouts.subtab.theme': 'Theme & CSS-Vars', 'layouts.subtab.typo': 'Typografie & Spacing', 'layouts.subtab.grid': 'Grid & Mobile', 'layouts.subtab.guidelines': 'Hilfslinien & Auflösung', 'guidelines.hint': 'Die aktuelle Bildschirmauflösung wird angezeigt. Zum Ausschalten: Admin → Design → Hilfslinien & Auflösung.', 'guidelines.hintKeep': 'Verstanden', 'guidelines.resolutionLabel': 'Auflösung', 'layouts.subtab.css': 'Custom CSS', 'layouts.subtab.tabbar': 'Tab-Leiste', 'layouts.subtab.tabbarHiddenHint': 'Tab-Leiste wird pro Layout konfiguriert. Wähle ein Layout im Picker oben.', 'layouts.subtab.header': 'Header', 'layouts.subtab.menu': 'Bereichs-Menü', 'layouts.subtab.nav': 'Navigation', 'layouts.scope.title': 'Geltungsbereich', 'layouts.scope.global': 'Global', 'layouts.scope.globalHint': 'Voreinstellungen für alle Bereiche', 'layouts.scope.layoutHint': 'Überschreibt globale Werte', 'layouts.scope.resetToGlobal': 'Auf Global zurücksetzen', 'layouts.scope.reset': 'Zurücksetzen', 'layouts.scope.resetHint': 'Overrides dieses Bereichs entfernen und wieder erben.', 'layouts.context.label': 'Kontext', 'layouts.context.global': 'Global', 'layouts.context.hintGlobal': 'Voreinstellungen für alle Bereiche. Bereiche können einzelne Werte überschreiben.', 'layouts.context.hintLayout': 'Werte überschreiben den globalen Standard. ↩ Global setzt einen Wert zurück.', // ── Layout drawer (Hamburger) ───────────────────────────────────────────────── 'layoutDrawer.title': 'Bereiche', 'layoutDrawer.open': 'Bereichs-Menü öffnen', // ── Endpoints ───────────────────────────────────────────────────────────────── 'endpoints.title': 'Endpunkte & Gruppen', 'endpoints.subtitle': 'Fasse Datenpunkte in Gruppen zusammen – z.B. „Alle Lichter“. Gruppen können als Listen-Widget ins Dashboard eingefügt werden.', 'endpoints.newGroup': 'Neue Gruppe (z.B. Alle Lichter)', 'endpoints.createGroup': 'Erstellen', 'endpoints.noGroups': 'Noch keine Gruppen', 'endpoints.noGroupsHint': 'Erstelle eine Gruppe und füge Datenpunkte hinzu', 'endpoints.dp.count': '{count} Datenpunkte', 'endpoints.dp.add': 'Datenpunkt hinzufügen', 'endpoints.dp.empty': 'Noch keine Datenpunkte – füge welche hinzu.', 'endpoints.dp.label': 'Bezeichnung', 'endpoints.dp.type': 'Typ', 'endpoints.dp.typeBoolean': 'Boolean (Schalter / Anzeige)', 'endpoints.dp.typeNumber': 'Zahl (Wert)', 'endpoints.dp.typeText': 'Text', 'endpoints.dp.unit': 'Einheit', 'endpoints.dp.unitPh': 'z.B. °C, %, W', 'endpoints.dp.writable': 'Schreibbar', 'endpoints.dp.asSwitch': 'Als Schalter', 'endpoints.dp.typeSwitch': 'Schalter', 'endpoints.dp.typeBool': 'Bool', 'endpoints.dp.typeNum': 'Zahl', 'endpoints.dp.toggle': 'Toggle-Schalter', 'endpoints.dp.settable': 'Wert kann gesetzt werden', 'endpoints.dp.readOnly': 'Nur Anzeige', 'endpoints.picker.title': 'Datenpunkte wählen', 'endpoints.picker.load': 'Geräte aus ioBroker laden', 'endpoints.picker.loading': 'Lade…', 'endpoints.picker.search': 'Suchen…', 'endpoints.picker.all': 'Alle', 'endpoints.picker.none': 'Nichts ausgewählt', 'endpoints.picker.selected': '{count} ausgewählt', 'endpoints.picker.add': 'Hinzufügen', 'endpoints.picker.cancel': 'Abbruch', // ── Login ───────────────────────────────────────────────────────────────────── 'login.setup.title': 'Admin einrichten', 'login.setup.subtitle': 'Lege einen PIN für den Admin-Bereich fest', 'login.title': 'Admin-Bereich', 'login.subtitle': 'PIN eingeben um fortzufahren', 'login.newPin': 'Neuer PIN (min. 4 Zeichen)', 'login.pin': 'PIN', 'login.pinConfirm': 'PIN bestätigen', 'login.setPin': 'PIN setzen & einloggen', 'login.login': 'Einloggen', 'login.back': 'Zurück zum Dashboard', 'login.tooShort': 'Mindestens 4 Zeichen', 'login.mismatch': 'PINs stimmen nicht überein', 'login.wrong': 'Falscher PIN', // ── Theme ───────────────────────────────────────────────────────────────────── 'theme.title': 'Theme & CSS', 'theme.subtitle': 'Globales Design für Frontend', 'theme.preset.title': 'Theme-Preset', 'theme.preset.active': 'Aktiv ✓', 'theme.preset.desc': 'Ein Preset setzt alle Design-Variablen auf einmal: Seiten- und Karten-Hintergründe, Rahmen, Schatten, Eckenradius, Textfarben sowie die Akzentfarben (Blau/Grün/Gelb/Rot) der Widgets. Die farbigen Punkte zeigen die Karten- und Akzentfarben des jeweiligen Themes. Nach der Auswahl eines Presets kannst du einzelne Variablen unten weiter anpassen.', 'theme.vars.title': 'CSS-Variablen anpassen', 'theme.vars.resetAll': 'Alle zurücksetzen', 'theme.vars.app': 'App', 'theme.vars.widget': 'Widget-Karte', 'theme.vars.text': 'Text', 'theme.vars.colors': 'Farben', 'theme.vars.bg': 'Hintergrund', 'theme.vars.surface': 'Oberfläche', 'theme.vars.border': 'Rahmen', 'theme.vars.borderWidth': 'Rahmenbreite', 'theme.vars.radius': 'Eckenradius', 'theme.vars.shadow': 'Schatten', 'theme.vars.primary': 'Primär', 'theme.vars.secondary': 'Sekundär', 'theme.vars.accent': 'Akzent', 'theme.vars.green': 'Grün', 'theme.vars.yellow': 'Gelb', 'theme.vars.red': 'Rot', // Element-spezifische Variablen (Issue #313) 'theme.vars.elSwitch': 'Schalter', 'theme.vars.elBlind': 'Jalousie', 'theme.vars.elHeader': 'Überschrift', 'theme.vars.elGroup': 'Widget in Gruppe', 'theme.vars.elSlider': 'Schieberegler', 'theme.vars.elButton': 'Taster', 'theme.vars.elGauge': 'Tachometer', 'theme.vars.elClimate': 'Klima', 'theme.vars.elChip': 'Chips', 'theme.vars.elBadge': 'Marker', 'theme.vars.elLight': 'Licht', 'theme.vars.elNav': 'Navigation', 'theme.vars.elOnBg': 'An-Hintergrund', 'theme.vars.elOffBg': 'Aus-Hintergrund', 'theme.vars.elThumb': 'Knopf', 'theme.vars.elIndicator': 'Anzeige', 'theme.vars.elUpColor': 'Auf-Symbol', 'theme.vars.elUpBg': 'Auf-Hintergrund', 'theme.vars.elUpBorder': 'Auf-Rahmen', 'theme.vars.elStopColor': 'Stopp-Symbol', 'theme.vars.elStopBg': 'Stopp-Hintergrund', 'theme.vars.elStopBorder': 'Stopp-Rahmen', 'theme.vars.elDownColor': 'Zu-Symbol', 'theme.vars.elDownBg': 'Zu-Hintergrund', 'theme.vars.elDownBorder': 'Zu-Rahmen', 'theme.vars.elText': 'Text', 'theme.vars.elTrack': 'Schiene', 'theme.vars.elFill': 'Füllung', 'theme.vars.elArc': 'Bogen', 'theme.vars.elHeat': 'Heizen', 'theme.vars.elCool': 'Kühlen', 'theme.vars.elActive': 'Aktiv', 'theme.vars.elOn': 'An', 'theme.vars.elOff': 'Aus', 'theme.typography.title': 'Typografie', 'theme.typography.subtitle': 'Skaliert alle Textgrößen im Frontend proportional. Die Admin-Oberfläche bleibt unverändert.', 'theme.typography.fontSize': 'Schriftgröße', 'theme.typography.reference': 'Größen-Referenz bei {percent} %', 'theme.typography.example': 'Beispiel', 'theme.typography.reset': 'Zurücksetzen (100 %)', 'theme.typography.value': 'Wert / Uhr', 'theme.typography.heading': 'Überschrift', 'theme.typography.subheading': 'Subheading', 'theme.typography.body': 'Fließtext', 'theme.typography.small': 'Klein / Label', 'theme.layout.title': 'Layout & Abstände', 'theme.layout.gap': 'Abstand zwischen Widgets', 'theme.layout.padding': 'Innenabstand der Widgets', 'theme.css.title': 'Globales CSS', 'theme.css.subtitle': 'Wird direkt auf das Frontend angewendet. CSS-Variablen, Animationen, Font-Overrides etc.', 'theme.css.lines': '{count} Zeilen', 'theme.css.empty': 'Kein Custom CSS', 'theme.css.enabled': 'CSS aktiv', 'theme.css.inEditor': 'Auch im Dashboard-Editor anwenden', 'theme.js.title': 'Globales JavaScript', 'theme.js.subtitle': "Helfer-Funktionen für Widget-onClick. API: window.aura.setState / getState / subscribeState / getObject / getObjectView / sendTo. Externe Scripts via @import url('…'); am Anfang einbinden.", 'theme.js.warning': '⚠ Script läuft mit deinen Frontend-Berechtigungen und kann alle ioBroker-Datenpunkte lesen und schreiben. Nur eigenen, vertrauten Code einfügen.', 'theme.js.lines': '{count} Zeilen', 'theme.js.empty': 'Kein Custom JS', 'theme.js.enabled': 'JS aktiv', 'theme.js.inEditor': 'Auch im Dashboard-Editor ausführen', 'theme.js.importHint': '💡 Reihenfolge: zuerst alle @import-Zeilen ganz oben, danach dein JS-Code (function, const, …). @import zwischen Code-Zeilen wird als Syntaxfehler interpretiert.', 'cssjs.title': 'CSS & JS', 'cssjs.subtitle': 'Eigenes CSS und JavaScript global oder pro Layout einbinden.', 'cssjs.tab.css': 'Custom CSS', 'cssjs.tab.js': 'Custom JS', // ── Widgets page ────────────────────────────────────────────────────────────── 'widgets.fromIoBroker': 'Aus ioBroker wählen', 'widgets.close': 'Schließen', 'widgets.edit': 'Bearbeiten', 'widgets.openInEditor': 'Im Dashboard-Editor öffnen', 'widgets.delete': 'Löschen', 'widgets.noneSelected': 'Nichts ausgewählt', 'widgets.resetDefault': 'Auf Standard zurücksetzen', 'widgets.title': 'Widget-Verwaltung', 'widgets.subtitle': '{widgets} Widgets · {tabs} Tabs', 'widgets.search': 'Widgets suchen (Name, Datenpunkt, Tab, Typ)…', 'widgets.import': 'Importieren', 'widgets.noTitle': 'Kein Titel', 'widgets.noWidgets': 'Keine Widgets vorhanden', 'widgets.noWidgetsHint': 'Erstelle Widgets im Dashboard-Editor oder hier.', 'widgets.createFirst': 'Erstes Widget erstellen', 'widgets.noResults': 'Keine Widgets gefunden für „{search}“', 'widgets.groups': 'Gruppen', 'widgets.groupsSection': 'Gruppen & Datenpunkte', 'widgets.newGroup': 'Neue Gruppe', 'widgets.groupPlaceholder': 'Gruppenname, z.B. Alle Lichter', 'widgets.noGroupsHint': 'Noch keine Gruppen – erstelle eine, um Datenpunkte zusammenzufassen.', 'widgets.defaultSizes': 'Standard-Größen', 'widgets.defaultSizesHint': 'Breite × Höhe in Grid-Einheiten beim Erstellen neuer Widgets', 'widgets.targetTab': 'Ziel-Tab', 'widgets.calendarHint': 'Kalender-Widget bitte über den Dashboard-Editor erstellen (iCal-URL erforderlich).', 'widgets.copyTarget': 'Ziel:', // ── Editor ──────────────────────────────────────────────────────────────────── 'editor.dockedMenuPreview.hint': 'Das Bereichs-Menü ist als feste Seitenleiste angedockt und belegt diesen Bereich im Frontend. Es wird hier angezeigt, damit die Designfläche übereinstimmt.', 'editor.dockedMenuPreview.link': 'Menü-Einstellung ändern', 'editor.manual.title': 'Widget manuell hinzufügen', 'editor.manual.template': 'Schnellauswahl', 'editor.manual.type': 'Typ', 'editor.manual.titleField': 'Titel', 'editor.manual.icalUrl': 'iCal-URL *', 'editor.manual.calName': 'Kalender-Name', 'editor.manual.moreCalendars': 'Weitere Kalender nach dem Hinzufügen im Widget-Editor ergänzen.', 'editor.manual.group': 'Gruppe *', 'editor.manual.noGroups': 'Keine Gruppen vorhanden – zuerst unter "Endpunkte" anlegen', 'editor.manual.selectGroup': '– Gruppe wählen –', 'editor.manual.datapointId': 'Datenpunkt-ID (optional)', 'editor.manual.unit': 'Einheit (optional)', 'editor.manual.add': 'Hinzufügen', 'editor.manual.cancel': 'Abbruch', 'editor.manual.recentlyUsed': 'Zuletzt verwendet', 'editor.tab.addDevice': '+ Geräte', 'editor.tab.addManual': '+ Manuell', 'editor.tab.addTab': '+ Tab', 'editor.tab.noWidgets': 'Kein Tab ausgewählt oder Tab leer.', 'editor.layouts.standard': 'Standard', 'editor.layouts.default': 'Standard', 'editor.layouts.card': 'Karte', 'editor.layouts.compact': 'Kompakt', 'editor.layouts.minimal': 'Minimal', 'editor.layouts.agenda': 'Agenda', 'editor.layouts.custom': 'Custom', 'editor.mobile.title': 'Mobile-Reihenfolge', 'editor.peekHint': 'Strg+Alt halten = Vorschau ohne Bearbeiten-Buttons', 'editor.mobile.top': 'Oben', 'editor.mobile.bottom': 'Unten', 'editor.mobile.hidden': 'Versteckt', 'editor.tabMgmt.title': 'Tab-Verwaltung', 'editor.tabMgmt.settings': 'Tab-Einstellungen', 'editor.tabMgmt.name': 'Name', 'editor.tabMgmt.hideLabel': 'Beschriftung ausblenden', 'editor.tabMgmt.disabled': 'Tab deaktiviert', 'editor.tabMgmt.hidden': 'Aus Tab-Leiste ausblenden', 'editor.tabMgmt.conditions': 'Bedingungen', 'editor.tabMgmt.icon': 'Icon', 'editor.tabMgmt.slug': 'URL-Slug', 'editor.tabMgmt.slugTaken': 'Bereits vergeben', 'editor.tabMgmt.selectIcon': 'Icon auswählen…', 'editor.tabMgmt.remove': 'Entfernen', 'editor.tabMgmt.delete': 'Tab löschen', // ── WidgetFrame menu & edit modal ───────────────────────────────────────────── 'wf.menu.edit': 'Bearbeiten', 'wf.menu.conditions': 'Bedingungen', 'wf.menu.badges': 'Marker', 'wf.menu.export': 'Exportieren', 'wf.menu.saveAsPreset': 'Als Vorlage speichern', 'preset.save.title': 'Als Widget-Vorlage speichern', 'preset.save.subtitle': 'Speichert dieses Widget als wiederverwendbare Vorlage im Widget-Designer.', 'preset.save.name': 'Name', 'preset.save.icon': 'Symbol', 'preset.save.category': 'Kategorie', 'preset.save.categoryNone': 'Keine', 'preset.save.submit': 'Speichern', 'preset.save.saved': 'Gespeichert ✓', 'preset.mine': 'Meine Vorlagen', 'preset.insert.title': 'Datenpunkte zuordnen', 'preset.insert.subtitle': 'Diese Vorlage benötigt folgende Datenpunkte:', 'preset.insert.autoNote': 'Batterie-/Status-Datenpunkte werden automatisch aus Geschwistern erkannt.', 'preset.insert.submit': 'Einfügen', 'preset.insert.noSlots': 'Diese Vorlage benötigt keine Datenpunkte.', 'widgetDesigner.title': 'Widget-Designer', 'widgetDesigner.subtitle': 'Eigene Widget-Vorlagen verwalten, teilen und wiederverwenden.', 'widgetDesigner.empty': 'Noch keine Vorlagen. Speichere ein Widget über das Widget-Menü „Als Vorlage speichern“.', 'widgetDesigner.import': 'Importieren', 'widgetDesigner.importError': 'Import fehlgeschlagen – ungültige Datei', 'widgetDesigner.edit': 'Bearbeiten', 'preset.edit.save': 'Übernehmen', 'widgetDesigner.export': 'Exportieren', 'widgetDesigner.rename': 'Umbenennen', 'widgetDesigner.delete': 'Löschen', 'widgetDesigner.deleteConfirm': 'Diese Vorlage löschen?', 'widgetDesigner.count': '{count} Vorlagen', 'wf.menu.copy': 'Kopieren', 'wf.menu.copyHere': 'Hier duplizieren', 'wf.menu.duplicateInGroup': 'In Gruppe duplizieren', 'wf.menu.dragToGroup': 'In Gruppe ziehen', 'wf.menu.dragOutOfGroup': 'Aus Gruppe herausziehen', 'wf.menu.move': 'Verschieben', 'wf.menu.popupViews': 'Popup-Views', 'wf.menu.delete': 'Löschen', 'wf.menu.confirm': 'Bestätigen', 'wf.menu.hidden': 'Versteckt', 'wf.menu.options': 'Widget-Optionen', 'wf.menu.clickAction': 'Klick-Aktion', 'wf.edit.title': 'Widget bearbeiten', 'wf.edit.name': 'Name', 'wf.edit.hideName': 'Name ausblenden', 'wf.edit.titlePosition': 'Titel-Position', 'wf.edit.showLastChange': 'Letzte Änderung anzeigen', 'wf.edit.group.autoShrink': 'Bei versteckten Widgets schrumpfen', 'wf.edit.group.autoShrinkHint': 'Sind Kind-Widgets per Bedingung ausgeblendet, verkleinert sich die Gruppe auf die sichtbaren Inhalte (nur im Frontend).', 'wf.edit.group.defaultCollapsed': 'Standardmäßig eingeklappt', 'wf.edit.group.defaultCollapsedHint': 'Die Gruppe zeigt zunächst nur ihre Kopfzeile; ein Klick darauf klappt die Inhalte aus (nur im Frontend).', 'wf.edit.group.mobileKeepGrid': 'Raster auf dem Smartphone beibehalten', 'wf.edit.group.mobileKeepGridHint': 'Standardmäßig werden Widgets auf dem Smartphone untereinander gestapelt. Aktiviert bleibt die nebeneinander-Anordnung wie in der normalen Ansicht erhalten, nur verkleinert.', 'wf.edit.position': 'Position', 'wf.edit.posLeft': 'Links', 'wf.edit.posCenter': 'Mitte', 'wf.edit.posRight': 'Rechts', 'wf.edit.style': 'Stil', 'wf.edit.styleReset': 'Zurücksetzen', 'wf.edit.widgetType': 'Widget-Typ', 'wf.edit.layout': 'Layout', 'wf.edit.icon': 'Icon', 'wf.edit.datapointId': 'Datenpunkt-ID', 'wf.edit.jsonPath': 'JSON-Pfad (optional)', 'wf.edit.jsonPathHint': 'z. B. soc oder devices.0.soc', 'wf.edit.jsonPathDesc': 'Liest einen verschachtelten Wert aus einem Objekt-/JSON-State.', 'wf.edit.jsonPathClear': 'Pfad löschen', 'wf.edit.fromIoBroker': 'Aus ioBroker wählen', 'wf.edit.unit': 'Einheit', 'wf.edit.conditions': 'Bedingungen', 'wf.dpTypeMismatch.title': 'Widget-Typ ändern?', 'wf.dpTypeMismatch.message': 'Der gewählte Datenpunkt passt eher zu „{suggested}“. Aktueller Widget-Typ: „{current}“.', 'wf.dpTypeMismatch.switch': 'Auf „{suggested}“ umschalten', 'wf.dpTypeMismatch.keep': 'Bei „{current}“ bleiben', 'wf.edit.style.bg': 'Hintergrund', 'wf.edit.style.border': 'Rahmenfarbe', 'wf.edit.style.borderWidth': 'Rahmenbreite', 'wf.edit.style.accent': 'Akzentfarbe', 'wf.edit.style.text': 'Text', 'wf.edit.style.textSec': 'Text sekundär', 'wf.edit.style.radius': 'Eckenradius', 'wf.edit.header.subtitle': 'Untertitel (optional)', 'wf.edit.header.style': 'Stil', 'wf.edit.header.default': 'Standard (Akzentlinie + Titel)', 'wf.edit.header.compact': 'Kompakt (Linie links)', 'wf.edit.header.minimal': 'Minimal (Trennlinie + Text)', 'wf.edit.layout.standard': 'Standard', 'wf.edit.layout.card': 'Karte', 'wf.edit.layout.compact': 'Kompakt', 'wf.edit.layout.minimal': 'Minimal', 'wf.edit.layout.agenda': 'Agenda', // Clock config 'wf.clock.display': 'Anzeige', 'wf.clock.timeOnly': 'Nur Uhrzeit', 'wf.clock.datetime': 'Uhrzeit + Datum', 'wf.clock.dateOnly': 'Nur Datum', 'wf.clock.showSeconds': 'Sekunden anzeigen', 'wf.clock.dateFormat': 'Datumsformat', 'wf.clock.short': 'Kurz (07.04.2026)', 'wf.clock.long': 'Lang (Montag, 7. April 2026)', 'wf.clock.customFormat': 'Eigenes Format', 'wf.clock.timeFontSize': 'Schriftgröße Uhrzeit (px)', 'wf.clock.dateFontSize': 'Schriftgröße Datum (px)', 'wf.clock.customFontSize': 'Schriftgröße eig. Format (px)', 'wf.clock.fontSizeAuto': 'auto', 'wf.clock.showWeek': 'Kalenderwoche anzeigen', 'wf.clock.showCity': 'Ort anzeigen', 'wf.clock.showSunrise': 'Sonnenaufgang anzeigen', 'wf.clock.showSunset': 'Sonnenuntergang anzeigen', 'wf.clock.extrasFontSize': 'Schriftgröße Zusatzinfo (px)', 'wf.value.fontSize': 'Schriftgröße Wert (px)', // History (chart) 'wf.history.title': 'Verlaufsdaten', 'wf.history.checking': 'Prüfe Adapter…', 'wf.history.noAdapter': 'Kein History-Adapter aktiv für diesen Datenpunkt.', 'wf.history.instance': 'Adapter-Instanz', 'wf.history.liveData': '– Live-Daten (kein Verlauf) –', 'wf.history.timeRange': 'Zeitraum', 'wf.history.lockRange': 'Zeitraum sperren (Wechsler im Frontend ausblenden)', 'wf.history.showYAxis': 'Y-Achse anzeigen', 'wf.history.yAxisCompact': 'Kompakt (7000 → 7K)', 'wf.history.showXAxis': 'X-Achse anzeigen', // Calendar config 'wf.cal.addCalendar': 'Kalender hinzufügen', 'wf.cal.calUrl': 'iCal-URL…', 'wf.cal.calName': 'Name (optional)', 'wf.cal.changeColor': 'Farbe ändern', 'wf.cal.showName': 'Name anzeigen', 'wf.cal.add': 'Hinzufügen', 'wf.cal.refreshInterval': 'Aktualisierungsintervall', 'wf.cal.daysAhead': 'Tage im Voraus', 'wf.cal.maxEntries': 'Max. Einträge', // Gauge config 'wf.gauge.strokeWidth': 'Bogenbreite', 'wf.gauge.minStatic': 'Min (statisch)', 'wf.gauge.maxStatic': 'Max (statisch)', 'wf.gauge.minDynamic': 'Min-Datenpunkt (dynamisch)', 'wf.gauge.maxDynamic': 'Max-Datenpunkt (dynamisch)', 'wf.gauge.dynamicMax': 'Dynamisches Maximum', 'wf.gauge.dynamicMaxHint': 'Max automatisch auf aktuellen Wert ausweiten', 'wf.gauge.unit': 'Einheit', 'wf.gauge.decimals': 'Dezimalstellen', 'wf.gauge.colorZones': 'Farbzonen', 'wf.gauge.greenTo': 'Grün bis', 'wf.gauge.yellowTo': 'Gelb bis', 'wf.gauge.showMinMax': 'Min/Max anzeigen', // Thermostat config 'wf.thermo.actualDp': 'Ist-Temperatur Datenpunkt', 'wf.thermo.minTemp': 'Min °C', 'wf.thermo.maxTemp': 'Max °C', 'wf.thermo.step': 'Schrittweite', 'wf.thermo.presets': 'Schnellwahl (mit ; getrennt)', // Group config 'wf.group.transparent': 'Transparenz-Modus', 'wf.group.transparentHint': 'Hintergrund, Rahmen und Schatten entfernen', // Weather config 'wf.weather.dataSource': 'Datenquelle', 'wf.weather.dsOnline': 'Online', 'wf.weather.dsAdapter': 'ioBroker Adapter', 'wf.weather.dsOnlineHint': 'Daten direkt von api.open-meteo.com (Internet erforderlich)', 'wf.weather.dsAdapterHint': 'Daten vom installierten open-meteo-weather Adapter (offlinefähig)', 'wf.weather.adapterPath': 'Adapter-Standort', 'wf.weather.adapterPathHint': 'z.B. open-meteo-weather.0.Berlin — beliebigen Sub-DP wählen, der Pfad wird automatisch gekürzt', 'wf.weather.customSection': 'Custom-Layout: Vorhersage-Balken', 'wf.weather.barFontSize': 'Schriftgröße Min/Max (rem)', 'wf.weather.barFontSizeHint': 'Steuert die Schriftgröße der Min/Max-Werte neben dem Temperaturbalken (tempBar-Zellen)', 'wf.weather.barHeight': 'Balkenhöhe (rem)', 'wf.weather.barHeightHint': 'Dicke des Temperaturbalkens (tempBar / tempBarOnly-Zellen)', 'wf.weather.locationSearch': 'Standort suchen', 'wf.weather.cityPlaceholder': 'Stadt oder Adresse eingeben', 'wf.weather.search': 'Suchen', 'wf.weather.searching': '…', 'wf.weather.notFound': 'Kein Ort gefunden', 'wf.weather.searchError': 'Fehler bei der Suche', 'wf.weather.latitude': 'Breitengrad', 'wf.weather.longitude': 'Längengrad', 'wf.weather.locationName': 'Standortname', 'wf.weather.locationPh': 'z.B. München', 'wf.weather.refreshMin': 'Aktualisierung (Min.)', 'wf.weather.showWeather': 'Wetterdaten anzeigen', 'wf.weather.showForecast': 'Vorhersage anzeigen', 'wf.weather.forecastDays': 'Vorhersagetage', 'wf.weather.showToday': 'Heutigen Tag anzeigen', 'wf.weather.localTemp': 'Eigener Temperaturfühler (Datenpunkt)', 'wf.weather.localTempPh': 'z.B. hm-rpc.0.xxx.TEMPERATURE', 'wf.weather.showWarnings': 'Wetterwarnungen anzeigen (DWD)', 'wf.weather.warningsHint': 'Benötigt Breitengrad + Längengrad • Nur Deutschland', 'wf.weather.warningsScale': 'Größe der Warnungen', 'wf.weather.warningsScaleHint': '1 = Standard. >1 vergrößert die Warnungen separat.', 'wf.weather.showRainProb': 'Regenwahrscheinlichkeit anzeigen', 'wf.weather.showRainAmount': 'Regenmenge (mm) anzeigen', 'wf.weather.showCloudCover': 'Bewölkung anzeigen', 'wf.weather.tempThresholds': 'Temperatur-Farbskala (Balken)', 'wf.weather.tempThresholdsAdd': 'Hinzufügen', 'wf.weather.tempThresholdsPreset': 'Standard', 'wf.weather.tempThresholdsFrom': 'ab', 'wf.weather.tempThresholdsHint': 'Ab Temperatur → Farbe · aufsteigend sortieren', 'wf.weather.tempThresholdsEmpty': 'Keine Farbschwellen konfiguriert', 'wf.weather.showCondition': 'Wetterbeschreibung anzeigen', 'wf.weather.showHumidityLabel': 'Wort „Luftfeuchtigkeit“ anzeigen', 'wf.weather.feelsLikeStyle': '„Gefühlt“ Darstellung', 'wf.weather.feelsLikeStyleText': 'Text („Gefühlt …“)', 'wf.weather.feelsLikeStyleIcon': 'Icon (🌡️ …)', 'wf.weather.feelsLikeStyleHidden': 'Nur Wert', 'wf.weather.tempFontSize': 'Schriftgröße Temperatur (rem)', 'wf.weather.tempFontSizeHint': '0 = wie Beschreibung. Größer = prominent.', 'wf.weather.fontScale': 'Schriftgröße Widget (Faktor)', 'wf.weather.fontScaleHint': '1 = automatisch. >1 vergrößert alle Texte.', 'wf.weather.forecastRowGap': 'Zeilenabstand Vorhersage (rem)', 'wf.weather.forecastRowGapHint': '0 = Standard. Größer = mehr Luft zwischen Tagen.', 'wf.weather.forecastWrap': 'Vorhersage zweizeilig (Zeilenumbruch)', // Camera config 'wf.camera.streamUrl': 'Stream-URL', 'wf.camera.refresh': 'Aktualisierung (Sek., 0 = MJPEG)', 'wf.camera.fitMode': 'Bildanpassung', 'wf.camera.cover': 'Cover (ausfüllen)', 'wf.camera.contain': 'Contain (einpassen)', 'wf.camera.timestamp': 'Zeitstempel anzeigen', // ── Last-change timestamps ──────────────────────────────────────────────────── 'lc.lessThan10s': 'vor weniger als 10 Sek. aktualisiert', 'lc.lessThan20s': 'vor weniger als 20 Sek. aktualisiert', 'lc.lessThan30s': 'vor weniger als 30 Sek. aktualisiert', 'lc.halfMinute': 'vor einer halben Minute', 'lc.lessThan1Min': 'vor weniger als 1 Minute', 'lc.1Min': 'vor einer Minute', 'lc.nMin': 'vor etwa {n} Minuten', 'lc.1Hour': 'vor etwa einer Stunde', 'lc.nHours': 'vor etwa {n} Stunden', 'lc.1Day': 'vor etwa einem Tag', 'lc.nDays': 'vor {n} Tagen', 'lc.1Month': 'vor etwa einem Monat', 'lc.nMonths': 'vor {n} Monaten', 'lc.1Year': 'vor etwa einem Jahr', 'lc.nYears': 'vor {n} Jahren', // ── TabBar ──────────────────────────────────────────────────────────────────── 'tabBar.settings': 'Tab-Einstellungen', 'tabBar.name': 'Name', 'tabBar.hideLabel': 'Beschriftung ausblenden', 'tabBar.disabled': 'Tab deaktiviert', 'tabBar.hidden': 'Aus Tab-Leiste ausblenden', 'tabBar.conditions': 'Bedingungen', 'tabBar.badges': 'Marker', 'tabBar.hideTabOnCond': 'Tab verbergen wenn Bedingung zutrifft', 'tabBar.icon': 'Icon', 'tabBar.selectIcon': 'Icon auswählen…', 'tabBar.remove': 'Entfernen', 'tabBar.addTab': '+ Tab', 'tabBar.exportTab': 'Tab exportieren', 'tabBar.moveTitle': 'In Bereich verschieben / kopieren', 'tabBar.moveTargetPlaceholder': 'Zielbereich wählen…', 'tabBar.moveCurrentSuffix': 'aktuell', 'tabBar.move': 'Verschieben', 'tabBar.copy': 'Kopieren', 'tabBar.importTab': 'Tab importieren', 'tabBar.importInvalidFile': 'Ungültige Tab-Datei', // ── Frontend Dashboard ──────────────────────────────────────────────────────── 'frontend.noWidgets': 'Keine Widgets konfiguriert.', 'frontend.addWidgets': 'Noch keine Widgets – über "+ Geräte" hinzufügen.', // ── DatapointPicker ─────────────────────────────────────────────────────────── 'dp.picker.title': 'Datenpunkt wählen', 'dp.picker.refresh': 'Aktualisieren', 'dp.picker.search': 'ID oder Name suchen…', 'dp.picker.allAdapters': 'Alle Adapter', 'dp.picker.allRooms': 'Alle Räume', 'dp.picker.allFuncs': 'Alle Funktionen', 'dp.picker.allRoles': 'Alle Rollen', 'dp.picker.allTypes': 'Alle Typen', 'dp.picker.typeHint': 'Nur {type}', 'dp.picker.loading': 'Lade Datenpunkte…', 'dp.picker.showing': '{max} von {count} angezeigt', 'dp.picker.count': '{count} Datenpunkte', 'dp.picker.noResults': 'Keine Ergebnisse', 'dp.picker.allUnits': 'Alle Einheiten', 'dp.picker.historyOnly': 'Mit History', 'dp.picker.showInactive': 'Inaktive anzeigen', 'dp.picker.showInactiveHint': 'Auch States von deaktivierten/deinstallierten Adaptern sowie verwaiste oder importierte States anzeigen', 'dp.picker.col.name': 'Name / ID', 'dp.picker.col.value': 'Wert', 'dp.picker.col.unit': 'Einheit', 'dp.picker.col.type': 'Typ', 'dp.picker.col.history': 'History', // ── File Picker ────────────────────────────────────────────────────────────── 'fs.picker.title': 'Datei-Picker', 'fs.picker.tab.dp': 'Datenpunkt', 'fs.picker.tab.files': 'Dateien', 'fs.picker.search': 'Suchen…', 'fs.picker.empty': 'Verzeichnis ist leer', 'fs.picker.previewNone': 'Keine Vorschau', 'fs.picker.noRoots': 'Keine Verzeichnisse konfiguriert', 'fs.picker.roots': 'Wurzeln', 'fs.picker.select': 'Auswählen', // ── ConditionEditor ─────────────────────────────────────────────────────────── 'cond.equal': '= Gleich', 'cond.notEqual': '≠ Ungleich', 'cond.greater': '> Größer', 'cond.greaterEq': '≥ Größer/gleich', 'cond.less': '< Kleiner', 'cond.lessEq': '≤ Kleiner/gleich', 'cond.contains': '∋ Enthält', 'cond.isTrue': '✓ Ist wahr', 'cond.isFalse': '✗ Ist falsch', 'cond.colorAccent': 'Akzent', 'cond.colorBg': 'Hintergrund', 'cond.colorBorder': 'Rahmen', 'cond.colorText': 'Text', 'cond.colorText2': 'Text 2', 'cond.when': 'WENN', 'cond.datapointId': 'Datenpunkt-ID', 'cond.fromIoBroker': 'Aus ioBroker wählen', 'cond.value': 'Wert', 'cond.toStatic': 'Auf festen Wert umschalten', 'cond.toDatapoint': 'Mit Datenpunkt vergleichen', 'cond.removeClause': 'Klausel entfernen', 'cond.addClause': 'Klausel hinzufügen', 'cond.activeStyle': 'Stil wenn aktiv', 'cond.effect': 'Effekt', 'cond.noEffect': 'Kein Effekt', 'cond.pulse': 'Pulsieren', 'cond.blink': 'Blinken', 'cond.hideWidget': 'Widget verstecken', 'cond.hideWidgetHint': 'Widget wird unsichtbar wenn Bedingung erfüllt ist', 'cond.controlVisibility': 'Sichtbarkeit steuern', 'cond.controlVisibilityHint': 'Widget je nach Bedingung ein- oder ausblenden', 'cond.controlTabVisibility': 'Sichtbarkeit steuern', 'cond.controlTabVisibilityHint': 'Tab je nach Bedingung ein- oder ausblenden', 'cond.mode': 'Modus', 'cond.hideOnMatch': 'Verstecken bei Treffer', 'cond.showOnMatch': 'Anzeigen bei Treffer', 'cond.hideOnMatchHint': 'Widget ist sichtbar und verschwindet, sobald die Bedingung erfüllt ist', 'cond.showOnMatchHint': 'Widget ist versteckt und erscheint nur, wenn die Bedingung erfüllt ist', 'cond.hideOnMatchTabHint': 'Tab ist sichtbar und verschwindet, sobald die Bedingung erfüllt ist', 'cond.showOnMatchTabHint': 'Tab ist versteckt und erscheint nur, wenn die Bedingung erfüllt ist', 'cond.pushOthers': 'Andere Widgets hochschieben', 'cond.pushOthersHint': 'Widget wird aus dem Raster entfernt, andere füllen den Platz', 'cond.rules': 'Bedingungsregeln', 'cond.rulesHint': 'Farben ändern sich wenn Bedingungen erfüllt sind', 'cond.noRules': 'Noch keine Regeln. Erstelle eine Regel um loszulegen.', 'cond.newRule': 'Neue Regel', // ── Marker ─────────────────────────────────────────────────────────────────── 'badge.rules': 'Marker', 'badge.rulesHint': 'Kleine Indikatoren am Rand des Elements', 'badge.noRules': 'Noch keine Marker. Füge einen hinzu um loszulegen.', 'badge.newRule': 'Neuer Marker', 'badge.style': 'Stil', 'badge.styleDot': 'Punkt', 'badge.styleCount': 'Anzahl (Datenpunkt)', 'badge.styleLabel': 'Label', 'badge.corner': 'Ecke', 'badge.cornerTL': 'Oben links', 'badge.cornerTR': 'Oben rechts', 'badge.cornerBL': 'Unten links', 'badge.cornerBR': 'Unten rechts', 'badge.sizePx': 'Größe (px)', 'badge.color': 'Farbe', 'badge.datapoint': 'Datenpunkt', 'badge.label': 'Text', 'badge.icon': 'Icon', 'badge.visibility': 'Sichtbar', 'badge.visAlways': 'Immer', 'badge.visNonzero': 'Wenn Wert > 0', 'badge.visNonzeroHint': 'Sichtbar solange der Datenpunkt aktiv ist (> 0, true oder nicht leer)', 'badge.visCondition': 'Wenn Bedingung erfüllt', 'badge.tabAggregate': 'Aggregat-Anzahl', 'badge.tabAggregateHint': 'Zeigt, wie viele Widgets in diesem Tab gerade einen Marker haben', 'badge.sectionAggregate': 'Aggregat-Anzahl', 'badge.sectionAggregateHint': 'Zeigt, wie viele Widgets über alle Tabs des Bereichs gerade einen Marker haben', // ── EChartConfig ───────────────────────────────────────────────────────────── 'echart.deleteSeries': 'Serie löschen', 'echart.line': 'Linie', 'echart.area': 'Fläche', 'echart.bar': 'Balken', 'echart.scatter': 'Punkte', 'echart.series': 'Serien', 'echart.addSeries': 'Serie hinzufügen', 'echart.noSeries': 'Noch keine Serien. Klicke "Serie hinzufügen".', 'echart.name': 'Name', 'echart.datapoint': 'Datenpunkt', 'echart.dpPlaceholder': 'z.B. hm-rpc.0....', 'echart.fromIoBroker': 'Aus ioBroker wählen', 'echart.chartType': 'Diagrammtyp', 'echart.color': 'Farbe', 'echart.yAxis': 'Y-Achse', 'echart.yLeft': 'Links', 'echart.yRight': 'Rechts', 'echart.smooth': 'Glatt', 'echart.lineWidth': 'Linienstärke: {value}px', 'echart.history': 'Verlaufsdaten', 'echart.selectDpFirst': 'Erst Datenpunkt wählen.', 'echart.checking': 'Prüfe Adapter…', 'echart.detect': 'Adapter erkennen', 'echart.noAdapter': 'Kein History-Adapter aktiv.', 'echart.instance': 'Adapter-Instanz', 'echart.liveData': '– Live-Daten –', 'echart.timeRange': 'Zeitraum', 'echart.globalSettings': 'Globale Einstellungen', 'echart.showLegend': 'Legende anzeigen', 'echart.yAxisLeft': 'Y-Achse links', 'echart.unitLeft': 'Einheit (z.B. °C)', 'echart.min': 'Min', 'echart.max': 'Max', 'echart.yAxisRight': 'Y-Achse rechts', 'echart.unitRight': 'Einheit (z.B. %)', 'echart.jsonOverride': 'JSON-Override', 'echart.jsonOverrideHint': 'Wird mit der auto-generierten ECharts-Option zusammengeführt (deep merge). Arrays werden ersetzt.', 'echart.active': 'aktiv', 'echart.mode': 'Modus', 'echart.modeTimeseries': 'Zeitreihe', 'echart.modeComparison': 'Vergleich', 'echart.aggregation': 'Aggregation', 'echart.aggAverage': 'Durchschnitt (Standard)', 'echart.aggMinmax': 'Min/Max (echte Extremwerte — z.B. Regenzähler)', 'echart.aggMax': 'Maximum', 'echart.aggMin': 'Minimum', 'echart.aggTotal': 'Summe', 'echart.visibleRanges': 'Sichtbare Zeitbereiche im Frontend', 'echart.dayNavToggle': 'Tages-Navigation im Frontend (◀ Heute ▶)', 'echart.today': 'Heute', 'echart.dayPrevTitle': 'Einen Tag zurück', 'echart.dayTodayTitle': 'Zum aktuellen Tag', 'echart.dayNextTitle': 'Einen Tag vor', 'echart.dateLocale': 'de-DE', 'echart.moveUp': 'Nach oben', 'echart.moveDown': 'Nach unten', 'echart.templateInstancePlaceholder': 'leer = Instanz des auslösenden Widgets', 'echart.templateInstanceHint': 'Platzhalter-Datenpunkt – leer lassen, um die Verlaufs-Instanz vom auslösenden Widget zu übernehmen.', 'echart.showYAxis': 'Y-Achse anzeigen', 'echart.showXAxis': 'X-Achse anzeigen', 'echart.gridLines': 'Horizontale Linien', 'echart.showCurrentValue': 'Aktuellen Wert anzeigen', 'echart.unitHoursShort': 'Std', 'echart.unitDaysShort': 'Tage', 'echart.daySingular': 'Tag', 'echart.dayPlural': 'Tage', 'echart.lockRangeToggle': 'Zeitraum im Frontend sperren', 'echart.decimals': 'Dezimalstellen (Tooltip)', 'echart.globalActive': 'Globale Einstellung aktiv – klicken für eigenen Wert', 'echart.resetToGlobal': 'Auf globale Einstellung zurücksetzen', 'echart.noData': 'Keine Daten', 'echart.preview': 'Vorschau', 'echart.historyInstance': 'Verlaufs-Instanz', // ── Device Wizard ───────────────────────────────────────────────────────────── 'wizard.device.title': 'Geräte aus ioBroker', 'wizard.device.loading': 'Lade Geräte…', 'wizard.device.hint': 'Alle verfügbaren Geräte und Datenpunkte laden', 'wizard.device.load': 'Geräte laden', 'wizard.device.search': 'Suchen…', 'wizard.device.allAdapters': 'Alle Adapter', 'wizard.device.allRooms': 'Alle Räume', 'wizard.device.allFuncs': 'Alle Funktionen', 'wizard.device.allRoles': 'Alle Rollen', 'wizard.device.devices': 'Geräte', 'wizard.device.noneSelected': 'Keine ausgewählt', 'wizard.device.widget': 'Widget', 'wizard.device.widgets': 'Widgets', 'wizard.device.cancel': 'Abbruch', 'wizard.device.add': 'Zum Dashboard hinzufügen', 'wizard.device.tempDp': 'Ist-Temperatur Datenpunkt (optional)', // ── Tab Wizard ──────────────────────────────────────────────────────────────── 'wizard.tab.title': 'Tab-Wizard', 'wizard.tab.selectTheme': 'Wähle ein Thema für den neuen Tab.', 'wizard.tab.themeAll': 'Alle Datenpunkte', 'wizard.tab.themeAllHint': 'Alle verfügbaren Datenpunkte aller Adapter', 'wizard.tab.themeBattery': 'Batteriestatus', 'wizard.tab.themeBatteryHint': 'Batteriestand aller Geräte im Überblick', 'wizard.tab.themeWindow': 'Fensterstatus', 'wizard.tab.themeWindowHint': 'Offen/Geschlossen-Status von Fenstern und Türen', 'wizard.tab.themePower': 'Stromverbrauch', 'wizard.tab.themePowerHint': 'Leistung und Energieverbrauch aller Geräte', 'wizard.tab.showAllDp': 'Alle Datenpunkte anzeigen', 'wizard.tab.showThemeOnly': 'Nur Thema anzeigen', 'wizard.tab.widget': 'Widget', 'wizard.tab.widgets': 'Widgets', 'wizard.tab.selectLayout': 'Layout wählen', 'wizard.tab.cancel': 'Abbrechen', 'wizard.tab.back': 'Zurück', 'wizard.tab.next': 'Weiter', 'wizard.tab.create': 'Tab erstellen', // ── Widget Registry labels ──────────────────────────────────────────────────── 'widget.switch': 'Schalter', 'widget.shutter': 'Rollladen', 'widget.dimmer': 'Dimmer', 'widget.thermostat': 'Thermostat', 'widget.value': 'Wert-Anzeige', 'widget.gauge': 'Gauge', 'widget.chart': 'Diagramm (Einfach)', 'widget.echart': 'Diagramm (Erweitert (echarts))', 'widget.echartsPreset': 'eCharts', 'widget.list': 'Statische Liste', 'widget.autolist': 'Dynamische Liste', 'widget.fill': 'Füllstandsanzeige', 'widget.windowcontact': 'Fenster-/Türkontakt', 'widget.binarysensor': 'Binärsensor', 'widget.stateimage': 'Zustandsbild', 'widget.clock': 'Uhrzeit', 'widget.weather': 'Wetter', 'widget.calendar': 'Kalender', 'widget.evcc': 'evcc', 'widget.camera': 'Kamera', 'widget.image': 'Bild', 'widget.trash': 'Müllabfuhr', 'widget.trashSchedule': 'Müllabfuhr-Zeitplan', 'widget.iframe': 'iFrame', 'widget.jsontable': 'JSON-Tabelle', 'widget.html': 'HTML', 'widget.header': 'Abschnittstitel', 'widget.group': 'Gruppe', 'widget.httpRequest': 'HTTP-Aktion', 'widget.button': 'Button', 'widget.climate': 'Raumklima', 'widget.enum': 'Auswahlfeld', 'widget.carousel': 'Karussell', 'widget.input': 'Eingabefeld', 'widget.map': 'Karte', 'widget.energiebilanz': 'Diagramm (Verteilung)', // ── Weather Widget ──────────────────────────────────────────────────────────── 'weather.sunny': 'Sonnig', 'weather.mainlyClear': 'Überwiegend klar', 'weather.partlyCloudy': 'Leicht bewölkt', 'weather.cloudy': 'Bewölkt', 'weather.overcast': 'Bedeckt', 'weather.fog': 'Nebel', 'weather.drizzle': 'Nieselregen', 'weather.rain': 'Regen', 'weather.snow': 'Schnee', 'weather.showers': 'Schauer', 'weather.thunderstorm': 'Gewitter', 'weather.unknown': 'Unbekannt', 'weather.today': 'Heute', 'weather.humidity': 'Luftfeuchtigkeit', 'weather.feelsLike': 'Gefühlt {feel} · 💨 {wind} km/h', 'weather.noData': 'Wetterdaten nicht verfügbar', 'weather.warnings': 'Wetterwarnungen', 'weather.noWarnings': 'Keine Warnungen', 'weather.warnSeverity.minor': 'Gering', 'weather.warnSeverity.moderate': 'Mäßig', 'weather.warnSeverity.severe': 'Stark', 'weather.warnSeverity.extreme': 'Extrem', // ── Calendar Widget ─────────────────────────────────────────────────────────── 'calendar.title': 'Kalender', 'calendar.configure': 'Kalender konfigurieren', 'calendar.noEvents': 'Keine Termine', 'calendar.loading': 'Lädt…', 'calendar.events': 'Termine', 'calendar.today': 'Heute', 'calendar.tomorrow': 'Morgen', 'calendar.todayAt': 'Heute, {time}', 'calendar.tomorrowAt': 'Morgen, {time}', 'calendar.more': '+{count} weitere', 'calendar.updated': 'Aktualisiert: {time}', 'calendar.noDays': 'Keine Termine in den nächsten {days} Tagen', 'cal.day.0': 'So', 'cal.day.1': 'Mo', 'cal.day.2': 'Di', 'cal.day.3': 'Mi', 'cal.day.4': 'Do', 'cal.day.5': 'Fr', 'cal.day.6': 'Sa', 'cal.month.0': 'Jan', 'cal.month.1': 'Feb', 'cal.month.2': 'Mär', 'cal.month.3': 'Apr', 'cal.month.4': 'Mai', 'cal.month.5': 'Jun', 'cal.month.6': 'Jul', 'cal.month.7': 'Aug', 'cal.month.8': 'Sep', 'cal.month.9': 'Okt', 'cal.month.10': 'Nov', 'cal.month.11': 'Dez', // ── Clock Widget ────────────────────────────────────────────────────────────── 'clock.day.0': 'Sonntag', 'clock.day.1': 'Montag', 'clock.day.2': 'Dienstag', 'clock.day.3': 'Mittwoch', 'clock.day.4': 'Donnerstag', 'clock.day.5': 'Freitag', 'clock.day.6': 'Samstag', 'clock.month.0': 'Januar', 'clock.month.1': 'Februar', 'clock.month.2': 'März', 'clock.month.3': 'April', 'clock.month.4': 'Mai', 'clock.month.5': 'Juni', 'clock.month.6': 'Juli', 'clock.month.7': 'August', 'clock.month.8': 'September', 'clock.month.9': 'Oktober', 'clock.month.10': 'November', 'clock.month.11': 'Dezember', 'clock.kw': 'KW ', // ── AutoListConfig ──────────────────────────────────────────────────────────── 'autolist.trueText': 'Text für AN / true / 1', 'autolist.falseText': 'Text für AUS / false / 0', 'autolist.idContains': 'ID enthält', 'autolist.found': '{count} gefunden · {selected} ausgewählt', 'autolist.apply': '{count} Einträge übernehmen', 'autolist.settings': 'Einstellungen', 'autolist.invalidEntry': 'ungültiger Eintrag (kein Datenpunkt) — entfernen', 'autolist.auto': 'Automatisch', 'autolist.roles': 'Rollen', 'autolist.room': 'Raum', 'autolist.func': 'Funktion', 'autolist.idPh': 'z.B. hm-rpc, shelly', 'autolist.search': 'Suchen', 'autolist.noneFound': 'Keine Datenpunkte gefunden', 'autolist.datapoints': 'Datenpunkte', 'autolist.manualPh': 'Datenpunkt-ID manuell…', 'autolist.syncMin': 'Auto-Sync (Minuten)', 'autolist.showRoom': 'Raum anzeigen', // ── ImportWidget ────────────────────────────────────────────────────────────── 'import.titleGeneral': 'Widget oder Tab importieren', 'import.title': 'Widget importieren', 'import.titleTab': 'Tab importieren', 'import.fileLabel': 'JSON-Datei laden', 'import.or': 'oder', 'import.pasteJson': 'JSON einfügen', 'import.invalidWidget': 'Kein gültiges Widget (Feld "type" fehlt)', 'import.invalidTab': 'Keine gültige Tab-Datei', 'import.tabNotSupported': 'Tab-Import hier nicht verfügbar', 'import.tabWidgetCount': '{count} Widget(s)', 'import.importTab': 'Tab importieren', // ── Export anonymisation ────────────────────────────────────────────────────── 'exportAnon.title': 'Exportieren', 'exportAnon.subtitle': 'Wähle, welche Daten beim Export anonymisiert werden. Ohne Auswahl wird alles unverändert exportiert.', 'exportAnon.selectAll': 'Alles anonymisieren', 'exportAnon.selectNone': 'Auswahl aufheben', 'exportAnon.datapoints': 'Datenpunkte', 'exportAnon.datapointsHint': 'ioBroker-IDs durch Platzhalter ersetzen (Verknüpfungen bleiben erhalten)', 'exportAnon.titles': 'Titel & Freitext', 'exportAnon.titlesHint': 'Titel, Labels und Texte (können Raum-/Personennamen enthalten)', 'exportAnon.urls': 'URLs & Zugangsdaten', 'exportAnon.urlsHint': 'Kamera-Streams, HTTP-Adressen, Links (enthalten oft Tokens)', 'exportAnon.geoAndCode': 'Geo & Custom-Code', 'exportAnon.geoAndCodeHint': 'Koordinaten sowie eigenes JavaScript/CSS entfernen', 'exportAnon.export': 'Exportieren', // ── Layout Presets (Tab Wizard) ─────────────────────────────────────────────── 'layout.compact': 'Kompakt', 'layout.compactDesc': 'Mehr Widgets auf einen Blick – kleinere Kacheln', 'layout.standard': 'Standard', 'layout.standardDesc': 'Ausgewogene Darstellung mit gut lesbaren Widgets', 'layout.spacious': 'Großzügig', 'layout.spaciousDesc': 'Große Kacheln – ideal für Wandtablets', // ── Thermostat Widget ──────────────────────────────────────────────────────── 'thermo.heating': 'Heizt', 'thermo.cooling': 'Kühlt', 'thermo.standby': 'Standby', 'thermo.setPoint': 'Soll', 'thermo.actual': 'Ist', // ── Group Widget ────────────────────────────────────────────────────────────── 'group.addWidget': 'Widget hinzufügen', 'group.mobileOrder': 'Mobile Reihenfolge', 'group.noWidgets': 'Keine Widgets vorhanden', 'group.dropHere': 'Widget hier ablegen', 'group.masterPlaceholder': 'Gruppen-Schalter aktiv – erscheint, sobald steuerbare Datenpunkte konfiguriert sind', 'group.masterPlaceholderShort': 'DPs nötig', 'group.fitHeight': 'Höhe an Inhalt anpassen', // ── Panels Widget (Slide-of-Widgets) ────────────────────────────────────────── 'panels.noSlides': 'Keine Panels', 'panels.dropHere': 'Widget hier ablegen', 'panels.empty.editHint': 'Widgets unten hinzufügen oder per Drag & Drop ablegen', 'panels.empty.viewHint': 'Keine Panels konfiguriert', 'panels.removeSlide': 'Panel entfernen', 'panels.prev': 'Zurück', 'panels.next': 'Weiter', 'panels.slide': 'Panel', 'panels.addSlide': 'Panel hinzufügen', 'panels.pickWidget': 'Widget wählen', 'panels.opt.loop': 'Endlos-Schleife', 'panels.opt.showDots': 'Pagination-Punkte', 'panels.opt.showArrows': 'Pfeil-Buttons', 'panels.opt.autoplay': 'Automatisch weiterblättern', 'panels.opt.interval': 'Intervall', // ── Carousel Widget (Chip-Streifen) ─────────────────────────────────────────── 'carousel.items.title': 'Elemente', 'carousel.items.add': '+ Element hinzufügen', 'carousel.items.label': 'Beschriftung', 'carousel.items.dp': 'Schreib-DP — der Wert wird beim Klick auf diesen DP geschrieben', 'carousel.items.value': 'Aktiv-Wert (wird beim Klick geschrieben, leuchtet wenn DP übereinstimmt)', 'carousel.items.activeValue': 'Aktiv-Wert — Element leuchtet wenn Aktiv-DP diesen Wert hat (leer = Schreib-Wert)', 'carousel.items.action': 'Klick-Aktion (ersetzt das DP-Schreiben)', 'carousel.opt.snap': 'Einrasten beim Scrollen', 'carousel.opt.gap': 'Abstand zwischen Elementen (px)', 'carousel.opt.maxItemWidth': 'Max. Breite pro Element (Lauftext bei Überlauf)', 'carousel.opt.labelAlign': 'Element-Name-Ausrichtung', 'carousel.opt.hideScrollbar': 'Scrollbalken ausblenden', 'carousel.opt.shakeOnOpen': 'Beim Öffnen des Tabs wackeln (zeigt weitere Elemente)', 'carousel.opt.mode': 'Modus', 'carousel.opt.mode.carousel': 'Karussell (Chip-Streifen)', 'carousel.opt.mode.single': 'Single (ein Element pro Breite)', 'carousel.opt.autoRotate': 'Elemente automatisch langsam rotieren', 'carousel.opt.autoRotateSpeed': 'Rotationsgeschwindigkeit', 'carousel.opt.autoRotateInterval': 'Schritt-Intervall', 'carousel.items.bgColor': 'Hintergrundfarbe', 'carousel.items.textColor': 'Schriftfarbe', 'carousel.items.colors': 'Farben', 'carousel.items.iconSize': 'Icon-Größe', 'carousel.items.resetIconSize': 'Automatisch', 'carousel.items.colorsActive': 'Aktiv', 'carousel.items.colorsInactive': 'Inaktiv', 'carousel.items.resetColor': 'Zurücksetzen', 'carousel.items.inactiveValue': 'Inaktiv-Wert (z.B. false)', 'carousel.items.showLastChange': 'Letzte Änderung anzeigen (zweite Zeile)', 'carousel.action.none': 'DP schalten (Standard)', 'carousel.action.popupWidget': 'Popup: Widget-Inhalt', 'carousel.action.popupView': 'Popup: View', 'carousel.action.linkTab': 'Tab-Sprung', // ── EVCC Widget ─────────────────────────────────────────────────────────────── 'evcc.solar': 'Solar', 'evcc.house': 'Haus', 'evcc.grid': 'Bezug', 'evcc.feedIn': 'Einspsg.', 'evcc.gridLabel': 'Netz', 'evcc.loadpoint': 'Ladepunkt {n}', 'evcc.vehicle': 'Fahrzeug', 'evcc.charging': 'Laden', 'evcc.heating': 'Heizen', 'evcc.targetSoc': 'Ziel:', 'evcc.adjustTarget': 'Ziel-SoC anpassen', 'evcc.noConnection': 'Keine Verbindung', 'evcc.prefix': 'evcc Präfix', 'evcc.loadpoints': 'Ladepunkte', 'evcc.showBattery': 'Batterie anzeigen', 'evcc.showLoadpoints': 'Ladepunkte anzeigen', // ── Mediaplayer Widget ──────────────────────────────────────────────────────── 'mp.dp.title': 'Titel DP', 'mp.dp.artist': 'Künstler DP', 'mp.dp.album': 'Album DP', 'mp.dp.cover': 'Cover-Art DP (URL)', 'mp.dp.source': 'Quelle / Player-Name DP', 'mp.dp.playState': 'Wiedergabe-Status DP', 'mp.dp.volume': 'Lautstärke DP', 'mp.dp.mute': 'Mute DP', 'mp.dp.play': 'Play DP', 'mp.dp.pause': 'Pause DP', 'mp.dp.stop': 'Stop DP', 'mp.dp.next': 'Nächster Titel DP', 'mp.dp.prev': 'Vorheriger Titel DP', 'mp.dp.shuffle': 'Shuffle DP', 'mp.dp.repeat': 'Repeat DP', 'mp.dp.mediaProgress': 'Position DP (Sekunden)', 'mp.dp.mediaLength': 'Länge DP (Sekunden)', 'mp.dp.mediaProgressStr': 'Position DP (Text, z.B. 03:42)', 'mp.dp.mediaLengthStr': 'Länge DP (Text, z.B. 05:45)', 'mp.vol.min': 'Min', 'mp.vol.max': 'Max', 'mp.vol.step': 'Schritt', 'mp.chips.title': 'Schnellzugriff-Chips', 'mp.chips.add': '+ Chip hinzufügen', 'mp.chips.label': 'Bezeichnung', 'mp.chips.value': 'Wert (leer = true)', 'mp.autodetect': 'Auto-Erkennen', 'mp.displayDps': 'Anzeige-DPs', 'mp.controlDps': 'Steuerungs-DPs', 'mp.volumeRange': 'Lautstärke-Bereich', // ── Slider Widget ───────────────────────────────────────────────────────────── 'sl.range.min': 'Min', 'sl.range.max': 'Max', 'sl.range.step': 'Schritt', 'sl.range.unit': 'Einheit', 'sl.style.orientation': 'Ausrichtung', 'sl.style.horizontal': 'Horizontal', 'sl.style.vertical': 'Vertikal', 'sl.style.barStyle': 'Bar-Stil', 'sl.style.barSize': 'Bar-Breite (%)', 'sl.style.thickness': 'Track-Breite (px)', 'sl.style.color': 'Slider-Farbe', 'sl.style.commitOnRelease': 'Wert erst beim Loslassen schreiben', 'sl.style.readOnly': 'Nur Anzeige (Fortschrittsbalken)', 'sl.actions.title': 'Aktions-Buttons', 'sl.actions.add': '+ Button hinzufügen', 'sl.actions.icon': 'Icon', 'sl.actions.label': 'Bezeichnung (optional)', 'sl.actions.dp': 'Datenpunkt', 'sl.actions.value': 'Wert (leer = true)', // ── Chips Widget ───────────────────────────────────────────────────────────── 'cw.layout.title': 'Layout', 'cw.layout.mode': 'Anordnung', 'cw.layout.row': 'Zeile (horizontal, scrollbar)', 'cw.layout.wrap': 'Umgebrochen', 'cw.layout.column': 'Spalte', 'cw.layout.grid': 'Raster (feste Spalten)', 'cw.layout.align': 'Ausrichtung', 'cw.layout.valign': 'Vertikale Position', 'cw.layout.chipSize': 'Chip-Größe', 'cw.layout.chipStyle': 'Chip-Stil', 'cw.layout.chipRadius': 'Eckenradius', 'cw.layout.wrapCols': 'Spalten', 'cw.layout.gap': 'Abstand (px)', 'cw.layout.bgColor': 'Hintergrundfarbe', 'cw.layout.textColor': 'Schriftfarbe', // Menu widget (navigation) 'menu.mode.title': 'Menü-Typ', 'menu.mode.section': 'Bereich-Menü', 'menu.mode.tab': 'Tab-Menü', 'menu.variant.title': 'Variante', 'menu.variant.hbar': 'Leiste horizontal', 'menu.variant.vlist': 'Liste vertikal', 'menu.variant.grid': 'Raster', 'menu.variant.pills': 'Chips', 'menu.indicator.title': 'Aktiv-Stil', 'menu.items': 'Menüpunkte', 'menu.showIcons': 'Icons anzeigen', 'menu.showLabels': 'Text anzeigen', 'menu.iconSize': 'Icon-Größe', 'menu.align': 'Ausrichtung', 'menu.align.left': 'Links', 'menu.align.center': 'Mitte', 'menu.align.right': 'Rechts', 'menu.gridCols': 'Spalten', 'menu.empty': 'Keine Menüpunkte', 'cw.radius.full': 'Pille', 'cw.style.filled': 'Gefüllt', 'cw.style.outlined': 'Umrandet', 'cw.style.ghost': 'Ghost', 'cw.size.sm': 'Klein', 'cw.size.md': 'Mittel', 'cw.size.lg': 'Groß', 'cw.checkDp': 'Aktiv-Status DP (optional)', 'cw.chips.title': 'Chips', 'cw.chips.add': '+ Chip hinzufügen', 'cw.chips.label': 'Bezeichnung', 'cw.chips.value': 'Schreib-Wert (leer = true)', 'cw.chips.activeValue': 'Aktiv-Wert (optional)', 'cw.chips.bg': 'Hintergrundfarbe', 'cw.chips.fg': 'Schriftfarbe', 'cw.confirm.enable': 'Bestätigung vor Aktion erfordern', 'cw.confirm.text': 'Bestätigungs-Text (optional)', // ── Climate Widget ──────────────────────────────────────────────────────────── 'climate.actualTemp': 'Ist-Temperatur Datenpunkt', 'climate.targetTemp': 'Soll-Temperatur Datenpunkt (optional)', 'climate.humidity': 'Luftfeuchtigkeits-Datenpunkt (optional)', 'climate.unit': 'Temperatur-Einheit', 'climate.humidityUnit': 'Feuchtigkeits-Einheit', 'climate.lineColor': 'Diagrammfarbe', // ── Alarm Widget ────────────────────────────────────────────────────────────── 'alarm.title': 'Alarmanlage', 'alarm.state.deactivated': 'Deaktiviert', 'alarm.state.sharp': 'Scharf', 'alarm.state.sharpInside': 'Scharf innen', 'alarm.state.burglary': 'Einbruch', 'alarm.state.nightRest': 'Nachtruhe', 'alarm.state.getsActivated': 'Wird scharf…', 'alarm.state.activationFail': 'Aktivierung gescheitert', 'alarm.state.activationAbort': 'Aktivierung abgebrochen', 'alarm.state.silentAlarm': 'Stiller Alarm', 'alarm.nightRest': 'Nachtruhe', 'alarm.presence': 'Anwesenheits-Simulation', 'alarm.presence.on': 'Anwesend', 'alarm.presence.off': 'Abwesend', 'alarm.mode.off': 'Aus', 'alarm.mode.sharp': 'Scharf', 'alarm.mode.inside': 'Innen', 'alarm.mode.night': 'Nacht', 'alarm.enableDelay': 'Mit Verzögerung', 'alarm.panic': 'Panik', 'alarm.panicConfirm': 'Panik-Alarm auslösen?', 'alarm.confirm': 'Bestätigen', 'alarm.cancel': 'Abbrechen', 'alarm.activatingIn': 'Scharf in', 'alarm.silentIn': 'Stiller Alarm in', 'alarm.openCircuits': 'Offen', 'alarm.changesPending': 'Meldung im Überwachungskreis', 'alarm.quit': 'Quittieren', 'alarm.quitChanges': 'Veränderungen quittieren', 'alarm.today': 'Heute', 'alarm.zone.one': 'Zone 1', 'alarm.zone.two': 'Zone 2', 'alarm.zone.three': 'Zone 3', 'alarm.pinPlaceholder': 'PIN eingeben', 'alarm.wrongPin': 'Falsche PIN', 'alarm.send': 'Senden', 'alarm.cfg.prefix': 'Alarm-Instanz (Prefix)', 'alarm.cfg.sections': 'Sichtbare Sektionen', 'alarm.cfg.behavior': 'Verhalten', 'alarm.cfg.showHeader': 'Status-Kopfzeile', 'alarm.cfg.showModes': 'Modus-Buttons', 'alarm.cfg.showModeOff': 'Button „Aus“', 'alarm.cfg.showModeSharp': 'Button „Scharf“', 'alarm.cfg.showModeInside': 'Button „Innen“', 'alarm.cfg.showModeNight': 'Button „Nacht“', 'alarm.cfg.showDelay': '„Mit Verzögerung“-Button', 'alarm.cfg.showCountdown': 'Countdown-Anzeige', 'alarm.cfg.showCircuits': 'Offene Kreise / Warnungen', 'alarm.cfg.showZones': 'Zonen-Toggles', 'alarm.cfg.showLog': 'Heutiges Log', 'alarm.cfg.showPanic': 'Panik-Button', 'alarm.cfg.showPanic.hint': 'Auslösen wird per Bestätigungs-Dialog abgesichert', 'alarm.cfg.showPresence': 'Anwesenheits-Simulation', 'alarm.cfg.requirePin': 'Deaktivieren nur mit PIN', 'alarm.cfg.requirePin.hint': 'Schreibt in use.disable_password statt use.disable', 'alarm.cfg.panicConfirm': 'Panik nur nach Bestätigung', 'alarm.cfg.compactMode': 'Kompakt-Modus', 'alarm.cfg.compactMode.hint': 'Mode-Buttons in 2 Spalten statt 4', 'alarm.cfg.logLines': 'Log-Einträge (max.)', 'alarm.cfg.sizeScale': 'Globale Skalierung', // ── Widget Previews ─────────────────────────────────────────────────────────── 'preview.feelsLike': 'Gefühlt {temp}°', 'preview.device': 'Gerät', 'preview.cal.dentist': 'Zahnarzt', 'preview.cal.birthday': 'Geburtstag Lisa', } as const; export type TranslationKey = keyof typeof de;