All checks were successful
Nightly Build / build (push) Successful in 6m50s
The GCode browser previously only showed files the bridge itself had
stored (its own SQLite GCodeStore, uploaded through the bridge). Files
printed directly via Anycubic Slicer Next (bypassing the bridge) land
on the printer's internal storage instead, and were only visible/
manageable from the printer's own display.
Adds a second sub-tab ("On Printer") using the same master-detail
tab pattern already used for Settings categories (showSettingsCat),
backed by the printer's file/listLocal and file/deleteBatch MQTT
actions - verified live against a real Kobra X, see memory
reference_mqtt_listlocal.md.
Key implementation detail: publish()'s own return value for these
actions is just a generic immediate ACK skeleton (code=0, empty
fields) - the real response arrives asynchronously via the file/report
callback (_on_file), same as the existing fileDetails fire-and-forget
pattern. Added _wait_for_file_action() as a small reusable bridge
between that async callback delivery and the synchronous HTTP handler,
via a per-action threading.Event registered in _on_file.
New endpoints: GET /kx/printer-files, POST /kx/printer-files/delete
(single endpoint for both single- and multi-select delete, since
deleteBatch natively accepts a filename list).
Frontend mirrors the existing store multi-select pattern (Issue #94):
select mode, select-all (scoped to what's loaded), bulk delete with
confirmation. No print/download actions in this tab for now - printing
a file already on the printer without re-uploading needs its own MQTT
schema that hasn't been verified yet.
Verified end-to-end against the real printer: listed 146 files,
deleted one, confirmed via a follow-up list that it was gone and
nothing else was affected. Also verified visually (Playwright):
tab switching, card rendering, multi-select mode, and cancel all work
as expected.
356 lines
15 KiB
JSON
356 lines
15 KiB
JSON
{
|
||
"ace_dry_auto_refill": "Auto-Nachschub",
|
||
"ace_dry_chart": "Verlauf (Temp/Feuchte)",
|
||
"ace_dry_current_temp": "Temperatur",
|
||
"ace_dry_dialog_cancel": "Abbrechen",
|
||
"ace_dry_dialog_confirm": "Bestätigen",
|
||
"ace_dry_dialog_custom_name": "Eigener Name",
|
||
"ace_dry_dialog_reset_default": "Auf Standard zurücksetzen",
|
||
"ace_dry_dialog_save_restart": "Speichern & Neustart",
|
||
"ace_dry_dialog_temp": "Temperatur (30-80°C)",
|
||
"ace_dry_dialog_time": "Restzeit (h:m:s)",
|
||
"ace_dry_dialog_title": "Trockner Temp/Zeit-Einstellungen",
|
||
"ace_dry_dryer": "Trockner",
|
||
"ace_dry_duration": "Dauer (Min)",
|
||
"ace_dry_enable": "Trocknung aktivieren",
|
||
"ace_dry_humidity": "Luftfeuchte",
|
||
"ace_dry_preset_abs_asa": "ABS / ASA",
|
||
"ace_dry_preset_custom": "Custom",
|
||
"ace_dry_preset_pa_pc": "PA / PC",
|
||
"ace_dry_preset_petg": "PETG",
|
||
"ace_dry_preset_pla": "PLA",
|
||
"ace_dry_preset_pla_plus": "PLA+",
|
||
"ace_dry_preset_tpu": "TPU",
|
||
"ace_dry_start": "▶ Start",
|
||
"ace_dry_status_off": "Status: Aus",
|
||
"ace_dry_status_on": "Status: Aktiv",
|
||
"ace_dry_status_remaining": "Rest",
|
||
"ace_dry_stop": "■ Stop",
|
||
"ace_dry_temp": "Temperatur (°C)",
|
||
"ace_dry_temp_line": "Trocknungstemperatur",
|
||
"ace_dry_time_line": "Trocknungszeit",
|
||
"ace_dry_ui_pending": "(nur UI, Backend folgt)",
|
||
"add_printer": "Drucker hinzufügen",
|
||
"ams_empty": "Leer",
|
||
"ams_no_data": "Keine AMS-Daten empfangen",
|
||
"apd_cancel": "Abbrechen",
|
||
"apd_confirm": "Hinzufügen",
|
||
"apd_err_ip": "Bitte IP-Adresse eingeben",
|
||
"apd_fetching": "Hole Daten vom Drucker…",
|
||
"apd_lbl_ip": "Drucker-IP",
|
||
"apd_lbl_name": "Name (optional)",
|
||
"apd_placeholder_name": "z.B. Kobra X Wohnzimmer",
|
||
"apd_success": "Drucker hinzugefügt, Bridge startet neu…",
|
||
"apd_title": "Drucker hinzufügen",
|
||
"browser_tab_printer": "Auf dem Drucker",
|
||
"browser_tab_uploaded": "Hochgeladen",
|
||
"btn_cam_start": "▶ Kamera",
|
||
"btn_cam_start2": "▶ Start",
|
||
"btn_cam_stop": "◼ Kamera",
|
||
"btn_cam_stop2": "◼ Stop",
|
||
"btn_cancel": "✕ Stopp",
|
||
"btn_cancel_generic": "Abbrechen",
|
||
"btn_confirm_generic": "Bestätigen",
|
||
"btn_connect": "⚡ Verbinden",
|
||
"btn_delete": "Löschen",
|
||
"btn_disable_motors": "Motoren aus",
|
||
"btn_disconnect": "✕ Trennen",
|
||
"btn_home_all": "Home All",
|
||
"btn_home_xy": "Home XY",
|
||
"btn_home_z": "Home Z",
|
||
"btn_pause": "⏸ Pause",
|
||
"btn_resume": "▶ Weiter",
|
||
"cam_placeholder": "📷 Kamera nicht gestartet",
|
||
"cam_stream_unavailable": "Stream nicht verfügbar",
|
||
"card_ace_dry": "ACE Trocknung",
|
||
"card_ams": "Filament",
|
||
"card_cam": "Kamera",
|
||
"card_light_fan": "Lüfter",
|
||
"card_progress": "Fortschritt",
|
||
"card_speed": "Druckgeschwindigkeit",
|
||
"card_temps": "Temperaturen",
|
||
"confirm_cancel": "Druck wirklich abbrechen?",
|
||
"dash_done": "Fertig",
|
||
"dash_edit": "Dashboard anpassen",
|
||
"dash_hidden_cards": "Ausgeblendete Karten",
|
||
"dash_hide": "Ausblenden",
|
||
"dash_preset_delete_confirm": "Preset \"{name}\" löschen?",
|
||
"dash_preset_name_prompt": "Preset-Name:",
|
||
"dash_preset_standard": "Standard",
|
||
"dash_preset_wide89": "Desktop breit",
|
||
"dash_reset": "Zurücksetzen",
|
||
"dash_save_preset": "Als Preset speichern",
|
||
"dash_show": "Einblenden",
|
||
"dash_toggle_width": "Breite umschalten",
|
||
"fd_cancel": "Abbrechen",
|
||
"fd_no_matching_material": "Kein passendes Material",
|
||
"fd_no_slots_msg": "Keine belegten AMS-Slots.{br}Druck trotzdem starten?",
|
||
"fd_objects_hint": "Objekte überspringen (optional):",
|
||
"fd_objects_toggle": "Objekte überspringen",
|
||
"fd_options_title": "Optionen",
|
||
"fd_print": "▶ Drucken",
|
||
"fd_slot": "Slot",
|
||
"fd_slots_hint": "GCode-Kanal → AMS-Slot zuweisen:",
|
||
"fd_title": "Slot-Zuweisung",
|
||
"fd_used": "BELEGT",
|
||
"file_cancel_btn": "✕ Abbrechen",
|
||
"file_ready_btn": "▶ Druck starten",
|
||
"file_slots_btn": "🎨 Slots wählen",
|
||
"header_status_complete": "Fertig",
|
||
"header_status_error": "Fehler",
|
||
"header_status_printing": "Druckt",
|
||
"header_status_standby": "Bereit",
|
||
"hint_ip_no_port": "Nur IP-Adresse, kein Port (z.B. 192.168.1.102)",
|
||
"kobra_auto_leveling": "Nivellierung",
|
||
"kobra_busy": "Beschäftigt",
|
||
"kobra_canceled": "Abgebrochen",
|
||
"kobra_checking": "Prüfung",
|
||
"kobra_failed": "Fehler",
|
||
"kobra_finished": "Abgeschlossen",
|
||
"kobra_free": "Bereit",
|
||
"kobra_init": "Initialisierung",
|
||
"kobra_offline": "Offline",
|
||
"kobra_paused": "Pausiert",
|
||
"kobra_pausing": "Pausiert...",
|
||
"kobra_preheating": "Aufheizen",
|
||
"kobra_printing": "Druckt",
|
||
"kobra_resumed": "Fortgesetzt",
|
||
"kobra_resuming": "Fortsetzen...",
|
||
"kobra_stoped": "Gestoppt",
|
||
"kobra_stopping": "Stoppt...",
|
||
"kobra_updated": "Aktualisierung",
|
||
"label_bed": "Bett",
|
||
"label_fan": "🌀 Lüfter",
|
||
"label_light": "💡 Licht",
|
||
"label_nozzle": "Düse",
|
||
"label_off": "Aus",
|
||
"label_on_off": "Ein / Aus",
|
||
"label_set": "Setzen",
|
||
"label_slot": "Slot",
|
||
"label_speed": "Geschwindigkeit",
|
||
"label_step": "Schrittweite:",
|
||
"label_target_c": "Ziel:",
|
||
"lbl_conn_error": "Verbindungsfehler:",
|
||
"lbl_elapsed": "Verstrichen:",
|
||
"lbl_feed": "Einziehen",
|
||
"lbl_layers": "Layer",
|
||
"lbl_light": "💡 Licht",
|
||
"lbl_pause_reason": "Druck pausiert:",
|
||
"lbl_remaining": "Restzeit:",
|
||
"lbl_slicer_time": "Slicer-Schätzung:",
|
||
"lbl_spoolman_sync_rate": "Sync-Rate (s, 0=Druckende)",
|
||
"lbl_spoolman_url": "Server-URL",
|
||
"lbl_unload": "Ausziehen",
|
||
"lbl_zpos": "Z (mm)",
|
||
"log_auto": "⬇ Auto",
|
||
"log_axis": "Achse",
|
||
"log_bed": "Bett →",
|
||
"log_cam_start": "Kamera gestartet:",
|
||
"log_cam_stop": "Kamera gestoppt",
|
||
"log_clear": "✕ Leeren",
|
||
"log_delete_failed": "Löschung fehlgeschlagen",
|
||
"log_dir_all": "Alle",
|
||
"log_dir_label": "Richtung:",
|
||
"log_dir_rx": "RX",
|
||
"log_dir_tx": "TX",
|
||
"log_download": "⬇ Download",
|
||
"log_error": "Fehler:",
|
||
"log_fan": "Lüfter →",
|
||
"log_filter_placeholder": "Filtern…",
|
||
"log_home": "Home",
|
||
"log_home_all": "Home All",
|
||
"log_light_off": "Licht aus",
|
||
"log_light_on": "Licht an",
|
||
"log_lvl_err": "⛔ Fehler",
|
||
"log_lvl_label": "Level:",
|
||
"log_lvl_warn": "⚠ Warnung",
|
||
"log_nozzle": "Düse →",
|
||
"log_poll_error": "Poll-Fehler:",
|
||
"log_print_action": "Druck:",
|
||
"log_print_start": "Druckstart:",
|
||
"log_topic_ams": "AMS",
|
||
"log_topic_info": "Info",
|
||
"log_topic_label": "Thema:",
|
||
"log_topic_print": "Druck",
|
||
"log_topic_status": "Status",
|
||
"modal_sec_obico": "Obico",
|
||
"modal_sec_spoolman": "Spoolman",
|
||
"nav_ams": "AMS",
|
||
"nav_browser": "Browser",
|
||
"nav_console": "Konsole",
|
||
"nav_dashboard": "Dashboard",
|
||
"nav_extras": "Licht / Lüfter",
|
||
"nav_motion": "Achsen",
|
||
"nav_print": "Druck",
|
||
"nav_printers": "Drucker",
|
||
"nav_settings": "Einstellungen",
|
||
"nav_temps": "Temperaturen",
|
||
"orca_profile_done": "Importiert",
|
||
"orca_profile_dropmsg": "Hierher ziehen oder klicken",
|
||
"orca_profile_help_html": "Lade ein <b>ZIP</b> deines OrcaSlicer-Filament-Ordners oder einzelne <b>.json</b>-Files hoch.<br>In OrcaSlicer: <i>Help → Show Configuration Folder → user/<id>/filament/</i>",
|
||
"orca_profile_hint": "Eigene Profile aus OrcaSlicer importieren (User-Dir öffnen via Help → Show Configuration Folder)",
|
||
"orca_profile_import_btn": "Profile importieren",
|
||
"orca_profile_import_link": "★ Eigene Profile importieren…",
|
||
"orca_profile_import_title": "Eigene OrcaSlicer-Profile importieren",
|
||
"orca_profile_list_label": "Aktuell importiert",
|
||
"orca_profile_section": "OrcaSlicer-Profile",
|
||
"orca_profile_skipped": "übersprungen",
|
||
"orca_profile_uploading": "Lade hoch…",
|
||
"orca_profile_user_empty": "– keine –",
|
||
"orca_profile_user_label": "Eigene Profile",
|
||
"panel_ams_title": "Filament",
|
||
"panel_browser_title": "Datei-Browser",
|
||
"panel_console_title": "Ereignis-Log",
|
||
"panel_extras_camera": "Kamera",
|
||
"panel_extras_fan": "Lüfter",
|
||
"panel_extras_light": "Licht",
|
||
"panel_motion_xy": "Achsensteuerung",
|
||
"panel_print_btn_cancel": "✕ Abbrechen",
|
||
"panel_print_btn_pause": "⏸ Pause",
|
||
"panel_print_btn_resume": "▶ Fortsetzen",
|
||
"panel_print_temps_live": "Temperaturen (Live)",
|
||
"panel_print_title": "Drucksteuerung",
|
||
"panel_temps_bed": "Heizbett",
|
||
"panel_temps_chart": "Verlauf (letzte 60 Messungen)",
|
||
"panel_temps_nozzle": "Düse",
|
||
"print_auto_leveling": "Auto-Leveling für diesen Druck",
|
||
"printer_store_delete_confirm": "Datei vom Drucker löschen?",
|
||
"printer_store_delete_selected_confirm": "{n} ausgewählte Dateien vom Drucker löschen?",
|
||
"printer_store_empty": "Keine Dateien auf dem Drucker.",
|
||
"printer_store_unreachable": "Drucker nicht erreichbar oder Abfrage fehlgeschlagen.",
|
||
"printers_active": "● aktiv",
|
||
"printers_current": "Aktueller Drucker",
|
||
"printers_empty_hint": "Noch kein Drucker eingerichtet.",
|
||
"printers_loading": "Lade…",
|
||
"printers_none": "Keine Drucker konfiguriert.",
|
||
"printers_remove": "Drucker entfernen",
|
||
"printers_remove_confirm": "Drucker \"{name}\" entfernen? Die Bridge startet neu.",
|
||
"printers_switch": "Wechseln →",
|
||
"progress_action_clear": "Leeren",
|
||
"progress_action_print": "Drucken",
|
||
"progress_action_slots": "Slots zuordnen",
|
||
"settings_auto_leveling": "Auto-Leveling vor Druck",
|
||
"settings_auto_leveling_label": "Auto-Leveling vor dem Druck",
|
||
"settings_btn_tooltip": "Einstellungen",
|
||
"settings_camera_on_print": "Kamera bei Druckstart einschalten",
|
||
"settings_cat_connection": "Verbindung",
|
||
"settings_cat_display": "Darstellung",
|
||
"settings_cat_filament": "Filament",
|
||
"settings_cat_language": "Sprache",
|
||
"settings_cat_printer": "Drucker",
|
||
"settings_cat_system": "System",
|
||
"settings_cat_theme": "Hell / Dunkel umschalten",
|
||
"settings_connection": "Verbindung",
|
||
"settings_default_slot": "Standard-Slot (Einfarbdruck)",
|
||
"settings_device_id": "Device-ID",
|
||
"settings_device_id_hint": "32 Hexzeichen",
|
||
"settings_device_id_placeholder": "32 Hexzeichen",
|
||
"settings_filament_mapping": "Filament-Profil-Mapping (pro Slot)",
|
||
"settings_filament_mapping_hint": "Festes Orca-Profil pro AMS-Slot. Bei der Slicer-Synchronisierung sendet die Bridge dieses Profil statt \"Generic\".",
|
||
"settings_filament_mapping_label": "Filament-Profil-Mapping (pro Slot)",
|
||
"settings_filament_mapping_save": "Mapping speichern",
|
||
"settings_filament_mapping_save_label": "Mapping speichern",
|
||
"settings_file_ready_banner": "Druckleiste",
|
||
"settings_file_ready_dialog": "Druckdialog",
|
||
"settings_file_ready_mode": "Nach Upload: Druckstart-Verhalten",
|
||
"settings_integrations": "Integrationen",
|
||
"settings_language": "Sprache",
|
||
"settings_mode_id": "Mode-ID",
|
||
"settings_mode_id_placeholder": "20030",
|
||
"settings_mqtt_port": "MQTT-Port",
|
||
"settings_mqtt_username_placeholder": "userXXXXXXXX",
|
||
"settings_orca_profiles_import": "Profile importieren",
|
||
"settings_orca_profiles_label": "OrcaSlicer-Profile",
|
||
"settings_password": "MQTT-Passwort",
|
||
"settings_poll": "Poll-Intervall (Sekunden)",
|
||
"settings_poll_interval_hint": "Wie oft die Bridge den Druckerstatus abfragt",
|
||
"settings_poll_interval_label": "Poll-Intervall (Sekunden)",
|
||
"settings_print": "Druckeinstellungen",
|
||
"settings_printer_ip": "Drucker-IP",
|
||
"settings_printer_name": "Drucker-Name",
|
||
"settings_printer_name_placeholder": "z.B. Kobra X Links",
|
||
"settings_save": "Speichern & Neustart",
|
||
"settings_slot_auto": "Auto (alle belegten Slots)",
|
||
"settings_theme_toggle": "Wechsel Hell / Dunkel",
|
||
"settings_title": "Einstellungen",
|
||
"settings_username": "MQTT-Benutzername",
|
||
"settings_vendor_filter_placeholder": "Hersteller suchen…",
|
||
"settings_verbose_http_log": "Jede HTTP-Anfrage loggen (ausführlich)",
|
||
"settings_version": "Version",
|
||
"settings_vibration_compensation": "Resonanzkompensation",
|
||
"settings_visible_vendors": "Sichtbare Hersteller (Profil-Dropdown)",
|
||
"settings_visible_vendors_hint": "Nur diese Hersteller erscheinen im Slot-Profil-Dropdown. Nichts ausgewählt = alle anzeigen. „Generic\" und eigene Profile sind immer sichtbar.",
|
||
"settings_visible_vendors_label": "Sichtbare Hersteller (Profil-Dropdown)",
|
||
"settings_visible_vendors_save": "Auswahl speichern",
|
||
"settings_visible_vendors_save_label": "Auswahl speichern",
|
||
"settings_web_upload_warning": "Warnung bei Web-Upload-Druck anzeigen",
|
||
"sf_all": "Alle",
|
||
"sf_err": "✗ Fehler",
|
||
"sf_new": "Neu",
|
||
"sf_ok": "✓ Erfolgreich",
|
||
"skip_already": "übersprungen",
|
||
"skip_btn_label": "Objekte",
|
||
"skip_cancel": "Abbrechen",
|
||
"skip_confirm": "Überspringen",
|
||
"skip_confirm_btn": "Überspringen",
|
||
"skip_hint": "Objekte abwählen, die nicht weiter gedruckt werden sollen:",
|
||
"skip_no_objects": "Keine Objekte in diesem Druck.",
|
||
"skip_select_at_least_one": "Bitte mindestens ein Objekt wählen.",
|
||
"skip_sending": "Sende …",
|
||
"skip_success": "Objekte werden übersprungen.",
|
||
"skip_title": "✂ Objekte überspringen",
|
||
"slot_copy_from": "Farbe von Slot kopieren…",
|
||
"slot_edit_color": "Farbe",
|
||
"slot_edit_custom": "z.B. PLA, PETG, ABS…",
|
||
"slot_edit_load": "⬇ Einziehen",
|
||
"slot_edit_material": "Material",
|
||
"slot_edit_ok": "AMS Slot",
|
||
"slot_edit_profile": "OrcaSlicer-Profil",
|
||
"slot_edit_profile_default": "— Generic (Default) —",
|
||
"slot_edit_profile_hint": "Sendet beim OrcaSlicer-Sync die konkrete Marke statt nur „Generic\"",
|
||
"slot_edit_save": "💾 Speichern",
|
||
"slot_edit_title": "Slot bearbeiten",
|
||
"slot_edit_unload": "⬆ Ausziehen",
|
||
"speed_normal": "⚡ Normal",
|
||
"speed_silent": "🐢 Leise",
|
||
"speed_sport": "🚀 Sport",
|
||
"ss_date": "↓ Datum",
|
||
"ss_dur": "⏱ Druckzeit",
|
||
"ss_name": "A–Z Name",
|
||
"store_delete_confirm": "Datei löschen?",
|
||
"store_delete_selected": "Auswahl löschen",
|
||
"store_delete_selected_confirm": "{n} ausgewählte Dateien löschen?",
|
||
"store_download": "⬇ Download",
|
||
"store_empty": "Noch keine Dateien hochgeladen.",
|
||
"store_estimate": "Schätzung",
|
||
"store_exit_select": "Abbrechen",
|
||
"store_never": "noch nicht gedruckt",
|
||
"store_no_results": "Keine Dateien gefunden.",
|
||
"store_print": "▶ Drucken",
|
||
"store_print_confirm": "Datei drucken?",
|
||
"store_refresh": "↻ Aktualisieren",
|
||
"store_search_placeholder": "🔍 Suche…",
|
||
"store_select_all": "Alle auswählen",
|
||
"store_selected_count": "{n} ausgewählt",
|
||
"store_upload_busy": "⏳ Hochladen…",
|
||
"store_upload_error": "✗ {error}",
|
||
"store_upload_label_browse": "durchsuchen",
|
||
"store_upload_label_prefix": "GCode hierher ziehen oder ",
|
||
"store_upload_only_gcode": "✗ Nur GCode-Dateien erlaubt (.gcode, .3mf, .bgcode)",
|
||
"store_upload_success": "✓ {file}",
|
||
"store_web_verify_abort": "Abbrechen",
|
||
"store_web_verify_confirm": "Bestätigen",
|
||
"store_web_verify_msg": "Bitte bestätige, dass diese Datei für den Anycubic Kobra X erstellt wurde.",
|
||
"store_web_verify_title": "Datei verifizieren",
|
||
"update_apply": "Jetzt installieren",
|
||
"update_applying": "Lade herunter...",
|
||
"update_available": "verfügbar",
|
||
"update_check": "Auf Updates prüfen",
|
||
"update_checking": "Prüfe...",
|
||
"update_docker": "Befehl kopieren",
|
||
"update_docker_copied": "Kopiert! Ausführen: docker compose pull && docker compose up -d",
|
||
"update_error": "Fehler",
|
||
"update_none": "Bereits aktuell",
|
||
"update_restarting": "Starte neu..."
|
||
}
|