diff --git a/Plugins/plugins/lang-en/plugin.json b/Plugins/plugins/lang-en/plugin.json index 414c45d4..a437a926 100644 --- a/Plugins/plugins/lang-en/plugin.json +++ b/Plugins/plugins/lang-en/plugin.json @@ -1,8 +1,8 @@ { "slug": "lang-en", "name": "English (Sprachpaket)", - "version": "1.0.1", - "description": "Englische Oberfläche für Kundenportal und Mitarbeiterbereich. Nach der Aktivierung erscheint die britische Flagge zum Umschalten. Nicht übersetzte Texte bleiben deutsch.", + "version": "1.1.0", + "description": "Englische Oberfläche für Kundenportal und Mitarbeiterbereich. Nach der Aktivierung erscheint die britische Flagge zum Umschalten. Übersetzt Kundenportal, Mitarbeiterbereich sowie Meldungen und Fehlertexte. Nicht übersetzte Texte bleiben deutsch.", "author": "DeskHub", "entry": "plugin.php", "permissions": [], diff --git a/Plugins/plugins/lang-en/strings.json b/Plugins/plugins/lang-en/strings.json index e43bedf5..5fb6ec1d 100644 --- a/Plugins/plugins/lang-en/strings.json +++ b/Plugins/plugins/lang-en/strings.json @@ -1,1142 +1,2853 @@ { - "_info": "English language pack for DeskHub. Key = German source text, value = English. {} stands for a changing part, {#} for a number.", - "+ Erfassen": "+ Log time", - "+ Neue Aufgabe": "+ New task", - "+ Neue Regel": "+ New rule", - "+ Neuer Artikel": "+ New article", - "+ Neuer Textbaustein": "+ New text snippet", - "+ Neues Muster": "+ New pattern", - "+ Neues Ticket": "+ New ticket", - "+ Ticket erstellen": "+ Create ticket", - "+ hinzufügen": "+ add", - "0 Gerät(e) angemeldet": "0 device(s) signed in", - "1 Tag": "1 day", - "1 Treffer ·": "1 hit ·", - "10 Backups behalten": "Keep 10 backups", - "14 Backups behalten": "Keep 14 backups", - "2 Std": "2 hrs", - "2 Tage": "2 days", - "3 Backups behalten": "Keep 3 backups", - "3 Tage": "3 days", - "30 Backups behalten": "Keep 30 backups", - "5 Backups behalten": "Keep 5 backups", - "7 Backups behalten": "Keep 7 backups", - "7 Tage": "7 days", - "8 Std": "8 hrs", - "API-Schlüssel": "API keys", - "Abbrechen": "Cancel", - "Abmelden": "Sign out", - "Abruf": "Fetch", - "Absender": "Sender", - "Absender sperren…": "Block sender…", - "Absender-E-Mail": "Sender email", - "Absender-Name": "Sender name", - "Absender:": "Sender:", - "Absendername": "Sender name", - "Abteilung": "Department", - "Abteilung aktualisieren": "Update department", - "Abteilung für Live-Chat-Tickets": "Department for live chat tickets", - "Abteilung für Tickets des Assistenten": "Department for assistant tickets", - "Abteilung nicht gefunden.": "Department not found.", - "Abteilung setzen": "Set department", - "Abteilung wirklich löschen?": "Really delete this department?", - "Abteilung ändern": "Change department", - "Abteilung „Allgemeiner Support“ (nicht hinterlegt)": "Department \"General support\" (not set)", - "Abteilung:": "Department:", - "Abteilungen": "Departments", - "Abteilungs-E-Mail (optional)": "Department email (optional)", - "Abteilungs-Routing-Tabelle": "Department routing table", - "Abteilungsinformationen": "Department information", - "Abteilungsleiter": "Department head", - "Achtung:": "Attention:", - "Admin-Protokoll": "Admin log", - "Administrator (alle Rechte)": "Administrator (all rights)", - "Administratornotizen": "Administrator notes", - "Adminportal": "Admin portal", - "Adressen, Priorität und Postfach-Abruf pflegst du unter": "You manage addresses, priority and mailbox fetching under", - "Agent anlegen": "Create agent", - "Agenten": "Agents", - "Aktion nach Abruf": "Action after fetch", - "Aktionen": "Actions", - "Aktiv": "Active", - "Aktiv (auf dem Ticket-Formular sichtbar)": "Active (visible on the ticket form)", - "Aktiv (wird beim Abruf berücksichtigt)": "Active (used when fetching)", - "Aktive Live-Chats (0)": "Active live chats (0)", - "Aktivität": "Activity", - "Aktualisieren": "Refresh", - "Aktuell keine offenen Live-Chats.": "There are currently no open live chats.", - "Aktuell würden": "Currently", - "Aktuelle Filter als Ansicht speichern": "Save current filters as a view", - "Aktuelles Passwort": "Current password", - "Alle": "All", - "Alle Absender der markierten Tickets sperren und Tickets schließen?": "Block all senders of the selected tickets and close the tickets?", - "Alle Artikel durchsuchen": "Browse all articles", - "Alle Textbausteine": "All text snippets", - "Alle Themen (oder Formular ohne Themenauswahl)": "All topics (or form without topic selection)", - "Alle anlegen": "Create all", - "Alle außer Geschlossen": "All except closed", - "Alle behalten": "Keep all", - "Alle bekannten Datenbank-Änderungen sind eingespielt.": "All known database changes have been applied.", - "Alle eingegebenen Adressen sperren und Tickets schließen?": "Block all entered addresses and close tickets?", - "Alle löschen": "Delete all", - "Alle sperren": "Block all", - "Allgemein": "General", - "Allgemeine Anfrage": "General inquiry", - "Allgemeiner Support": "General support", - "Alphabetisch": "Alphabetical", - "Als gelesen markieren": "Mark as read", - "An diesen Tagen laufen keine SLA-Fristen, unabhängig vom Wochentag.": "No SLA deadlines run on these days, regardless of the weekday.", - "Analysieren": "Analyze", - "Android fragt einmalig, ob der Browser Apps installieren darf. Das bitte erlauben.": "Android asks once whether the browser may install apps. Please allow it.", - "Anfrage-Quelle": "Request source", - "Anhang": "Attachment", - "Anhänge (optional, mehrere möglich)": "Attachments (optional, multiple allowed)", - "Anmelden": "Sign in", - "Anmelden – {}": "Sign in – {}", - "Anmeldung für Support-Mitarbeiter und Administratoren.": "Sign-in for support staff and administrators.", - "Anonymisiert": "Anonymized", - "Anonymisierung jetzt ausführen? Dies kann nicht rückgängig gemacht werden.": "Run anonymization now? This cannot be undone.", - "Anordnung der Optionen": "Order of the options", - "Ansicht umbenennen": "Rename view", - "Ansichten": "Views", - "Antwort senden": "Send reply", - "Antworten": "Replies", - "Antworten / Notiz": "Reply / note", - "Antworten auf häufige Fragen – oft schneller als der Weg über ein Ticket.": "Answers to common questions – often faster than opening a ticket.", - "Anzeigename": "Display name", - "Anzeigename & URL": "Display name & URL", - "App öffnen, Serveradresse eingeben und anmelden.": "Open the app, enter the server address and sign in.", - "Apps für Mitarbeiter": "Apps for staff", - "Artikel": "Article", - "Artikel wirklich löschen?": "Really delete this article?", - "Auch Nachrichten durchsuchen": "Also search messages", - "Auf später legen": "Snooze", - "Auf „Alle Themen“ belassen, damit das Feld unabhängig vom gewählten Anliegen erscheint.": "Leave on \"All topics\" so the field appears regardless of the chosen request.", - "Aufbewahrungsdauer nach Schließung": "Retention period after closing", - "Aufgabe": "Task", - "Aufgaben": "Tasks", - "Aufrufe": "Views", - "Ausfall": "Outage", - "Auswahl:": "Selection:", - "Auto-Antwort senden (Textbaustein)": "Send auto-reply (text snippet)", - "Automatisch": "Automatic", - "Automatisch (Routing-Tabelle / globale Standardabteilung)": "Automatic (routing table / global default department)", - "Automatisch offline nach": "Go offline automatically after", - "Automatische Anonymisierung aktivieren": "Enable automatic anonymization", - "Automatische Backups": "Automatic backups", - "Automatische Backups jetzt manuell ausführen?": "Run automatic backups manually now?", - "Automatische Datenlöschung": "Automatic data deletion", - "Automatische Zeiterfassung (misst automatisch, wie lange ein Mitarbeiter ein Ticket geöffnet hat)": "Automatic time tracking (measures how long a staff member has a ticket open)", - "Automatischen Hintergrund-Betrieb aktiv halten": "Keep automatic background operation active", - "Automatischer Logout nach Inaktivität": "Automatic logout after inactivity", - "Automatisches Schließen": "Automatic closing", - "Automatisches Schließen jetzt manuell ausführen?": "Run automatic closing manually now?", - "Backup-Intervall": "Backup interval", - "Backup-Rotation (lokale Kopien behalten)": "Backup rotation (local copies to keep)", - "Backups enthalten alle Dateien inkl.": "Backups contain all files incl.", - "Backups liegen in": "Backups are stored in", - "Backups vorhanden": "Backups available", - "Backups werden automatisch vor jedem Update erstellt": "Backups are created automatically before every update", - "Backups werden nach der Erstellung automatisch per FTP übertragen.": "Backups are transferred automatically via FTP after creation.", - "Bayern": "Bavaria", - "Beantwortet": "Answered", - "Bearbeiten": "Edit", - "Bedingungen": "Conditions", - "Begrüßung": "Greeting", - "Behoben": "Resolved", - "Bei einer": "For a", - "Bei schweren Fehlern auf der Webseite eine E-Mail senden": "Send an email on serious errors on the website", - "Beim Öffnen automatisch zuweisen (ein noch nicht zugewiesenes Ticket geht an den Mitarbeiter, der es öffnet)": "Assign automatically on open (an unassigned ticket goes to the staff member who opens it)", - "Beliebte Artikel": "Popular articles", - "Benachrichtigungen": "Notifications", - "Benutzerdefiniert": "Custom", - "Benutzerdefinierte Berechtigungssets für Mitarbeiter. Ohne Rolle gelten die Standard-Mitarbeiterrechte.": "Custom permission sets for staff. Without a role, the default staff permissions apply.", - "Benutzerdefinierte Listen": "Custom lists", - "Benutzername": "Username", - "Benutzername / E-Mail": "Username / email", - "Beobachter": "Watchers", - "Beobachtetes Ticket aktualisiert": "Watched ticket updated", - "Berechtigungen": "Permissions", - "Bereich „Beliebte Artikel“ auf der Startseite anzeigen": "Show the \"Popular articles\" section on the home page", - "Bereits registriert?": "Already registered?", - "Bericht erstellen": "Create report", - "Bericht-Baukasten": "Report builder", - "Berichte": "Reports", - "Berichtszeitraum": "Reporting period", - "Beschreiben Sie Ihr Anliegen so detailliert wie möglich…": "Describe your request in as much detail as possible…", - "Beschreiben Sie Ihr Anliegen so genau wie möglich – das hilft uns, schneller zu helfen.": "Describe your request as precisely as possible – it helps us help you faster.", - "Beschreibung": "Description", - "Beschreibung (optional)": "Description (optional)", - "Beschriftung im Footer": "Footer label", - "Beschäftigt": "Busy", - "Betreff": "Subject", - "Betreff & letzte Nachricht": "Subject & last message", - "Betreff und Kundenname in der Benachrichtigung anzeigen": "Show subject and customer name in the notification", - "Betreff · Ticket-Nr. · Kundenname · E-Mail": "Subject · ticket no. · customer name · email", - "Betrifft": "Affects", - "Betrifft: {}": "Affects: {}", - "Bezeichnung": "Label", - "Bis": "To", - "Bitte Benachrichtigungen im Browser erlauben.": "Please allow notifications in the browser.", - "Bitte eine Datei auswaehlen.": "Please select a file.", - "Bitte eine Ziel-Abteilung wählen.": "Please choose a target department.", - "Bitte mindestens ein Ticket markieren.": "Please select at least one ticket.", - "Bitte schildern Sie uns so viele Details wie möglich, damit wir Ihnen bestmöglich helfen können.": "Please give us as many details as possible so we can help you in the best way.", - "Browser-Push-Benachrichtigungen": "Browser push notifications", - "Buchhaltung": "Accounting", - "Bundesland": "Federal state", - "Bündeln Sie mehrere Kundenkonten unter einer Firma/Organisation. Kontakte werden unter „Kunden“ zugeordnet.": "Group several customer accounts under one company/organization. Contacts are assigned under \"Customers\".", - "CSV exportieren": "Export CSV", - "Chat starten": "Start chat", - "Chatverlauf (an Kunde, nach Chatende)": "Chat transcript (to customer, after chat ends)", - "Chatverlauf per E-Mail an den Kunden senden, sobald ein Mitarbeiter den Chat beendet": "Send the chat transcript to the customer by email as soon as a staff member ends the chat", - "Checkbox (Ja/Nein)": "Checkbox (yes/no)", - "Copyright © {} – Alle Rechte vorbehalten.": "Copyright © {} – All rights reserved.", - "Cron-Job einrichten:": "Set up cron job:", - "Cron-Jobs": "Cron jobs", - "Cron-Status": "Cron status", - "Crontab-Eintrag": "Crontab entry", - "Crontab-Zeilen anzeigen": "Show crontab lines", - "Da gerade niemand direkt verfügbar ist, antworten wir Ihnen per E-Mail, sobald wir Ihre Anfrage bearbeitet haben.": "Nobody is available right now, so we will reply by email as soon as we have looked into your request.", - "Darf Tickets anlegen": "May create tickets", - "Darf Ticketstatus lesen (mit Ticketnummer + E-Mail des Anfragenden)": "May read ticket status (with ticket number + requester's email)", - "Das Ticket wird angelegt und gleich geschlossen. Es gibt keine Benachrichtigung an Mitarbeiter oder Kunden.": "The ticket is created and closed immediately. Neither staff nor customers are notified.", - "Das sind deutsche Texte, die der Sammelmodus gesehen hat. Sie bilden die Vorlage für ein neues Sprachpaket.": "These are the German texts the collection mode has seen. They form the template for a new language pack.", - "Datei auf dem Handy herunterladen und öffnen.": "Download the file on your phone and open it.", - "Datei auswählen": "Choose file", - "Datei herunterladen und starten.": "Download the file and run it.", - "Datei per FTP in den Ordner": "Upload the file via FTP into the folder", - "Datenanonymisierung": "Data anonymization", - "Datenanonymisierung jetzt manuell ausführen?": "Run data anonymization manually now?", - "Datenbank": "Database", - "Datenschutz": "Privacy", - "Datenschutz & Impressum": "Privacy & legal notice", - "Datum": "Date", - "Deaktiviert": "Disabled", - "Der Katalog konnte nicht geladen werden: SSL certificate problem: unable to get local issuer certificate": "The catalog could not be loaded: SSL certificate problem: unable to get local issuer certificate", - "Der Ordner install/ existiert ohne Sperrdatei. Löschen Sie den Ordner install/ vom Server.": "The install/ folder exists without a lock file. Delete the install/ folder from the server.", - "DeskHub Ticketsystem": "DeskHub ticket system", - "Deutsch": "German", - "Die": "The", - "Die Liste der Versionen konnte nicht geladen werden: API HTTP 0": "The list of versions could not be loaded: API HTTP 0", - "Die angeforderte Seite existiert nicht.": "The requested page does not exist.", - "Die meistgelesenen Antworten aus unserer Wissensdatenbank.": "The most-read answers from our knowledge base.", - "Dienst entfernen?": "Remove service?", - "Dienst setzen auf": "Set service to", - "Dienstag": "Tuesday", - "Dienste": "Services", - "Diese Adresse gebt ihr beim ersten Start der App ein, danach meldet ihr euch mit eurem Mitarbeiter-Konto an.": "You enter this address when you first start the app, then sign in with your staff account.", - "Diesen Bericht speichern": "Save this report", - "Dieser Bewertungslink ist ungültig oder abgelaufen.": "This rating link is invalid or has expired.", - "Dieser Chat wurde beendet.": "This chat has ended.", - "Dieser Monat": "This month", - "Dieses Jahr": "This year", - "Dieses Ticket": "This ticket", - "Dieses Ticket wurde nicht gefunden.": "This ticket was not found.", - "Digitalen Assistenten einschalten": "Enable digital assistant", - "Digitaler Assistent": "Digital assistant", - "Discord Webhook-URL": "Discord webhook URL", - "Donnerstag": "Thursday", - "Dringend": "Urgent", - "Dropdown-Auswahl": "Dropdown selection", - "Druckdatum: 24.10.2026 19:44": "Print date: 24.10.2026 19:44", - "Druckdatum: {}": "Print date: {}", - "E-Mail": "Email", - "E-Mail / Domain": "Email / domain", - "E-Mail-Abruf": "Email fetching", - "E-Mail-Abruf (IMAP)": "Email fetching (IMAP)", - "E-Mail-Abruf jetzt manuell ausführen?": "Run email fetching manually now?", - "E-Mail-Adresse": "Email address", - "E-Mail-Adresse *": "Email address *", - "E-Mail-Adresse oder Passwort ist falsch.": "Email address or password is incorrect.", - "E-Mail-Adresse wirklich löschen?": "Really delete this email address?", - "E-Mail-Adressen": "Email addresses", - "E-Mail-Versand aktiv (PHP mail() Fallback)": "Email sending active (PHP mail() fallback)", - "E-Mail-Vorlagen": "Email templates", - "E-Mails / Domains": "Emails / domains", - "Echter Server-Cronjob": "Real server cron job", - "Eigene Inhaltsseiten für das Kundenportal (z. B. Impressum, Datenschutz, Willkommen). Erreichbar unter": "Custom content pages for the customer portal (e.g. legal notice, privacy, welcome). Available at", - "Eigene Kundenportal-Themes": "Custom customer portal themes", - "Eigene Sprache als Plugin erstellen": "Create your own language as a plugin", - "Eigener SMTP": "Own SMTP", - "Eigenes Plugin hochladen": "Upload your own plugin", - "Eigenschaften": "Properties", - "Ein von dir gesetzter Status bleibt, bis der Mitarbeiter ihn selbst ändert oder du ihn erneut änderst.": "A status you set stays until the staff member changes it or you change it again.", - "Eine Adresse pro Zeile, optional mit Anzeigename nach einem Komma (z. B.": "One address per line, optionally with a display name after a comma (e.g.", - "Eine E-Mail oder Domain pro Zeile (oder kommagetrennt). Typ wird automatisch erkannt.": "One email or domain per line (or comma-separated). The type is detected automatically.", - "Eingang": "Inbox", - "Eingangsbestätigung per E-Mail an Kunden senden (nur wenn E-Mail angegeben)": "Send an acknowledgement of receipt to the customer by email (only if an email address was given)", - "Eingeschränkt": "Degraded", - "Einstellungen": "Settings", - "Einträge": "Entries", - "Einzeiliger Text": "Single-line text", - "Einzeln sperren": "Block individually", - "Empfänger (leer = Administratoren), mehrere mit Komma": "Recipients (empty = administrators), several separated by comma", - "Entfernen": "Remove", - "Ereignisse": "Events", - "Erhalten eine Kopie jeder öffentlichen Antwort per E-Mail.": "Receive a copy of every public reply by email.", - "Erinnerung (an Kunde, wenn er nicht reagiert)": "Reminder (to customer, if they do not respond)", - "Erlaubte Datei-Endungen": "Allowed file extensions", - "Erlaubte Dateitypen": "Allowed file types", - "Erlaubte IP-Adressen (optional)": "Allowed IP addresses (optional)", - "Erlaubte IPs": "Allowed IPs", - "Erledigt": "Done", - "Erste Schritte": "Getting started", - "Erstellen": "Create", - "Erstellen Sie ein Kundenkonto, um Tickets zu verfolgen.": "Create a customer account to track your tickets.", - "Erstellen Sie unter Backup eines und prüfen Sie es.": "Create one under Backup and check it.", - "Erstellt": "Created", - "Erstellt:": "Created:", - "Erstreaktion": "First response", - "Erwartete Prüfsumme (SHA-256, optional)": "Expected checksum (SHA-256, optional)", - "Erweiterter Zugriff": "Extended access", - "Erwähnungen": "Mentions", - "Es sind noch keine Teams angelegt. Teams legst du unter": "No teams have been created yet. You create teams under", - "Eskalationsregeln": "Escalation rules", - "Eskalationsregeln jetzt manuell ausführen?": "Run escalation rules manually now?", - "Eskalationsregeln werden stündlich per Cron geprüft (": "Escalation rules are checked hourly via cron (", - "Exportieren (CSV)": "Export (CSV)", - "Externer Link": "External link", - "Externer Link (optional)": "External link (optional)", - "FTP speichern": "Save FTP", - "FTP-Host": "FTP host", - "FTP-Rotation (Kopien auf Server)": "FTP rotation (copies on server)", - "Falls Windows warnt („Der Computer wurde geschützt“):": "If Windows warns (\"Windows protected your PC\"):", - "Favicon (Symbol im Browser-Tab)": "Favicon (icon in the browser tab)", - "Fehler:": "Error:", - "Feiertage": "Holidays", - "Feiertage (0)": "Holidays (0)", - "Feiertage automatisch übernehmen": "Import holidays automatically", - "Feldtyp": "Field type", - "Fertige Designs direkt installieren. Prüfsumme und Signatur werden vor der Installation geprüft.": "Install ready-made designs directly. Checksum and signature are verified before installation.", - "Filter in der": "Filter in the", - "Filter zurücksetzen": "Reset filters", - "Filtern": "Filter", - "Firmenlogo": "Company logo", - "Formular": "Form", - "Frage ausprobieren": "Try a question", - "Fragen-Log": "Question log", - "Fragen-Log: Aufbewahrung in Tagen (0 = nichts speichern)": "Question log: retention in days (0 = store nothing)", - "Freitag": "Friday", - "Fällig": "Due", - "Fällig bis": "Due until", - "Für Kunden sichtbar (auf „Neues Ticket“)": "Visible to customers (on \"New ticket\")", - "Für alle Mitarbeiter sichtbar": "Visible to all staff", - "Für automatische Backups den Cron einrichten:": "Set up cron for automatic backups:", - "Gast-Ticket zum Konto hinzufügen": "Add guest ticket to your account", - "Gedruckt: 24.10.2026 19:44": "Printed: 24.10.2026 19:44", - "Gedruckt: {}": "Printed: {}", - "Gefährliche Typen (PHP, EXE, SH etc.) werden immer blockiert – unabhängig von dieser Liste.": "Dangerous types (PHP, EXE, SH etc.) are always blocked – regardless of this list.", - "Gelöscht": "Deleted", - "Gelöst": "Resolved", - "Gelöst diesen Monat": "Resolved this month", - "Gelöst/Geschlossen": "Resolved/Closed", - "Geprüfte Plugins": "Verified plugins", - "Gerade ist niemand verfügbar – wir antworten aber, sobald wir wieder da sind.": "Nobody is available right now – we will reply as soon as we are back.", - "Gesammelte Texte löschen?": "Delete collected texts?", - "Gesammelte Texte: 556": "Collected texts: 556", - "Gesammelte Texte: {#}": "Collected texts: {}", - "Gesamt": "Total", - "Gesamtgröße": "Total size", - "Geschlossen": "Closed", - "Geschäftszeiten": "Business hours", - "Geschäftszeiten für SLA-Berechnung verwenden": "Use business hours for SLA calculation", - "Gespeichert werden: assigned": "Saved: assigned", - "Gespeichert werden: keine Filter (alle Tickets)": "Saved: no filters (all tickets)", - "Gespeichert werden: status": "Saved: status", - "Gespeicherte Ansichten": "Saved views", - "Gespeicherte Zugangsdaten (SMTP, IMAP, Webhooks) sind mit einem eigenen Schlüssel verschlüsselt.": "Stored credentials (SMTP, IMAP, webhooks) are encrypted with a separate key.", - "Gesperrt": "Blocked", - "Gesperrt am": "Blocked on", - "Gesperrte Einträge (0)": "Blocked entries (0)", - "Geöffnet": "Opened", - "Gilt für Hilfe-Thema": "Applies to help topic", - "Gleichbedeutende Wörter": "Synonyms", - "Grund": "Reason", - "Grund (optional)": "Reason (optional)", - "Grund für alle (optional)": "Reason for all (optional)", - "Gruppe": "Group", - "Gruppieren nach": "Group by", - "Guten Abend, {}": "Good evening, {}", - "Guten Morgen, {}": "Good morning, {}", - "Guten Tag, {}": "Hello, {}", - "HTML-Inhalt (Popup)": "HTML content (popup)", - "HTML-Inhalt (öffnet Popup). Ist ein Link gesetzt, wird das HTML-Feld ignoriert.": "HTML content (opens popup). If a link is set, the HTML field is ignored.", - "Handlungsbedarf ·": "Action needed ·", - "Hauptabteilung": "Main department", - "Helpdesk-Status": "Helpdesk status", - "Herkunft": "Origin", - "Hessen": "Hesse", - "Hier finden Sie das Archiv und den Verlauf Ihrer aktuellen und vorherigen Supportanfragen inklusive der Antworten.": "Here you can find the archive and history of your current and previous support requests, including the replies.", - "Hier finden Sie den Verlauf und Status Ihrer aktuellen und bisherigen Supportanfragen.": "Here you can find the history and status of your current and previous support requests.", - "Hier ist noch keine Android-App hinterlegt.": "No Android app has been stored here yet.", - "Hier ist noch keine Windows-App hinterlegt.": "No Windows app has been stored here yet.", - "Hier könnt ihr eigene Plugins als ZIP installieren oder aktualisieren, auch ohne Signatur. Diese Plugins sind": "Here you can install or update your own plugins as ZIP, even without a signature. These plugins are", - "Hilfe-Thema": "Help topic", - "Hilfe-Thema (optional)": "Help topic (optional)", - "Hilfe-Thema setzen": "Set help topic", - "Hilfethema": "Help topic", - "Hilfethema wirklich löschen?": "Really delete this help topic?", - "Hilfethemen": "Help topics", - "Hintergrundbild im dunklen Hero-Bereich. Mind. 1600×500 px, max. 5 MB.": "Background image in the dark hero area. At least 1600×500 px, max. 5 MB.", - "Hinweis für Administratoren: Zum Aktualisieren einer App die neue Datei per FTP in": "Note for administrators: to update an app, upload the new file via FTP to", - "Hinweise": "Notes", - "Hinweise ·": "Notes ·", - "Hinweistext (optional)": "Note text (optional)", - "Hinzufügen": "Add", - "Hoch": "High", - "Hochladen": "Upload", - "Hochladen & installieren": "Upload & install", - "Hochladen →": "Upload →", - "Hohe Priorität": "High priority", - "Häufige Fragen": "Frequently asked questions", - "IP-Adresse": "IP address", - "IP-Adressen sofort beim Speichern kürzen (letztes Oktett entfernen)": "Shorten IP addresses immediately when saving (remove last octet)", - "Ich wurde erwähnt": "I was mentioned", - "Ihr Anliegen": "Your request", - "Ihr Name": "Your name", - "Ihre Bewertung – {}": "Your rating – {}", - "Ihre E-Mail-Adresse": "Your email address", - "Ihre Kontaktdaten": "Your contact details", - "Ihre Nachricht...": "Your message...", - "Ihre Nachricht…": "Your message…", - "Im Zeitraum wurden noch keine Abfragen verschickt.": "No surveys were sent in this period.", - "Immer (zum Testen)": "Always (for testing)", - "Immer an einen bestimmten Mitarbeiter": "Always to a specific staff member", - "Impressum": "Legal notice", - "In 1 Stunde": "In 1 hour", - "In 1 Woche": "In 1 week", - "In 3 Stunden": "In 3 hours", - "In 3 Tagen": "In 3 days", - "In Betrieb": "Operational", - "In Ordner verschieben": "Move to folder", - "In der Datei": "In the file", - "Individuelle Ticket-Felder": "Custom ticket fields", - "Inhalt / Zusammenfassung": "Content / summary", - "Installierte Sprachen": "Installed languages", - "Installierte Version": "Installed version", - "Interne Notiz": "Internal note", - "Interne Notizen": "Internal notes", - "Interner Chat": "Internal chat", - "Interner Kommentar…": "Internal comment…", - "Jahr": "Year", - "Jeder Job kann hier zusätzlich jederzeit sofort manuell gestartet werden.": "Each job can also be started manually at any time here.", - "Jedes Postfach wird beim Abruf (Cronjob": "Each mailbox is queried individually when fetching (cron job", - "Jetzt anmelden": "Sign in now", - "Jetzt ausführen": "Run now", - "Jetzt registrieren": "Register now", - "Kanal (web/email)": "Channel (web/email)", - "Kanal-Einstellungen → Integrationen → Webhooks → Neuer Webhook": "Channel settings → Integrations → Webhooks → New webhook", - "Katalog aktualisieren": "Refresh catalog", - "Kategorie": "Category", - "Kategorie wirklich löschen?": "Really delete this category?", - "Kategorien": "Categories", - "Kein Hilfethema": "No help topic", - "Kein Konto nötig:": "No account needed:", - "Kein Live-Chat ausgewählt": "No live chat selected", - "Kein Logo hinterlegt.": "No logo stored.", - "Kein Titelbild hinterlegt.": "No cover image stored.", - "Kein Token eingetragen (öffentlicher Zugriff).": "No token entered (public access).", - "Kein eigenes Favicon hinterlegt.": "No custom favicon stored.", - "Keine": "None", - "Keine Aufgaben gefunden.": "No tasks found.", - "Keine Erwähnungen vorhanden.": "No mentions.", - "Keine Signatur": "No signature", - "Keine Störungen in den letzten 14 Tagen.": "No incidents in the last 14 days.", - "Keine Zeiteinträge im gewählten Zeitraum.": "No time entries in the selected period.", - "Keine weitere Einstellung nötig.": "No further setting needed.", - "Kennzahlen": "Key figures", - "Klicke rechts auf einen Mitarbeiter": "Click a staff member on the right", - "Kollaboratoren": "Collaborators", - "Kommentieren": "Comment", - "Konfiguration": "Configuration", - "Kontaktdaten": "Contact details", - "Kontakte": "Contacts", - "Konto": "Account", - "Konto erstellen": "Create account", - "Konto erstellen – {}": "Create account – {}", - "Kontodaten": "Account details", - "Kontoinformationen": "Account information", - "Kontotyp": "Account type", - "Kopieren": "Copy", - "Kostenloses Konto erstellen": "Create a free account", - "Kunde": "Customer", - "Kunde nicht gefunden.": "Customer not found.", - "Kunden": "Customers", - "Kunden erinnern, wenn sie auf eine Antwort nicht reagieren (einmalig, vor dem automatischen Schließen)": "Remind customers if they do not respond to a reply (once, before automatic closing)", - "Kunden-Organisationen": "Customer organizations", - "Kundendaten": "Customer data", - "Kundenerinnerung": "Customer reminder", - "Kundenerinnerung jetzt manuell ausführen?": "Run customer reminder manually now?", - "Kundenprofil: {}": "Customer profile: {}", - "Kundenverzeichnis": "Customer directory", - "Kundenzufriedenheit": "Customer satisfaction", - "Kurzbeschreibung (optional)": "Short description (optional)", - "Kurze Zusammenfassung Ihres Problems": "Short summary of your problem", - "Leere Vorlage laden": "Load empty template", - "Legen Sie fest, welche zusätzlichen Bereiche auf der Kundenportal-Startseite angezeigt werden.": "Choose which additional sections are shown on the customer portal home page.", - "Leserecht": "Read permission", - "Letzte 30 Tage": "Last 30 days", - "Letzte 7 Tage": "Last 7 days", - "Letzte Zustellung": "Last delivery", - "Letzter Abruf": "Last fetch", - "Letztes Auto-Backup": "Last auto backup", - "Letztes Backup": "Last backup", - "Link anfordern": "Request link", - "Link nicht gültig": "Link not valid", - "Link-Adresse": "Link address", - "Live-Chat": "Live chat", - "Live-Chat im Kundenportal (Chat-Widget unten rechts, auch ohne Kundenkonto nutzbar)": "Live chat in the customer portal (chat widget at the bottom right, also usable without a customer account)", - "Live-Chat ist derzeit": "Live chat is currently", - "Löschen": "Delete", - "Lösung": "Solution", - "Mail senden nach": "Send email after", - "Manuell": "Manual", - "Manuelles Update": "Manual update", - "Markierte Tickets wirklich unwiderruflich löschen?": "Really delete the selected tickets permanently?", - "Maximale Dateigröße": "Maximum file size", - "Mecklenburg-Vorpommern": "Mecklenburg-Western Pomerania", - "Mehrere Adressen auf einmal anlegen": "Create several addresses at once", - "Mehrere sperren": "Block several", - "Mehrzeiliger Text": "Multi-line text", - "Mein Profil": "My profile", - "Mein Status": "My status", - "Mein Status:": "My status:", - "Meine": "My", - "Meine Erwähnungen": "My mentions", - "Meine Signatur (nicht hinterlegt)": "My signature (not set)", - "Meine Signatur bearbeiten": "Edit my signature", - "Meine Tickets": "My tickets", - "Meine Tickets ansehen": "View my tickets", - "Meine Tickets – {}": "My tickets – {}", - "Melden Sie sich an, um alle Ihre Tickets im Überblick zu sehen.": "Sign in to see all your tickets at a glance.", - "Meldung löschen?": "Delete message?", - "Meldungen": "Messages", - "Mindestens 10 Zeichen mit Groß- und Kleinbuchstaben, einer Ziffer und einem Sonderzeichen.": "At least 10 characters with upper and lower case letters, a digit and a special character.", - "Minuten (5–480). Countdown wird oben rechts angezeigt.": "Minutes (5–480). Countdown is shown at the top right.", - "Minuten ohne Aktivität": "Minutes without activity", - "Mir zugewiesen": "Assigned to me", - "Mit den Apps bearbeitet ihr Tickets am PC oder unterwegs. Beide haben ein helles und dunkles Design.": "With the apps you work on tickets at the PC or on the go. Both have a light and a dark design.", - "Mitarbeiter": "Staff", - "Mitarbeiter (nur bei „Immer an einen bestimmten Mitarbeiter“)": "Staff member (only for \"Always to a specific staff member\")", - "Mitarbeiter auswählen": "Select staff member", - "Mitarbeiter können diese Textbausteine beim Beantworten eines Tickets per Klick in die Antwort einfügen.": "Staff can insert these text snippets into a reply with one click when answering a ticket.", - "Mitarbeiter tippt …": "Agent is typing …", - "Mitarbeiter wirklich löschen?": "Really delete this staff member?", - "Mitarbeiter zuweisen": "Assign staff member", - "Mitarbeiter-Login – {}": "Staff login – {}", - "Mitarbeiter-Login →": "Staff login →", - "Mitarbeiter-Verzeichnis": "Staff directory", - "Mitarbeiterbereich": "Staff area", - "Mitglieder": "Members", - "Mitglieder (2)": "Members (2)", - "Mittwoch": "Wednesday", - "Monat": "Month", - "Monate": "Months", - "Monatlich": "Monthly", - "Montag": "Monday", - "Morgen früh (8:00 Uhr)": "Tomorrow morning (8:00)", - "Nach Priorität": "By priority", - "Nach Status": "By status", - "Nach dem Update Browser-Cache leeren": "Clear the browser cache after the update", - "Nach wie vielen Tagen ohne Kundenreaktion": "After how many days without customer response", - "Nach wie vielen Tagen ohne Reaktion": "After how many days without response", - "Nachricht": "Message", - "Nachricht eingeben...": "Enter message...", - "Nachricht…": "Message…", - "Name der Ansicht": "Name of the view", - "Name der Vorlage": "Name of the template", - "Name des Assistenten": "Name of the assistant", - "Name in der Benachrichtigung (optional)": "Name in the notification (optional)", - "Name oder E-Mail": "Name or email", - "Nebeneinander": "Side by side", - "Neue Abteilung hinzufügen": "Add new department", - "Neue Antwort (an Kunde)": "New reply (to customer)", - "Neue Aufgabe": "New task", - "Neue E-Mail-Adresse": "New email address", - "Neue Kategorie": "New category", - "Neue Kundenantwort": "New customer reply", - "Neue Liste hinzufügen": "Add new list", - "Neue Meldung (Störung oder Wartung)": "New message (incident or maintenance)", - "Neue Organisation": "New organization", - "Neue Priorität hinzufügen": "Add new priority", - "Neue Regel hinzufügen": "Add new rule", - "Neue Rolle hinzufügen": "Add new role", - "Neue Seite hinzufügen": "Add new page", - "Neue Tickets automatisch zuweisen": "Assign new tickets automatically", - "Neue Vorlage": "New template", - "Neuen Agenten hinzufügen": "Add new agent", - "Neuen Chat starten": "Start a new chat", - "Neuen SLA-Plan hinzufügen": "Add new SLA plan", - "Neuen Schlüssel erstellen": "Create new key", - "Neuen Webhook hinzufügen": "Add new webhook", - "Neuer Agent": "New agent", - "Neuer Dienst, z. B. Webseite": "New service, e.g. website", - "Neuer Live-Chat": "New live chat", - "Neues Bild hochladen (JPG, PNG, WEBP · max. 2 MB)": "Upload new image (JPG, PNG, WEBP · max. 2 MB)", - "Neues Feld": "New field", - "Neues Hilfethema hinzufügen": "Add new help topic", - "Neues Passwort": "New password", - "Neues Postfach": "New mailbox", - "Neues Team hinzufügen": "Add new team", - "Neues Ticket": "New ticket", - "Neues Ticket (an Abteilung)": "New ticket (to department)", - "Neues Ticket erstellen": "Create new ticket", - "Neues Ticket eröffnen": "Open a new ticket", - "Neues Ticket – {}": "New ticket – {}", - "Nicht automatisch zuweisen": "Do not assign automatically", - "Nicht für den Produktivbetrieb geeignet. Bitte in": "Not suitable for production use. Please in", - "Nicht prüfbar: die eigene Adresse ließ sich nicht abrufen.": "Cannot be checked: your own address could not be fetched.", - "Nicht zugewiesen": "Unassigned", - "Niedersachsen": "Lower Saxony", - "Niedrig": "Low", - "Niemand. Beobachter bekommen Benachrichtigungen, ohne dass ihnen das Ticket zugewiesen ist.": "Nobody. Watchers receive notifications without the ticket being assigned to them.", - "Noch kein Konto?": "No account yet?", - "Noch kein Postfach angelegt.": "No mailbox created yet.", - "Noch keine API-Schlüssel angelegt.": "No API keys created yet.", - "Noch keine Backups vorhanden.": "No backups available yet.", - "Noch keine Einträge.": "No entries yet.", - "Noch keine Eskalationsregeln. Erstellen Sie eine neue Regel mit dem Button oben.": "No escalation rules yet. Create a new rule with the button above.", - "Noch keine Feiertage eingetragen.": "No holidays entered yet.", - "Noch keine Listen angelegt.": "No lists created yet.", - "Noch keine Muster angelegt.": "No patterns created yet.", - "Noch keine Notizen.": "No notes yet.", - "Noch keine Organisationen angelegt.": "No organizations created yet.", - "Noch keine Plugins installiert.": "No plugins installed yet.", - "Noch keine SLA-Pläne angelegt.": "No SLA plans created yet.", - "Noch keine Seiten angelegt.": "No pages created yet.", - "Noch keine Teams angelegt.": "No teams created yet.", - "Noch keine Ticket-Regeln angelegt.": "No ticket rules created yet.", - "Noch keine Vorlagen.": "No templates yet.", - "Noch keine Webhooks angelegt.": "No webhooks created yet.", - "Noch keine Zeit erfasst.": "No time recorded yet.", - "Noch keine benutzerdefinierten Rollen angelegt.": "No custom roles created yet.", - "Noch keine eigenen Themes hochgeladen.": "No custom themes uploaded yet.", - "Noch keine gespeicherten Ansichten vorhanden.": "No saved views yet.", - "Noch keine individuellen Felder angelegt.": "No custom fields created yet.", - "Noch nie": "Never", - "Nordrhein-Westfalen": "North Rhine-Westphalia", - "Normale Tickets": "Normal tickets", - "Notiz (optional)": "Note (optional)", - "Notiz (optional, z.B. «In Besprechung bis 14:00»)": "Note (optional, e.g. \"In a meeting until 14:00\")", - "Notiz hinzufügen…": "Add note…", - "Notiz speichern": "Save note", - "Notizen (optional)": "Notes (optional)", - "Nur ausfüllen, wenn der Anbieter eine Prüfsumme nennt": "Only fill in if the provider states a checksum", - "Nur ausfüllen, wenn der Anbieter eine Signatur nennt": "Only fill in if the provider states a signature", - "Nur interne Notiz speichern": "Save internal note only", - "Nur nötig, wenn das Repository mit den Releases": "Only needed if the repository with the releases", - "Nur signierte Releases:": "Signed releases only:", - "Nur wenn der Live-Chat ausgeschaltet oder niemand erreichbar ist (Standard)": "Only if live chat is switched off or nobody can be reached (default)", - "Offen": "Open", - "Offene Tickets": "Open tickets", - "Offline (Wartungsmodus)": "Offline (maintenance mode)", - "Offline-Nachricht": "Offline message", - "Ohne Konto: Geben Sie Ihre Ticketnummer und E-Mail-Adresse ein.": "Without an account: enter your ticket number and email address.", - "Online Mitarbeiter": "Staff online", - "Option 1: Datei in den DeskHub-Ordner legen (für große Dateien empfohlen)": "Option 1: put the file in the DeskHub folder (recommended for large files)", - "Option 2: Direkt hochladen (in Teilen von 5 MB, passend zum Limit dieses Servers)": "Option 2: upload directly (in 5 MB parts, matching this server's limit)", - "Optionale Felder beim Anlegen:": "Optional fields when creating:", - "Optionen": "Options", - "Optionen (eine pro Zeile)": "Options (one per line)", - "Ordner mit diesen Dateien packen:": "Pack the folder with these files:", - "Organisation": "Organization", - "Organisationen": "Organizations", - "Passwort": "Password", - "Passwort *": "Password *", - "Passwort eingeben": "Enter password", - "Passwort vergessen": "Forgot password", - "Passwort vergessen – {}": "Forgot password – {}", - "Passwort vergessen?": "Forgot your password?", - "Passwort wiederholen": "Repeat password", - "Passwort ändern": "Change password", - "Pause": "Break", - "Pausiert": "Paused", - "Pflichtfeld": "Required field", - "Pflichtfelder sind mit": "Required fields are marked with", - "Plugins (Hintergrundaufgaben)": "Plugins (background tasks)", - "Plugins (Hintergrundaufgaben) jetzt manuell ausführen?": "Run plugins (background tasks) manually now?", - "Postfach": "Mailbox", - "Postfach / Ordner": "Mailbox / folder", - "Postfächer (E-Mail-Abruf)": "Mailboxes (email fetching)", - "Postfächer für den E-Mail-Abruf": "Mailboxes for email fetching", - "Postfächer verwalten →": "Manage mailboxes →", - "Postfächer werden jetzt direkt bei der jeweiligen": "Mailboxes are now fetched directly at the respective", - "Priorität": "Priority", - "Priorität für Tickets des Assistenten": "Priority for assistant tickets", - "Priorität setzen": "Set priority", - "Priorität wirklich löschen?": "Really delete this priority?", - "Priorität:": "Priority:", - "Prioritäten & SLA-Zeiten": "Priorities & SLA times", - "Prioritäten / SLA": "Priorities / SLA", - "Profil": "Profile", - "Profilbild": "Profile picture", - "Prüfen ·": "Check ·", - "Push fehlgeschlagen:": "Push failed:", - "Push-Benachrichtigungen senden": "Send push notifications", - "Push-Benachrichtigungen sind auf diesem Server nicht verfügbar (OpenSSL-Erweiterung fehlt oder PHP zu alt).": "Push notifications are not available on this server (OpenSSL extension missing or PHP too old).", - "Quelle": "Source", - "Quelltext": "Source code", - "Radio-Auswahl (Punkte)": "Radio selection (dots)", - "Reaktion": "Response", - "Reaktions- und Lösungszeit ab Ticketerstellung bzw. Prioritätsänderung. Mit aktivierten": "Response and resolution time from ticket creation or priority change. With enabled", - "Reaktionszeit (Std)": "Response time (hrs)", - "Rechnungsfrage": "Billing question", - "Rechte": "Permissions", - "Registrierte Kundenkonten und Gast-Anfrager (ohne Konto) aus allen Tickets.": "Registered customer accounts and guest requesters (without account) from all tickets.", - "Reihenfolge": "Order", - "Reihum an die Mitarbeiter der Abteilung": "Round robin among the department's staff", - "Rheinland-Pfalz": "Rhineland-Palatinate", - "Richtung:": "Direction:", - "Rolle": "Role", - "Rolle (für Mitarbeiter)": "Role (for staff)", - "Rolle:": "Role:", - "Rollen": "Roles", - "Rollen legst du unter": "You create roles under", - "Rollenname": "Role name", - "SLA Erste Antwort": "SLA first response", - "SLA Lösung": "SLA resolution", - "SLA überschritten": "SLA breached", - "SLA-Fristen": "SLA deadlines", - "SLA-Plan": "SLA plan", - "SLA-Pläne": "SLA plans", - "SLA-Prüfung": "SLA check", - "SLA-Prüfung jetzt manuell ausführen?": "Run SLA check manually now?", - "SLA-Status": "SLA status", - "SMTP-Server": "SMTP server", - "SMTP-Versand": "SMTP sending", - "SQL-Datei hochladen oder Pfad angeben": "Upload SQL file or enter path", - "SQLite-Modus aktiv:": "SQLite mode active:", - "Sachsen": "Saxony", - "Sachsen-Anhalt": "Saxony-Anhalt", - "Sammelmodus für Übersetzer:": "Collection mode for translators:", - "Samstag": "Saturday", - "Schichtplan bearbeiten": "Edit shift schedule", - "Schlüssel": "Key", - "Schlüssel erstellen": "Create key", - "Schnellfilter": "Quick filters", - "Seit": "Since", - "Seit 24.10.2026 19:44 geöffnet – wird beim Antworten automatisch als Zeit erfasst.": "Open since 24.10.2026 19:44 – time is recorded automatically when you reply.", - "Seite nicht gefunden": "Page not found", - "Seite nicht gefunden – {}": "Page not found – {}", - "Seiten": "Pages", - "Seiten-Verwaltung": "Page management", - "Seitenleiste einblenden": "Show sidebar", - "Seitenleiste einklappen": "Collapse sidebar", - "Senden": "Send", - "Server: 0,00 MB": "Server: 0.00 MB", - "Serveradresse für die Anmeldung": "Server address for sign-in", - "Servicezeit (Std)": "Service time (hrs)", - "Setzen": "Set", - "Sicherheitsprüfung": "Security check", - "Signatur": "Signature", - "Signatur (E-Mail-Fuß für Antworten ohne Mitarbeiter-Signatur)": "Signature (email footer for replies without a staff signature)", - "Signatur (E-Mail-Fuß für eigene Antworten)": "Signature (email footer for own replies)", - "Signatur (optional, Base64)": "Signature (optional, Base64)", - "So nutzt du die API": "How to use the API", - "Sonntag": "Sunday", - "Sortieren nach": "Sort by", - "Sortiermodus:": "Sort mode:", - "Sortierung": "Sorting", - "Spam-/Junk-Ordner": "Spam/junk folder", - "Speichern": "Save", - "Sperre aufheben": "Remove lock", - "Sperren": "Block", - "Sperrliste": "Block list", - "Sperrliste ist leer.": "The block list is empty.", - "Sprachen": "Languages", - "Stand: {} Uhr": "As of: {}", - "Standard": "Default", - "Standard-Berichte": "Default reports", - "Standard-Mitarbeiterrechte (ohne eigene Rolle)": "Default staff permissions (without own role)", - "Standardabteilung": "Default department", - "Standardabteilung (für E-Mail-Tickets ohne Zuordnung)": "Default department (for email tickets without assignment)", - "Standardabteilung verwenden": "Use default department", - "Standardpriorität (optional)": "Default priority (optional)", - "Standardsprache (für alle, die noch keine Flagge gewählt haben)": "Default language (for everyone who has not yet chosen a flag)", - "Startseiten-Inhalte": "Home page content", - "Statistiken": "Statistics", - "Status & Schichten": "Status & shifts", - "Status & Vorschau": "Status & preview", - "Status abfragen:": "Query status:", - "Status der Mitarbeiter ändern (Admin)": "Change staff status (admin)", - "Status nach dem Senden": "Status after sending", - "Status prüfen": "Check status", - "Status setzen": "Set status", - "Statusseite": "Status page", - "Statusseite für Kunden anzeigen (Link „Status“ im Kundenbereich)": "Show status page to customers (link \"Status\" in the customer area)", - "Stille Zeiten (keine Popups)": "Quiet hours (no popups)", - "Strg+F5": "Ctrl+F5", - "Stufe": "Level", - "Stündliche Prüfung. Letzte Ausführung: noch nie": "Hourly check. Last run: never", - "Suchbegriff eingeben …": "Enter a search term …", - "Suche": "Search", - "Suchen": "Search", - "Supportcenter": "Support center", - "Supportcenter-Startseite": "Support center home", - "Supportcenter-Startseite – {}": "Support center home – {}", - "System-Update": "System update", - "Systemstandard": "System default", - "Systemstatus": "System status", - "Systemstatus – {}": "System status – {}", - "Tag hinzufügen": "Add tag", - "Tag-Name": "Tag name", - "Tage": "Days", - "Tage (am besten kürzer als die Frist zum automatischen Schließen)": "Days (preferably shorter than the period for automatic closing)", - "Team-Übersicht": "Team overview", - "Teamleiter": "Team lead", - "Teamname": "Team name", - "Technik": "Technology", - "Technisches Problem": "Technical issue", - "Teilweise eingeschränkt": "Partially degraded", - "Telefon": "Phone", - "Telefonnummer (optional)": "Phone number (optional)", - "Telegram Bot-Token": "Telegram bot token", - "Telegram Chat-ID": "Telegram chat ID", - "Test-Mail senden": "Send test email", - "Testen": "Test", - "Testnachricht an meine Geräte": "Test message to my devices", - "Testnachricht senden": "Send test message", - "Text (Vorschau)": "Text (preview)", - "Text, wenn er keine Antwort findet": "Text if it finds no answer", - "Textbaustein wirklich löschen?": "Really delete this text snippet?", - "Theme hochladen": "Upload theme", - "Theme-Paket": "Theme package", - "Themen": "Topics", - "Themes aus dem Katalog": "Themes from the catalog", - "Thüringen": "Thuringia", - "Ticket #{}": "Ticket #{}", - "Ticket #{} – {}": "Ticket #{1} – {2}", - "Ticket anlegen (JSON). Antwort:": "Create ticket (JSON). Response:", - "Ticket ansehen": "View ticket", - "Ticket ansehen – {}": "View ticket – {}", - "Ticket eingegangen": "Ticket received", - "Ticket erstellen": "Create ticket", - "Ticket erstellt (an Kunde)": "Ticket created (to customer)", - "Ticket hinzufügen": "Add ticket", - "Ticket im Namen eines Kunden anlegen – z.B. bei Telefonanrufen oder Vor-Ort-Anfragen.": "Create a ticket on behalf of a customer – e.g. for phone calls or on-site requests.", - "Ticket inkl. Verlauf unwiderruflich löschen?": "Permanently delete the ticket including its history?", - "Ticket mir zugewiesen": "Ticket assigned to me", - "Ticket schließen (wird angelegt, aber sofort geschlossen)": "Close ticket (is created but closed immediately)", - "Ticket verknüpfen (Ticket-Nr., optional)": "Link ticket (ticket no., optional)", - "Ticket verwerfen (z.B. Spam)": "Discard ticket (e.g. spam)", - "Ticket überfällig (an Admins)": "Ticket overdue (to admins)", - "Ticket(s) anonymisiert (geschlossen/gelöst, älter als 24 Monate).": "ticket(s) anonymized (closed/resolved, older than 24 months).", - "Ticket-Bewertung aktivieren (Kunden können nach Schließung 1–5 Sterne vergeben)": "Enable ticket rating (customers can give 1–5 stars after closing)", - "Ticket-Details": "Ticket details", - "Ticket-Felder": "Ticket fields", - "Ticket-Formular": "Ticket form", - "Ticket-Liste": "Ticket list", - "Ticket-Nachrichten": "Ticket messages", - "Ticket-Nr.:": "Ticket no.:", - "Ticket-Nummer, Betreff, Status": "Ticket number, subject, status", - "Ticket-Regeln": "Ticket rules", - "Ticket-Regeln (Filter)": "Ticket rules (filter)", - "Ticket-Vorlagen": "Ticket templates", - "Ticketaktivität": "Ticket activity", - "Ticketnummer": "Ticket number", - "Ticketnummer oder Betreff suchen…": "Search ticket number or subject…", - "Tickets ({#})": "Tickets ({})", - "Tickets automatisch schließen, wenn der Kunde nach einer Antwort nicht mehr reagiert": "Close tickets automatically if the customer does not respond after a reply", - "Tickets gesamt": "Total tickets", - "Tickets zusammenführen": "Merge tickets", - "Ticketstatus überprüfen": "Check ticket status", - "Titel": "Title", - "Titelbild (Hero-Banner)": "Cover image (hero banner)", - "Token aus Gitea einfügen": "Paste token from Gitea", - "Typ": "Type", - "Täglich": "Daily", - "Um Ihnen weiterhelfen zu können, benötigen wir noch ein paar zusätzli…": "To help you further, we need a few additional details…", - "Unbeantwortet": "Unanswered", - "Untereinander": "Stacked", - "Unterstützt werden SQL-Dumps von osTicket 1.10 bis 1.18 (phpMyAdmin-Export oder": "SQL dumps from osTicket 1.10 to 1.18 are supported (phpMyAdmin export or", - "Update für die Kunden": "Update for the customers", - "Update senden": "Send update", - "Updates: neue Datei laden und darüber installieren. Eure Anmeldung bleibt erhalten.": "Updates: load a new file and install over it. Your sign-in is kept.", - "Ursache gefunden": "Cause found", - "Verbindung testen": "Test connection", - "Verfügbar": "Available", - "Verfügbare Platzhalter:": "Available placeholders:", - "Verfügbarkeit & Schichten": "Availability & shifts", - "Verfügbarkeit wird geprüft…": "Checking availability…", - "Vergangene Meldungen (letzte 14 Tage)": "Past incidents (last 14 days)", - "Verknüpftes Ticket": "Linked ticket", - "Verlauf (1 Nachricht)": "History (1 message)", - "Verlauf und Status Ihrer aktuellen und bisherigen Supportanfragen.": "History and status of your current and previous support requests.", - "Verlauf, Tags und Collaborators werden ins Ziel-Ticket verschoben. Dieses Ticket wird geschlossen.": "History, tags and collaborators are moved to the target ticket. This ticket will be closed.", - "Verlinkter Teil des Textes": "Linked part of the text", - "Verschlüsselung": "Encryption", - "Verwalten": "Manage", - "Verwenden →": "Use →", - "Verzeichnis": "Directory", - "Veröffentlichen": "Publish", - "Vielen Dank für Ihre Nachricht. Wir haben Ihr Anliegen erhalten und k…": "Thank you for your message. We have received your request and…", - "Vielen Dank! Ihr Ticket wurde erstellt.": "Thank you! Your ticket has been created.", - "Von": "From", - "Vorgabe für den Betreff": "Default for the subject", - "Vorhandene Backups": "Existing backups", - "Vorhandene Vorlagen": "Existing templates", - "Vorlage laden": "Load template", - "Vorlagen": "Templates", - "Vorlagen / Textbausteine": "Templates / text snippets", - "Vorname Nachname": "First name last name", - "Vorschau": "Preview", - "Wann ist er aktiv?": "When is it active?", - "Wartet auf Kunde": "Waiting for customer", - "Wartung": "Maintenance", - "Was ist zu tun?": "What needs to be done?", - "Was wird anonymisiert?": "What is anonymized?", - "Website-URL": "Website URL", - "Weitere Aktionen": "More actions", - "Weitere Informationen benötigt": "More information needed", - "Weitere Informationen → Trotzdem ausführen": "More information → Run anyway", - "Wenige Stunden pro Tag (z. B. nur abends) lassen die Fälligkeit in": "A few hours per day (e.g. only evenings) let the due date in", - "Wert": "Value", - "Wie erstelle ich ein Ticket?": "How do I create a ticket?", - "Wie können wir helfen?": "How can we help?", - "Wie lange dauert die Bearbeitung?": "How long does processing take?", - "Wieder geöffnet": "Reopened", - "Wiederkehrende Tickets": "Recurring tickets", - "Wiederkehrende Tickets jetzt manuell ausführen?": "Run recurring tickets manually now?", - "Wiedervorlage": "Snooze", - "Wiedervorlage fällig": "Snooze due", - "Wiedervorlagen": "Snoozes", - "Wiedervorlagen jetzt manuell ausführen?": "Run snoozes manually now?", - "Willkommen zurück, {}": "Welcome back, {}", - "Willkommen, Gast": "Welcome, Guest", - "Willkommen, {}": "Welcome, {}", - "Wir senden Ihnen einen Link zum Zurücksetzen.": "We will send you a reset link.", - "Wird beobachtet": "Being monitored", - "Wird im Browser-Tab, in E-Mails und in der Web-App angezeigt.": "Shown in the browser tab, in emails and in the web app.", - "Wird in E-Mail-Links verwendet. Kein abschließendes /": "Used in email links. No trailing /", - "Wird nur an öffentliche Antworten angehängt, nicht an interne Notizen.": "Only appended to public replies, not to internal notes.", - "Wird untersucht": "Investigating", - "Wird verwendet, wenn ein eingegangenes E-Mail-Ticket als Spam markiert wird.": "Used when an incoming email ticket is marked as spam.", - "Wirklich sperren?": "Really block?", - "Wirksame Rechte": "Effective permissions", - "Wissensdatenbank": "Knowledge base", - "Wissensdatenbank durchsuchen oder direkt ein Ticket eröffnen – wir antworten so schnell wie möglich.": "Search the knowledge base or open a ticket right away – we will reply as quickly as possible.", - "Wissensdatenbank im Kundenportal anzeigen": "Show knowledge base in the customer portal", - "Wissensdatenbank verwalten": "Manage knowledge base", - "Wissensdatenbank – {}": "Knowledge base – {}", - "Woche": "Week", - "Wochenzeiten": "Weekly hours", - "Wonach suchen Sie?": "What are you looking for?", - "Worum geht es?": "What is it about?", - "Wähle die Abteilungen, zu denen der Agent Zugang haben soll.": "Choose the departments the agent should have access to.", - "Wähle, wofür die App ein Popup zeigen soll.": "Choose what the app should show a popup for.", - "Wöchentlich": "Weekly", - "ZIP-Datei": "ZIP file", - "ZIP-Datei von Gitea hochladen und installieren.": "Upload and install a ZIP file from Gitea.", - "Zahl": "Number", - "Zeigt, was der Assistent auf eine Kundenfrage antworten würde (ohne Zähler und ohne Ticket).": "Shows what the assistant would answer to a customer question (without counters and without a ticket).", - "Zeiterfassung": "Time tracking", - "Zeitplan aus": "Schedule off", - "Zeitplan speichern": "Save schedule", - "Zeitzone": "Time zone", - "Ziel": "Target", - "Zielordner": "Target folder", - "Zielverzeichnis": "Target directory", - "Zu einem Zeitpunkt …": "At a point in time …", - "Zufriedenheitsabfrage": "Satisfaction survey", - "Zufriedenheitsabfrage jetzt manuell ausführen?": "Run the satisfaction survey manually now?", - "Zugang": "Access", - "Zugang zum Update-Server": "Access to the update server", - "Zugewiesen": "Assigned", - "Zugewiesen an": "Assigned to", - "Zugewiesen:": "Assigned:", - "Zugriffstoken": "Access token", - "Zuletzt aktiv": "Last active", - "Zuletzt aktualisiert": "Last updated", - "Zuletzt genutzt": "Last used", - "Zuordnung": "Assignment", - "Zurück zur Startseite": "Back to home", - "Zusammenführen": "Merge", - "Zustand jetzt:": "Current state:", - "Zusätzliche Antworten": "Additional answers", - "Zuweisen": "Assign", - "Zuweisen an": "Assign to", - "Zuweisung": "Assignment", - "Zuweisungen änderst du unter": "You change assignments under", - "absteigend": "descending", - "aktiv gerade eben": "active just now", - "an": "on", - "auf": "to", - "ausgeschaltet": "switched off", - "beginnt mit": "starts with", - "bis": "until", - "ein Ticket eröffnen": "open a ticket", - "eingeschaltet": "switched on", - "endet mit": "ends with", - "enthält": "contains", - "enthält nicht": "does not contain", - "gekennzeichnet.": "marked.", - "in Ordnung": "OK", - "in {#} Min": "in {} min", - "in {#} Std {#} Min": "in {1}h {2}m", - "ist genau": "is exactly", - "leer = von überall; sonst kommagetrennt": "empty = from anywhere; otherwise comma-separated", - "mind. 10 Zeichen, Groß-/Klein, Ziffer, Sonderzeichen": "min. 10 characters, upper/lower case, digit, special character", - "nicht vom Herausgeber geprüft": "not verified by the publisher", - "noch keins": "none yet", - "oder": "or", - "oder direkt": "or directly", - "privat": "private", - "um alle Ihre Tickets im Überblick zu behalten.": "to keep all your tickets at a glance.", - "und": "and", - "von": "from", - "vor {#} Min (überfällig)": "{} min ago (overdue)", - "vor {#} Min.": "{} min. ago", - "vor {#} Std {#} Min (überfällig)": "{1}h {2}m ago (overdue)", - "z. B. E-Mail-Versand verzögert": "e.g. email delivery delayed", - "z. B. Ich habe die Nutzerbedingungen gelesen und akzeptiert.": "e.g. I have read and accept the terms of use.", - "z. B. Meine überfälligen": "e.g. My overdue", - "z. B. Mit freundlichen Grüßen Ihr Support-Team": "e.g. Kind regards, your support team", - "z. B. Mit freundlichen Grüßen Max Mustermann": "e.g. Kind regards, Max Mustermann", - "z. B. Monatsbericht Support": "e.g. Monthly support report", - "z. B. Neuer Mitarbeiter": "e.g. New employee", - "z. B. Nutzerbedingungen": "e.g. Terms of use", - "z. B. Passwort zurücksetzen, Rechnung, Versand …": "e.g. reset password, invoice, shipping …", - "z. B. Vertragsnummer": "e.g. Contract number", - "z. B. Website-Kontaktformular": "e.g. Website contact form", - "z. B. Wie setze ich mein Passwort zurück?": "e.g. How do I reset my password?", - "z.B. Import aus alter Sperrliste": "e.g. Import from old block list", - "z.B. Junk, Spam oder INBOX.Junk": "e.g. Junk, Spam or INBOX.Junk", - "z.B. Tag der Deutschen Einheit": "e.g. German Unity Day", - "z.B. Technik-Postfach": "e.g. Technical mailbox", - "z.B. wiederholter Spam": "e.g. repeated spam", - "zählen nur die dort eingetragenen Öffnungszeiten.": "only the opening hours entered there count.", - "{#} Artikel": "{} article(s)", - "{#} Aufrufe": "{} views", - "{#} Tag(e)": "{} day(s)", - "{#} Treffer": "{} hits", - "{} · erstellt am {}": "{1} · created {2}", - "· Handeln": "· Act", - "· Hinweis": "· Notice", - "· In Ordnung": "· OK", - "· Letzte automatische Prüfung: Noch nie": "· Last automatic check: never", - "· Letzter Abruf: Noch nie": "· Last fetch: never", - "· Prüfen": "· Check", - "· über den DeskHub-Push-Dienst, es ist nichts einzurichten": "· via the DeskHub push service, nothing to set up", - "Ältere Backups werden automatisch gelöscht wenn das Limit erreicht wird.": "Older backups are deleted automatically when the limit is reached.", - "Änderungen speichern": "Save changes", - "Öffentlich": "Public", - "Öffentliche Antwort senden": "Send public reply", - "Öffnen Sie zuerst den persönlichen Ticket-Link aus der Ticket-E-Mail in diesem Browser. Anschließend können Sie das Ticket hier Ihrem Konto hinzufügen, wenn die Ticket-E-Mail-Adresse mit Ihrer Konto-E-Mail-Adresse übereinstimmt.": "First open the personal ticket link from the ticket email in this browser. You can then add the ticket to your account here if the ticket email address matches your account email address.", - "Öffnungszeiten je Wochentag": "Opening hours per weekday", - "Ø Erste Antwort": "Ø First response", - "Ø Erstreaktion": "Ø First response", - "Ø Lösungszeit": "Ø Resolution time", - "Überfällig": "Overdue", - "Überschrift": "Heading", - "Übersicht": "Overview", - "– Abteilung wählen –": "– choose department –", - "– Hilfe-Thema wählen –": "– choose help topic –", - "– Interne Notizen, sichtbar für alle Administratoren": "– Internal notes, visible to all administrators", - "– Mitarbeiter wählen –": "– choose staff member –", - "– Priorität wählen –": "– choose priority –", - "– Standard-Mitarbeiterrechte –": "– default staff permissions –", - "– Textbaustein wählen –": "– choose text snippet –", - "– Vorlage wählen –": "– choose template –", - "– auswählen –": "– select –", - "– bitte wählen –": "– please choose –", - "– kein Thema –": "– no topic –", - "– kein bestimmter Dienst –": "– no specific service –", - "– keine –": "– none –", - "– nicht vorgeben –": "– do not preset –", - "– nicht zugewiesen –": "– unassigned –", - "– nicht ändern –": "– do not change –", - "— Abteilung auswählen —": "— select department —", - "— Automatisch (Standardadresse der Abteilung) —": "— Automatic (department default address) —", - "— Keine(r) —": "— None —", - "— Niemand —": "— Nobody —", - "— Standard —": "— Default —", - "— Standardabteilung (bzw. Abteilung des gewählten Themas) —": "— Default department (or department of the chosen topic) —", - "— Systemstandard —": "— System default —", - "— Zeiten der Priorität verwenden —": "— Use the priority's times —", - "ℹ️ Ausführung hochgeladener Dateien": "ℹ️ Execution of uploaded files", - "ℹ️ Erreichbarkeit interner Dateien": "ℹ️ Accessibility of internal files", - "ℹ️ Hinweise": "ℹ️ Notes", - "← Einstellungen": "← Settings", - "← Zum Kundenportal": "← To the customer portal", - "← Zur Anmeldung": "← Back to sign in", - "← Zur Ticket-Liste": "← To the ticket list", - "← Zurück": "← Back", - "→ bleiben erhalten": "→ are kept", - "↓ CSV exportieren": "↓ Export CSV", - "⏰ Automatischer Zeitplan": "⏰ Automatic schedule", - "⏱ Zeiterfassung": "⏱ Time tracking", - "⏱ Zeiterfassung läuft": "⏱ Time tracking running", - "○ Noch kein Postfach eingerichtet": "○ No mailbox set up yet", - "○ deaktiviert": "○ disabled", - "⚙ Einstellungen": "⚙ Settings", - "⚠️ Administratoren ohne Zwei-Faktor-Anmeldung": "⚠️ Administrators without two-factor authentication", - "⚠️ Datenbank: SQLite": "⚠️ Database: SQLite", - "⚠️ Noch kein geprüftes Backup": "⚠️ No verified backup yet", - "⛔ Absender sperren": "⛔ Block sender", - "⛔ Gesperrt": "⛔ Blocked", - "✅ Verschlüsselungsschlüssel gesetzt": "✅ Encryption key set", - "✍ Signatur": "✍ Signature", - "✓ Berichte einsehen": "✓ View reports", - "✓ Die Datenbank ist aktuell": "✓ The database is up to date", - "✓ Interne Notizen schreiben": "✓ Write internal notes", - "✓ Push ist aktiv": "✓ Push is active", - "✓ Tickets beantworten": "✓ Reply to tickets", - "✓ Tickets im Namen von Kunden erstellen": "✓ Create tickets on behalf of customers", - "✓ Tickets schließen/lösen": "✓ Close/resolve tickets", - "✓ Tickets zuweisen (Mitarbeiter/Team)": "✓ Assign tickets (staff/team)", - "✓ Tickets übertragen (Abteilung ändern)": "✓ Transfer tickets (change department)", - "✕ Abteilungen verwalten": "✕ Manage departments", - "✕ Admin-Protokoll einsehen": "✕ View admin log", - "✕ Digitalen Assistenten verwalten": "✕ Manage digital assistant", - "✕ E-Mail-Adressen verwalten": "✕ Manage email addresses", - "✕ E-Mail-Vorlagen verwalten": "✕ Manage email templates", - "✕ Eskalationsregeln verwalten": "✕ Manage escalation rules", - "✕ Filter zurücksetzen": "✕ Reset filters", - "✕ Geschäftszeiten verwalten": "✕ Manage business hours", - "✕ Hilfe-Themen verwalten": "✕ Manage help topics", - "✕ Mitarbeiter verwalten": "✕ Manage staff", - "✕ Organisationen verwalten": "✕ Manage organizations", - "✕ Prioritäten / SLA verwalten": "✕ Manage priorities / SLA", - "✕ Rollen verwalten": "✕ Manage roles", - "✕ Teams verwalten": "✕ Manage teams", - "✕ Textbausteine verwalten": "✕ Manage text snippets", - "✕ Tickets löschen": "✕ Delete tickets", - "✕ Wissensdatenbank verwalten": "✕ Manage knowledge base", - "✕ Zeiterfassung einsehen": "✕ View time tracking", - "❌ Installationsassistent ist nicht gesperrt": "❌ The installation wizard is not locked", - "❌ Website-URL nutzt kein HTTPS": "❌ Website URL does not use HTTPS", - "⬆️ Hochladen & installieren": "⬆️ Upload & install", - "🌐 Web (im Namen)": "🌐 Web (on behalf)", - "👁 Ticket beobachten": "👁 Watch ticket", - "👋 Hallo! Wie können wir Ihnen helfen?": "👋 Hello! How can we help you?", - "👤 Konto": "👤 Account", - "💤 Wiedervorlage": "💤 Snooze", - "💬 Live-Chat": "💬 Live chat", - "💾 Backup jetzt erstellen": "💾 Create backup now", - "📄 Impressum": "📄 Legal notice", - "📎 Datei": "📎 File", - "📞 Telefon": "📞 Phone", - "📡 FTP-Upload": "📡 FTP upload", - "📥 osTicket Import": "📥 osTicket import", - "📱 Android-App: Push-Benachrichtigungen": "📱 Android app: push notifications", - "📱 Android-App: Welche Popups?": "📱 Android app: which popups?", - "🔄 Automatischer Hintergrund-Betrieb (ohne Server-Cronjob)": "🔄 Automatic background operation (without server cron job)", - "🔄 Erneut prüfen": "🔄 Check again", - "🔄 System-Update": "🔄 System update", - "🔒 Datenschutz": "🔒 Privacy", - "🔒 Datenschutzerklärung": "🔒 Privacy policy", - "🔒 Sicherheit": "🔒 Security", - "🔓 freigeben": "🔓 release", - "🔔 Meine Erwähnungen": "🔔 My mentions", - "🔴 Überfällig": "🔴 Overdue", - "🖥 Vor Ort / Intern": "🖥 On site / internal", - "🖨 Drucken": "🖨 Print", - "🖨 Drucken / Als PDF speichern": "🖨 Print / Save as PDF", - "🖨️ Ticket drucken": "🖨️ Print ticket", - "🗄 Datenbank aktualisieren": "🗄 Update database", - "🗑 Ticket löschen": "🗑 Delete ticket", - "🚫 Sperren": "🚫 Block", - "🟡 Bald fällig (< 4 Std.)": "🟡 Due soon (< 4 hrs)", - "🟢 Im Zeitplan": "🟢 On schedule" + "_info": "English language pack for DeskHub. Key = German source text, value = English. {} stands for a changing part, {#} for a number.", + "(Bewertungen im gewählten Zeitraum)": "(ratings in the selected period)", + "(Flagge, höchstens 40 KB),": "(flag, 40 KB at most),", + "(HMAC-SHA256 des Körpers mit diesem Geheimnis), damit dein System die Herkunft prüfen kann.": "(HMAC-SHA256 of the body with this secret) so your system can verify the origin.", + "(Kunde)": "(customer)", + "(Kunden sehen den Assistenten)": "(customers can see the assistant)", + "(Live-Chat ist besetzt": "(live chat is busy", + "(Mitarbeiter)": "(staff)", + "(Nachricht ohne Text, siehe Anhang)": "(message without text, see attachment)", + "(Signatur geprüft)": "(signature verified)", + "(Zum Ändern fehlt das Recht „Teams verwalten“.)": "(You need the “Manage teams” permission to change this.)", + "(aus config/config.php)": "(from config/config.php)", + "(die Datei ist größer als das Upload-Limit des Servers).": "(the file is larger than the server’s upload limit).", + "(gesetzt – leer lassen = unverändert)": "(set – leave empty = unchanged)", + "(nicht hinterlegt)": "(not set)", + "(optional – leer = alle Tickets)": "(optional – empty = all tickets)", + "(optional, nur für Mitarbeiter sichtbar)": "(optional, visible to staff only)", + "(unverändert)": "(unchanged)", + "(verwendet die gespeicherten Werte)": "(uses the saved values)", + "(überfällig)": "(overdue)", + "(„{subject}“) geantwortet und noch nichts von Ihnen gehört. Hat sich Ihr Anliegen erledigt, brauchen Sie nichts zu tun. Haben Sie noch Fragen, antworten Sie einfach.": "(“{subject}”) and have not heard from you yet. If your request is resolved, you do not need to do anything. If you still have questions, simply reply.", + "+ Erfassen": "+ Log time", + "+ Neue Aufgabe": "+ New task", + "+ Neue Regel": "+ New rule", + "+ Neuer Artikel": "+ New article", + "+ Neuer Textbaustein": "+ New text snippet", + "+ Neues Muster": "+ New pattern", + "+ Neues Ticket": "+ New ticket", + "+ Ticket erstellen": "+ Create ticket", + "+ hinzufügen": "+ add", + "0 = aus. Bei neuer Aktivität kommt der vorherige Status zurück.": "0 = off. On new activity the previous status comes back.", + "0 Gerät(e) angemeldet": "0 device(s) signed in", + "1 Tag": "1 day", + "1 Treffer ·": "1 hit ·", + "10 Backups behalten": "Keep 10 backups", + "14 Backups behalten": "Keep 14 backups", + "2 Std": "2 hrs", + "2 Tage": "2 days", + "2FA ist aktuell": "2FA is currently", + "3 Backups behalten": "Keep 3 backups", + "3 Tage": "3 days", + "30 Backups behalten": "Keep 30 backups", + "5 Backups behalten": "Keep 5 backups", + "7 Backups behalten": "Keep 7 backups", + "7 Tage": "7 days", + "8 Std": "8 hrs", + "API-Schlüssel": "API keys", + "API-Schlüssel erstellt:": "API key created:", + "API-Schlüssel erstellt: {}": "API key created: {}", + "API-Schlüssel gelöscht: #": "API key deleted: #", + "API-Schlüssel gelöscht: #{#}": "API key deleted: #{}", + "API-Schlüssel mit dem Recht „Tickets anlegen“ erzeugst du unter Verwalten → API-Schlüssel.": "You create an API key with the “Create tickets” permission under Manage → API keys.", + "API-Schlüssel umgeschaltet: #": "API key toggled: #", + "API-Schlüssel umgeschaltet: #{#}": "API key toggled: #{}", + "Abbrechen": "Cancel", + "Abmelden": "Sign out", + "Abruf": "Fetch", + "Abschnitt 3 – Betreff und Beschreibung": "Section 3 – Subject and description", + "Absender": "Sender", + "Absender sperren…": "Block sender…", + "Absender-E-Mail": "Sender email", + "Absender-Name": "Sender name", + "Absender:": "Sender:", + "Absendername": "Sender name", + "Abteilung": "Department", + "Abteilung (optional)": "Department (optional)", + "Abteilung *": "Department *", + "Abteilung aktualisieren": "Update department", + "Abteilung aktualisiert:": "Department updated:", + "Abteilung aktualisiert: {}": "Department updated: {}", + "Abteilung erstellt.": "Department created.", + "Abteilung erstellt:": "Department created:", + "Abteilung erstellt: {}": "Department created: {}", + "Abteilung für Live-Chat-Tickets": "Department for live chat tickets", + "Abteilung für Tickets des Assistenten": "Department for assistant tickets", + "Abteilung gelöscht.": "Department deleted.", + "Abteilung gelöscht:": "Department deleted:", + "Abteilung gelöscht: {}": "Department deleted: {}", + "Abteilung geändert": "Department changed", + "Abteilung geändert (Sammelaktion):": "Department changed (bulk action):", + "Abteilung geändert (Sammelaktion): {}": "Department changed (bulk action): {}", + "Abteilung nicht gefunden.": "Department not found.", + "Abteilung setzen": "Set department", + "Abteilung wirklich löschen?": "Really delete this department?", + "Abteilung ändern": "Change department", + "Abteilung „Allgemeiner Support“ (nicht hinterlegt)": "Department \"General support\" (not set)", + "Abteilung(en) und": "department(s) and", + "Abteilung, Priorität und Hilfethema stammen aus dem Reiter „Konto“.": "Department, priority and help topic come from the “Account” tab.", + "Abteilung:": "Department:", + "Abteilungen": "Departments", + "Abteilungen und Hilfethemen": "Departments and help topics", + "Abteilungs-E-Mail (optional)": "Department email (optional)", + "Abteilungs-Routing-Tabelle": "Department routing table", + "Abteilungsformular gespeichert:": "Department form saved:", + "Abteilungsformular gespeichert: {}": "Department form saved: {}", + "Abteilungsinformationen": "Department information", + "Abteilungsleiter": "Department head", + "Abteilungszugriff gespeichert.": "Department access saved.", + "Abteilungszugriff geändert für Mitarbeiter #": "Department access changed for staff member #", + "Abteilungszugriff geändert für Mitarbeiter #{#}": "Department access changed for staff member #{}", + "Abteilungsübergreifende Mitarbeiter-Gruppen. Tickets können einem Team statt einem einzelnen Mitarbeiter zugewiesen werden; die Mitglieder werden dabei benachrichtigt.": "Cross-department staff groups. Tickets can be assigned to a team instead of a single staff member; the members are notified.", + "Achtung:": "Attention:", + "Admin-Protokoll": "Admin log", + "Administrator (alle Rechte)": "Administrator (all rights)", + "Administratoren haben immer alle Rechte. Die Rechte einer Rolle gelten für Mitarbeiter mit dieser Rolle – je Abteilung kann ein Mitarbeiter eine andere Rolle haben (Mitarbeiter → Zugang).": "Administrators always have all permissions. A role’s permissions apply to staff with that role – a staff member can have a different role per department (Staff → Access).", + "Administratornotizen": "Administrator notes", + "Adminportal": "Admin portal", + "Adresse(n) hinzugefügt,": "address(es) added,", + "Adresse(n) ließen sich nicht abrufen.)": "address(es) could not be fetched.)", + "Adressen, Priorität und Postfach-Abruf pflegst du unter": "You manage addresses, priority and mailbox fetching under", + "Agent anlegen": "Create agent", + "Agenten": "Agents", + "Aktion nach Abruf": "Action after fetch", + "Aktionen": "Actions", + "Aktiv": "Active", + "Aktiv (auf dem Ticket-Formular sichtbar)": "Active (visible on the ticket form)", + "Aktiv (wird beim Abruf berücksichtigt)": "Active (used when fetching)", + "Aktiv – Anonymisierung läuft täglich via Cron": "Active – anonymization runs daily via cron", + "Aktive Live-Chats (0)": "Active live chats (0)", + "Aktivität": "Activity", + "Aktualisieren": "Refresh", + "Aktuell keine offenen Live-Chats.": "There are currently no open live chats.", + "Aktuell würden": "Currently", + "Aktuelle Filter als Ansicht speichern": "Save current filters as a view", + "Aktuelles Backup geprüft": "Recent backup checked", + "Aktuelles Passwort": "Current password", + "Alle": "All", + "Alle Absender der markierten Tickets sperren und Tickets schließen?": "Block all senders of the selected tickets and close the tickets?", + "Alle Abteilungen": "All departments", + "Alle Administratoren nutzen Zwei-Faktor-Anmeldung": "All administrators use two-factor authentication", + "Alle Artikel durchsuchen": "Browse all articles", + "Alle Ergebnisse": "All results", + "Alle Plugins sind abgeschaltet (Datei": "All plugins are switched off (file", + "Alle Systeme laufen": "All systems operational", + "Alle Textbausteine": "All text snippets", + "Alle Themen": "All topics", + "Alle Themen (oder Formular ohne Themenauswahl)": "All topics (or form without topic selection)", + "Alle Tickets": "All tickets", + "Alle Tickets löschen": "Delete all tickets", + "Alle anlegen": "Create all", + "Alle außer Geschlossen": "All except closed", + "Alle behalten": "Keep all", + "Alle bekannten Datenbank-Änderungen sind eingespielt.": "All known database changes have been applied.", + "Alle eingegebenen Adressen sperren und Tickets schließen?": "Block all entered addresses and close tickets?", + "Alle löschen": "Delete all", + "Alle sperren": "Block all", + "Alle:": "All:", + "Alle: {}": "All: {}", + "Allgemein": "General", + "Allgemeine Anfrage": "General inquiry", + "Allgemeiner Support": "General support", + "Alphabetisch": "Alphabetical", + "Als gelesen markieren": "Mark as read", + "An diesen Tagen laufen keine SLA-Fristen, unabhängig vom Wochentag.": "No SLA deadlines run on these days, regardless of the weekday.", + "Analysieren": "Analyze", + "Android fragt einmalig, ob der Browser Apps installieren darf. Das bitte erlauben.": "Android asks once whether the browser may install apps. Please allow it.", + "Anfrage zu groß.": "Request too large.", + "Anfrage-Quelle": "Request source", + "Anhang": "Attachment", + "Anhang/Anhänge gehören zu Nachrichten, die nicht importiert wurden (Nachrichten zuerst importieren).": "Attachment(s) belong to messages that were not imported (import the messages first).", + "Anhang/Anhänge größer als": "Attachment(s) larger than", + "Anhang/Anhänge unvollständig oder nicht lesbar und übersprungen.": "Attachment(s) incomplete or unreadable and skipped.", + "Anhänge": "Attachments", + "Anhänge (optional, mehrere möglich)": "Attachments (optional, multiple allowed)", + "Anhänge der Nachrichten werden mitgenommen": "Attachments of the messages are included", + "Anmeldedaten und Sitzungen würden unverschlüsselt übertragen. Stellen Sie die Website-URL auf https:// um und richten Sie ein Zertifikat ein.": "Login data and sessions would be transmitted unencrypted. Change the website URL to https:// and set up a certificate.", + "Anmelden": "Sign in", + "Anmelden –": "Log in –", + "Anmelden – {}": "Sign in – {}", + "Anmeldung beim Push-Dienst nicht möglich": "Registration with the push service is not possible", + "Anmeldung für Support-Mitarbeiter und Administratoren.": "Sign-in for support staff and administrators.", + "Anonymisiert": "Anonymized", + "Anonymisierung jetzt ausführen? Dies kann nicht rückgängig gemacht werden.": "Run anonymization now? This cannot be undone.", + "Anordnung der Optionen": "Order of the options", + "Ansicht gelöscht.": "View deleted.", + "Ansicht gespeichert.": "View saved.", + "Ansicht löschen": "Delete view", + "Ansicht nicht gefunden.": "View not found.", + "Ansicht umbenennen": "Rename view", + "Ansichten": "Views", + "Antwort *": "Reply *", + "Antwort / Ticket": "Reply / ticket", + "Antwort angelegt.": "Reply created.", + "Antwort des digitalen Assistenten angelegt (App):": "Digital assistant reply created (app):", + "Antwort des digitalen Assistenten angelegt (App): {}": "Digital assistant reply created (app): {}", + "Antwort des digitalen Assistenten angelegt:": "Digital assistant reply created:", + "Antwort des digitalen Assistenten angelegt: {}": "Digital assistant reply created: {}", + "Antwort des digitalen Assistenten gelöscht (App):": "Digital assistant reply deleted (app):", + "Antwort des digitalen Assistenten gelöscht (App): {}": "Digital assistant reply deleted (app): {}", + "Antwort des digitalen Assistenten gelöscht:": "Digital assistant reply deleted:", + "Antwort des digitalen Assistenten gelöscht: {}": "Digital assistant reply deleted: {}", + "Antwort des digitalen Assistenten geändert (App):": "Digital assistant reply changed (app):", + "Antwort des digitalen Assistenten geändert (App): {}": "Digital assistant reply changed (app): {}", + "Antwort des digitalen Assistenten geändert:": "Digital assistant reply changed:", + "Antwort des digitalen Assistenten geändert: {}": "Digital assistant reply changed: {}", + "Antwort gelöscht.": "Reply deleted.", + "Antwort gesendet.": "Reply sent.", + "Antwort gespeichert.": "Reply saved.", + "Antwort senden": "Send reply", + "Antwort/Notiz zu einem Ticket": "Reply/note on a ticket", + "Antworten": "Replies", + "Antworten / Notiz": "Reply / note", + "Antworten auf häufige Fragen – oft schneller als der Weg über ein Ticket.": "Answers to common questions – often faster than opening a ticket.", + "Antworten von Mitarbeitern, die es in DeskHub nicht gibt (gleiche E-Mail-Adresse nötig), wurden ohne Mitarbeiter übernommen.": "Replies from staff who do not exist in DeskHub (same email address required) were imported without a staff member.", + "Anzeigename": "Display name", + "Anzeigename & URL": "Display name & URL", + "Anzeigename / Basis-Einstellungen geändert:": "Display name / basic settings changed:", + "Anzeigename / Basis-Einstellungen geändert: {}": "Display name / basic settings changed: {}", + "App öffnen, Serveradresse eingeben und anmelden.": "Open the app, enter the server address and sign in.", + "Apps für Mitarbeiter": "Apps for staff", + "Artikel": "Article", + "Artikel bearbeiten": "Edit article", + "Artikel erstellt.": "Article created.", + "Artikel gelöscht.": "Article deleted.", + "Artikel wirklich löschen?": "Really delete this article?", + "Auch Nachrichten durchsuchen": "Also search messages", + "Auf Standard zurücksetzen": "Reset to default", + "Auf Ticket-Ereignisse reagieren (erstellt, Antwort, Status, Zuweisung)": "React to ticket events (created, reply, status, assignment)", + "Auf deinem Konto ist noch kein Android-Gerät angemeldet. Melde dich in der App an (Benachrichtigungen erlauben) und versuche es erneut.": "No Android device is signed in on your account yet. Sign in to the app (allow notifications) and try again.", + "Auf dem Server fehlt der temporäre Ordner für Uploads (upload_tmp_dir). Bitte den Hoster fragen oder die Datei per FTP hochladen (Option 1).": "The server is missing the temporary folder for uploads (upload_tmp_dir). Please ask your host or upload the file via FTP (option 1).", + "Auf dem Server löschen": "Delete on the server", + "Auf diese Abteilung besteht kein Zugriff.": "You do not have access to this department.", + "Auf dieses Ticket besteht kein Zugriff.": "You do not have access to this ticket.", + "Auf später legen": "Snooze", + "Auf „Alle Themen“ belassen, damit das Feld unabhängig vom gewählten Anliegen erscheint.": "Leave on \"All topics\" so the field appears regardless of the chosen request.", + "Aufbewahrungsdauer nach Schließung": "Retention period after closing", + "Aufeinanderfolgende Felder im selben Abschnitt, die zusammen in eine Zeile passen, stehen nebeneinander.": "Consecutive fields in the same section that fit into one row are shown side by side.", + "Aufgabe": "Task", + "Aufgabe erstellt.": "Task created.", + "Aufgabe gelöscht.": "Task deleted.", + "Aufgaben": "Tasks", + "Aufrufe": "Views", + "Aus (Standard): Es steht nur „Neues Ticket #T-123“ drin, Betreff und Kundenname verlassen euren Server nicht. An: Betreff und Name laufen dann über den Push-Dienst und die Server von Google.": "Off (default): only “New ticket #T-123” is shown; subject and customer name do not leave your server. On: subject and name are sent via the push service and Google’s servers.", + "Aus dem Katalog": "From the catalog", + "Aus der App im Browser geöffnet:": "Opened in the browser from the app:", + "Aus der App im Browser geöffnet: {}": "Opened in the browser from the app: {}", + "Ausfall": "Outage", + "Ausführung hochgeladener Dateien": "Execution of uploaded files", + "Ausgeführt.": "Executed.", + "Ausgewählte Nachrichten werden in ein": "Selected messages will be moved to a", + "Auslöser": "Trigger", + "Auswahl:": "Selection:", + "Auto-Antwort senden": "Send auto-reply", + "Auto-Antwort senden (Textbaustein)": "Send auto-reply (text snippet)", + "Automatisch": "Automatic", + "Automatisch (Routing-Tabelle / globale Standardabteilung)": "Automatic (routing table / global default department)", + "Automatisch erkannte Prüfziele": "Automatically detected check targets", + "Automatisch geprüfte Dienste erhalten ihren Status selbst. Während geplanter Arbeiten kannst du sie auf Wartung setzen. Für nicht erkannte externe Dienste ist eine Prüf-URL nötig.": "Automatically checked services get their status by themselves. During planned maintenance you can set them to maintenance. External services that are not detected need a check URL.", + "Automatisch offline ist ausgeschaltet.": "Automatic offline is switched off.", + "Automatisch offline nach": "Go offline automatically after", + "Automatisch zugewiesen (Einstellung der Abteilung)": "Automatically assigned (department setting)", + "Automatisch zugewiesen (Ticket-Regel)": "Automatically assigned (ticket rule)", + "Automatisch zugewiesen (erste Antwort)": "Automatically assigned (first reply)", + "Automatische Aktionen für neue Tickets (Web-Formular und E-Mail-Eingang), ausgewertet in der Reihenfolge unten. Trifft eine Regel mit Aktion „Ticket verwerfen“ zu, werden keine weiteren Regeln mehr geprüft.": "Automatic actions for new tickets (web form and incoming email), evaluated in the order below. If a rule with the action “Discard ticket” matches, no further rules are checked.", + "Automatische Anonymisierung aktivieren": "Enable automatic anonymization", + "Automatische Antwort gesendet (Ticket-Regel)": "Automatic reply sent (ticket rule)", + "Automatische Backups": "Automatic backups", + "Automatische Backups jetzt manuell ausführen?": "Run automatic backups manually now?", + "Automatische Datenlöschung": "Automatic data deletion", + "Automatische Prüfung gespeichert.": "Automatic check saved.", + "Automatische Prüfung:": "Automatic check:", + "Automatische Prüfung: {}": "Automatic check: {}", + "Automatische Zeiterfassung (misst automatisch, wie lange ein Mitarbeiter ein Ticket geöffnet hat)": "Automatic time tracking (measures how long a staff member has a ticket open)", + "Automatischen Hintergrund-Betrieb aktiv halten": "Keep automatic background operation active", + "Automatischer Logout nach Inaktivität": "Automatic logout after inactivity", + "Automatisches Schließen": "Automatic closing", + "Automatisches Schließen geändert (Mobile App)": "Automatic closing changed (mobile app)", + "Automatisches Schließen jetzt manuell ausführen?": "Run automatic closing manually now?", + "Backup erstellt, aber NICHT wiederherstellbar:": "Backup created, but NOT restorable:", + "Backup erstellt, aber NICHT wiederherstellbar: {}": "Backup created, but NOT restorable: {}", + "Backup erstellt.": "Backup created.", + "Backup fehlgeschlagen – das Plugin wurde nicht aktiviert:": "Backup failed – the plugin was not activated:", + "Backup fehlgeschlagen – das Plugin wurde nicht aktiviert: {}": "Backup failed – the plugin was not activated: {}", + "Backup fehlgeschlagen – die Datenbank wurde nicht verändert:": "Backup failed – the database was not changed:", + "Backup fehlgeschlagen – die Datenbank wurde nicht verändert: {}": "Backup failed – the database was not changed: {}", + "Backup gelöscht:": "Backup deleted:", + "Backup gelöscht: {}": "Backup deleted: {}", + "Backup nicht gefunden.": "Backup not found.", + "Backup-Datei wurde nicht erstellt": "Backup file was not created", + "Backup-Datei wurde nicht erstellt.": "Backup file was not created.", + "Backup-Intervall": "Backup interval", + "Backup-Rotation (lokale Kopien behalten)": "Backup rotation (local copies to keep)", + "Backup-ZIP konnte nicht erstellt werden.": "Backup ZIP could not be created.", + "Backup-Zeitplan gespeichert": "Backup schedule saved", + "Backups (enthalten die komplette Datenbank)": "Backups (contain the complete database)", + "Backups enthalten alle Dateien inkl.": "Backups contain all files incl.", + "Backups im alten Format können nicht automatisch wiederhergestellt werden. Bitte ein neues Backup erstellen.": "Backups in the old format cannot be restored automatically. Please create a new backup.", + "Backups liegen in": "Backups are stored in", + "Backups vorhanden": "Backups available", + "Backups werden automatisch vor jedem Update erstellt": "Backups are created automatically before every update", + "Backups werden nach der Erstellung automatisch per FTP übertragen.": "Backups are transferred automatically via FTP after creation.", + "Baden-Württemberg": "Baden-Württemberg", + "Bausteine in der Seitenleiste der Ticketansicht": "Blocks in the sidebar of the ticket view", + "Bayern": "Bavaria", + "Beantwortet": "Answered", + "Bearbeiten": "Edit", + "Bedingungen": "Conditions", + "Begrüßung": "Greeting", + "Behoben": "Resolved", + "Bei einer": "For a", + "Bei schweren Fehlern auf der Webseite eine E-Mail senden": "Send an email on serious errors on the website", + "Bei weiteren Fragen antworten Sie einfach direkt auf diese E-Mail.": "If you have further questions, simply reply directly to this email.", + "Beide Tickets erhalten einen Log-Eintrag": "Both tickets receive a log entry", + "Beim Öffnen automatisch zugewiesen": "Automatically assigned when opened", + "Beim Öffnen automatisch zuweisen (ein noch nicht zugewiesenes Ticket geht an den Mitarbeiter, der es öffnet)": "Assign automatically on open (an unassigned ticket goes to the staff member who opens it)", + "Beliebte Artikel": "Popular articles", + "Beliebte Artikel auf der Startseite ausgeblendet": "Popular articles on the home page hidden", + "Beliebte Artikel auf der Startseite eingeblendet": "Popular articles on the home page shown", + "Benachrichtigungen": "Notifications", + "Benachrichtigungen erhalten bei:": "Receive notifications for:", + "Benachrichtigungen erhalten bei: {}": "Receive notifications for: {}", + "Benachrichtigungen geändert": "Notifications changed", + "Benachrichtigungseinstellungen gespeichert.": "Notification settings saved.", + "Benannte Reaktions- und Lösungszeiten, die du Abteilungen und Hilfethemen zuordnest. Ohne Zuordnung gelten die Zeiten der": "Named response and resolution times that you assign to departments and help topics. Without an assignment, the times of the", + "Benutzerdefiniert": "Custom", + "Benutzerdefinierte Berechtigungssets für Mitarbeiter. Ohne Rolle gelten die Standard-Mitarbeiterrechte.": "Custom permission sets for staff. Without a role, the default staff permissions apply.", + "Benutzerdefinierte Listen": "Custom lists", + "Benutzername": "Username", + "Benutzername / E-Mail": "Username / email", + "Benötigt DeskHub": "Requires DeskHub", + "Beobachter": "Watchers", + "Beobachtetes Ticket": "Watched ticket", + "Beobachtetes Ticket aktualisiert": "Watched ticket updated", + "Berechtigungen": "Permissions", + "Berechtigungen bestätigen": "Confirm permissions", + "Bereich „Beliebte Artikel“ auf der Startseite anzeigen": "Show the \"Popular articles\" section on the home page", + "Bereits registriert?": "Already registered?", + "Bereits vorhandene Ticketnummern wurden übersprungen.": "Already existing ticket numbers were skipped.", + "Bericht erstellen": "Create report", + "Bericht gelöscht.": "Report deleted.", + "Bericht gespeichert.": "Report saved.", + "Bericht nicht gefunden.": "Report not found.", + "Bericht-Baukasten": "Report builder", + "Berichte": "Reports", + "Berichtszeitraum": "Reporting period", + "Beschreiben Sie Ihr Anliegen so detailliert wie möglich…": "Describe your request in as much detail as possible…", + "Beschreiben Sie Ihr Anliegen so genau wie möglich – das hilft uns, schneller zu helfen.": "Describe your request as precisely as possible – it helps us help you faster.", + "Beschreibung": "Description", + "Beschreibung (optional)": "Description (optional)", + "Beschriftung im Footer": "Footer label", + "Beschäftigt": "Busy", + "Betreff": "Subject", + "Betreff & letzte Nachricht": "Subject & last message", + "Betreff des neuen Tickets": "Subject of the new ticket", + "Betreff und Kundenname in der Benachrichtigung anzeigen": "Show subject and customer name in the notification", + "Betreff · Ticket-Nr. · Kundenname · E-Mail": "Subject · ticket no. · customer name · email", + "Betreff, Nummer, Status, Priorität, Abteilung, Hilfethema, zugewiesener Mitarbeiter (über gleiche E-Mail-Adresse), Zeitstempel. Gelöschte Tickets werden ausgelassen.": "Subject, number, status, priority, department, help topic, assigned staff member (via the same email address), timestamps. Deleted tickets are left out.", + "Betreff:": "Subject:", + "Betreff: {}": "Subject: {}", + "Betrifft": "Affects", + "Betrifft: {}": "Affects: {}", + "Bewahren Sie diese Ticketnummer gut auf – damit können Sie den Status Ihrer Anfrage jederzeit auch ohne Kundenkonto unter": "Keep this ticket number safe – with it you can check the status of your request at any time, even without a customer account, at", + "Bezeichnung": "Label", + "Bezeichnung Betreff": "Label Subject", + "Bilder einfügen mit 🖼️. Zum Verkleinern oder Vergrößern das Bild anklicken: Mit dem runden Anfasser ziehen oder 25 / 50 / 75 % / Original wählen.": "Insert images with 🖼️. To shrink or enlarge an image, click it: drag the round handle or choose 25 / 50 / 75 % / Original.", + "Bis": "To", + "Bitte Benachrichtigungen im Browser erlauben.": "Please allow notifications in the browser.", + "Bitte Name des Anfragers angeben.": "Please enter the requester’s name.", + "Bitte Prüfart und eine gültige Zieladresse prüfen.": "Please check the check type and a valid target address.", + "Bitte Zugangsdaten und Server unter E-Mail-Adressen → Entferntes Postfach prüfen.": "Please check the credentials and server under Email addresses → Remote mailbox.", + "Bitte beschreiben Sie Ihr Anliegen.": "Please describe your request.", + "Bitte bestätigen Sie „{}“.": "Please confirm “{}”.", + "Bitte bestätigen, dass du der Quelle des Plugins vertraust.": "Please confirm that you trust the source of the plugin.", + "Bitte den Dateinamen der SQL-Datei eintragen (das graue Beispiel im Feld ist nur ein Platzhalter).": "Please enter the file name of the SQL file (the grey example in the field is only a placeholder).", + "Bitte die angeforderten Berechtigungen bestätigen.": "Please confirm the requested permissions.", + "Bitte ein Passwort angeben.": "Please enter a password.", + "Bitte ein Thema angeben.": "Please enter a topic.", + "Bitte ein Theme als ZIP-Datei hochladen.": "Please upload a theme as a ZIP file.", + "Bitte ein gültiges Bundesland auswählen.": "Please select a valid federal state.", + "Bitte ein gültiges Datum angeben.": "Please enter a valid date.", + "Bitte ein gültiges Jahr auswählen.": "Please select a valid year.", + "Bitte eine Abteilung wählen.": "Please select a department.", + "Bitte eine Beschreibung eingeben.": "Please enter a description.", + "Bitte eine Bezeichnung angeben.": "Please enter a label.", + "Bitte eine Bilddatei auswählen.": "Please select an image file.", + "Bitte eine Datei auswaehlen.": "Please select a file.", + "Bitte eine Datei auswählen.": "Please select a file.", + "Bitte eine Frage (Titel) und die Antwort angeben.": "Please enter a question (title) and the answer.", + "Bitte eine Frage eingeben.": "Please enter a question.", + "Bitte eine Nachricht angeben (höchstens 50.000 Zeichen).": "Please enter a message (50,000 characters at most).", + "Bitte eine Nachricht eingeben.": "Please enter a message.", + "Bitte eine Priorität wählen.": "Please select a priority.", + "Bitte eine ZIP-Datei auswählen.": "Please select a ZIP file.", + "Bitte eine Ziel-Abteilung wählen.": "Please choose a target department.", + "Bitte eine gültige Abteilung wählen.": "Please select a valid department.", + "Bitte eine gültige E-Mail-Adresse angeben (oder das Feld leer lassen).": "Please enter a valid email address (or leave the field empty).", + "Bitte eine gültige E-Mail-Adresse angeben (oder leer lassen).": "Please enter a valid email address (or leave empty).", + "Bitte eine gültige E-Mail-Adresse angeben.": "Please enter a valid email address.", + "Bitte eine gültige E-Mail-Adresse für den Kollaborator angeben.": "Please enter a valid email address for the collaborator.", + "Bitte eine gültige E-Mail-Adresse wählen.": "Please select a valid email address.", + "Bitte eine gültige Farbe im Format #RRGGBB angeben.": "Please enter a valid color in the format #RRGGBB.", + "Bitte eine gültige Kategorie wählen.": "Please select a valid category.", + "Bitte eine gültige Priorität wählen.": "Please select a valid priority.", + "Bitte eine gültige Standardabteilung wählen.": "Please select a valid default department.", + "Bitte eine gültige URL mit http:// oder https:// angeben.": "Please enter a valid URL with http:// or https://.", + "Bitte eine https://-Adresse angeben.": "Please enter an https:// address.", + "Bitte einen Administrator fragen.": "Please ask an administrator.", + "Bitte einen Anzeigenamen angeben.": "Please enter a display name.", + "Bitte einen Benutzernamen angeben.": "Please enter a username.", + "Bitte einen Betreff angeben (höchstens 255 Zeichen).": "Please enter a subject (255 characters at most).", + "Bitte einen Betreff angeben.": "Please enter a subject.", + "Bitte einen Betreff für das neue Ticket angeben.": "Please enter a subject for the new ticket.", + "Bitte einen Empfänger angeben.": "Please enter a recipient.", + "Bitte einen Inhalt angeben.": "Please enter some content.", + "Bitte einen Kategorienamen angeben.": "Please enter a category name.", + "Bitte einen Namen angeben (höchstens 120 Zeichen).": "Please enter a name (120 characters at most).", + "Bitte einen Namen angeben.": "Please enter a name.", + "Bitte einen Namen angeben. Kategorienamen müssen eindeutig sein.": "Please enter a name. Category names must be unique.", + "Bitte einen Namen für das Theme angeben.": "Please enter a name for the theme.", + "Bitte einen Namen für den Bericht angeben.": "Please enter a name for the report.", + "Bitte einen Namen für den Feiertag angeben.": "Please enter a name for the holiday.", + "Bitte einen Namen für den Schlüssel angeben.": "Please enter a name for the key.", + "Bitte einen Namen für die Ansicht angeben.": "Please enter a name for the view.", + "Bitte einen Namen für die Regel angeben.": "Please enter a name for the rule.", + "Bitte einen Server (Host) angeben.": "Please enter a server (host).", + "Bitte einen Teamnamen angeben.": "Please enter a team name.", + "Bitte einen Text angeben.": "Please enter a text.", + "Bitte einen Titel angeben.": "Please enter a title.", + "Bitte einen URL-Slug angeben (nur a-z, 0-9, -)": "Please enter a URL slug (a-z, 0-9, - only)", + "Bitte einen Wert angeben.": "Please enter a value.", + "Bitte einen Zeitpunkt in der Zukunft wählen (höchstens 1 Jahr).": "Please choose a point in time in the future (1 year at most).", + "Bitte einen aktiven Mitarbeiter für die automatische Zuweisung wählen.": "Please choose an active staff member for automatic assignment.", + "Bitte füllen Sie das Feld „{}“ aus.": "Please fill in the field “{}”.", + "Bitte geben Sie Ihren Namen an.": "Please enter your name.", + "Bitte geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein.": "Please enter the 6-digit code from your authenticator app.", + "Bitte geben Sie eine Nachricht ein.": "Please enter a message.", + "Bitte geben Sie eine gültige E-Mail-Adresse an.": "Please enter a valid email address.", + "Bitte geben Sie eine gültige Ticketnummer ein.": "Please enter a valid ticket number.", + "Bitte geben Sie einen Betreff an.": "Please enter a subject.", + "Bitte gültige SLA-Stunden angeben (größer als 0).": "Please enter valid SLA hours (greater than 0).", + "Bitte gültige Stunden angeben (größer als 0).": "Please enter valid hours (greater than 0).", + "Bitte melden Sie sich an oder bestätigen Sie Ihre E-Mail-Adresse, um dieses Ticket zu sehen.": "Please log in or confirm your email address to see this ticket.", + "Bitte melden Sie sich an, um fortzufahren.": "Please log in to continue.", + "Bitte mindestens ein Ereignis wählen.": "Please select at least one event.", + "Bitte mindestens ein Ticket markieren.": "Please select at least one ticket.", + "Bitte mindestens eine Aktion festlegen.": "Please define at least one action.", + "Bitte mindestens eine Bedingung mit einem Wert angeben.": "Please enter at least one condition with a value.", + "Bitte mindestens eine Nachricht auswählen.": "Please select at least one message.", + "Bitte mindestens eine Option angeben (eine pro Zeile).": "Please enter at least one option (one per line).", + "Bitte schildern Sie uns so viele Details wie möglich, damit wir Ihnen bestmöglich helfen können.": "Please give us as many details as possible so we can help you in the best way.", + "Bitte unter Backup ein neues erstellen.": "Please create a new one under Backup.", + "Bitte userId oder email angeben.": "Please provide userId or email.", + "Bitte wählen Sie 1 bis 5 Sterne.": "Please select 1 to 5 stars.", + "Bitte wählen Sie bei „{}“ eine der angebotenen Möglichkeiten.": "Please choose one of the offered options for “{}”.", + "Bitte wählen Sie ein Anliegen aus.": "Please select a topic.", + "Bitte wählen Sie eine Abteilung.": "Please select a department.", + "Bitte wählen Sie eine Priorität.": "Please select a priority.", + "Bitte wählen Sie mindestens ein Ticket aus.": "Please select at least one ticket.", + "Bot über @BotFather erstellen, Chat-ID via @userinfobot ermitteln.": "Create the bot via @BotFather and find the chat ID via @userinfobot.", + "Brauchen Sie noch Hilfe?": "Do you still need help?", + "Breite des Beschreibungs-Feldes": "Width of the description field", + "Breite des Betreff-Feldes": "Width of the subject field", + "Browser-Push-Benachrichtigungen": "Browser push notifications", + "Buchhaltung": "Accounting", + "Bundesland": "Federal state", + "Buß- und Bettag": "Day of Repentance and Prayer", + "Bündeln Sie mehrere Kundenkonten unter einer Firma/Organisation. Kontakte werden unter „Kunden“ zugeordnet.": "Group several customer accounts under one company/organization. Contacts are assigned under \"Customers\".", + "CSRF-Fehler": "CSRF error", + "CSV exportieren": "Export CSV", + "Chat nicht gefunden oder kein Zugriff.": "Chat not found or no access.", + "Chat starten": "Start chat", + "Chatverlauf (an Kunde, nach Chatende)": "Chat transcript (to customer, after chat ends)", + "Chatverlauf per E-Mail an den Kunden senden, sobald ein Mitarbeiter den Chat beendet": "Send the chat transcript to the customer by email as soon as a staff member ends the chat", + "Checkbox (Ja/Nein)": "Checkbox (yes/no)", + "Code aus der App": "Code from the app", + "Code ungültig. Bitte erneut versuchen.": "Invalid code. Please try again.", + "Copyright © {} – Alle Rechte vorbehalten.": "Copyright © {} – All rights reserved.", + "Cron-Job einrichten:": "Set up cron job:", + "Cron-Jobs": "Cron jobs", + "Cron-Status": "Cron status", + "Cronjob manuell ausgeführt:": "Cron job run manually:", + "Cronjob manuell ausgeführt: {}": "Cron job run manually: {}", + "Crontab installiert. Die 6 Cronjobs laufen jetzt direkt über den Server-Scheduler.": "Crontab installed. The 6 cron jobs now run directly via the server scheduler.", + "Crontab-Eintrag": "Crontab entry", + "Crontab-Zeilen anzeigen": "Show crontab lines", + "Da gerade niemand direkt verfügbar ist, antworten wir Ihnen per E-Mail, sobald wir Ihre Anfrage bearbeitet haben.": "Nobody is available right now, so we will reply by email as soon as we have looked into your request.", + "Danach unter System-Update „Datenbank aktualisieren“ ausführen, falls das Backup von einer älteren Version stammt.": "Afterwards run “Update database” under System update if the backup comes from an older version.", + "Danke für Ihre Bewertung!": "Thank you for your rating!", + "Darf Tickets anlegen": "May create tickets", + "Darf Ticketstatus lesen (mit Ticketnummer + E-Mail des Anfragenden)": "May read ticket status (with ticket number + requester's email)", + "Das Backup": "The backup", + "Das Backup ist nicht wiederherstellbar:": "The backup cannot be restored:", + "Das Backup ist nicht wiederherstellbar: {}": "The backup cannot be restored: {}", + "Das Backup stammt aus einer": "The backup comes from a", + "Das Favicon darf höchstens 1 MB groß sein.": "The favicon may be 1 MB at most.", + "Das Geräte-Token ist ungültig.": "The device token is invalid.", + "Das Hilfethema existiert nicht oder ist deaktiviert.": "The help topic does not exist or is disabled.", + "Das Hilfethema wird noch verwendet und kann nicht gelöscht werden.": "The help topic is still in use and cannot be deleted.", + "Das Log ist noch nicht verfügbar. Bitte im Adminportal unter System-Update „Datenbank aktualisieren“ klicken.": "The log is not available yet. Please click “Update database” in the admin portal under System update.", + "Das Log ist noch nicht verfügbar. Bitte unter System-Update auf „Datenbank aktualisieren“ klicken.": "The log is not available yet. Please click “Update database” under System update.", + "Das Log ist noch nicht verfügbar. Bitte „Datenbank aktualisieren“ ausführen.": "The log is not available yet. Please run “Update database”.", + "Das Log konnte nicht geleert werden. Bitte die Datenbank aktualisieren.": "The log could not be cleared. Please update the database.", + "Das Manifest im Backup ist unlesbar.": "The manifest in the backup is unreadable.", + "Das Paket ist leer oder größer als": "The package is empty or larger than", + "Das Paket konnte nicht gelesen werden.": "The package could not be read.", + "Das Paket passt nicht zur Katalog-Angabe (Name oder Version weichen ab).": "The package does not match the catalog entry (name or version differ).", + "Das Passwort muss mindestens 10 Zeichen lang sein.": "The password must be at least 10 characters long.", + "Das Passwort muss mindestens eine Ziffer enthalten.": "The password must contain at least one digit.", + "Das Passwort muss mindestens einen Großbuchstaben enthalten.": "The password must contain at least one uppercase letter.", + "Das Passwort muss mindestens einen Kleinbuchstaben enthalten.": "The password must contain at least one lowercase letter.", + "Das Plugin bringt Datenbank-Änderungen mit, fordert aber die Berechtigung \"db.migrations\" nicht an.": "The plugin includes database changes but does not request the “db.migrations” permission.", + "Das Plugin hat keine gültige Antwort geliefert.": "The plugin did not return a valid response.", + "Das Plugin konnte nicht installiert werden.": "The plugin could not be installed.", + "Das Plugin läuft weiter, neue Datenbank-Änderungen werden beim nächsten Aufruf automatisch eingespielt.": "The plugin keeps running; new database changes are applied automatically on the next request.", + "Das Plugin wird nach der Installation nicht automatisch aktiviert. Vor dem Aktivieren bestätigt ihr die Berechtigungen, die es anfordert.": "The plugin is not activated automatically after installation. Before activating, you confirm the permissions it requests.", + "Das Plugin „{}“ ({}) hat {#} Fehler verursacht und wurde automatisch deaktiviert. Die Webseite selbst läuft weiter. Die Funktionen des Plugins stehen erst wieder zur Verfügung, wenn Sie es unter Plugins erneut aktivieren.": "The plugin “{}” ({}) caused {} errors and was disabled automatically. The website itself keeps running. The plugin’s functions are only available again when you reactivate it under Plugins.", + "Das Plugin-Verzeichnis ist nicht beschreibbar.": "The plugin directory is not writable.", + "Das Programm \"crontab\" ist auf diesem Server nicht installiert.": "The “crontab” program is not installed on this server.", + "Das Sicherheits-Backup vor der Wiederherstellung ist fehlgeschlagen, es wurde nichts verändert:": "The safety backup before the restore failed, nothing was changed:", + "Das Sicherheits-Backup vor der Wiederherstellung ist fehlgeschlagen, es wurde nichts verändert: {}": "The safety backup before the restore failed, nothing was changed: {}", + "Das Standarddesign ist jetzt aktiv.": "The default design is now active.", + "Das Supportcenter ist derzeit nicht erreichbar.": "The support center is currently unavailable.", + "Das Supportcenter ist derzeit nicht erreichbar. Bitte versuchen Sie es später erneut.": "The support center is currently unavailable. Please try again later.", + "Das Team wird noch verwendet und kann nicht gelöscht werden.": "The team is still in use and cannot be deleted.", + "Das Theme darf maximal 10 MB groß sein.": "The theme may be 10 MB at most.", + "Das Theme enthält zu viele oder zu große Dateien.": "The theme contains too many or too large files.", + "Das Theme konnte nicht aktualisiert und die vorherige Version nicht wiederhergestellt werden.": "The theme could not be updated and the previous version could not be restored.", + "Das Theme konnte nicht aktualisiert werden.": "The theme could not be updated.", + "Das Theme konnte nicht gelöscht werden.": "The theme could not be deleted.", + "Das Theme konnte nicht installiert werden.": "The theme could not be installed.", + "Das Theme konnte nicht vorbereitet werden.": "The theme could not be prepared.", + "Das Theme wurde aktualisiert, aber ein vorhandenes Duplikat konnte nicht entfernt werden.": "The theme was updated, but an existing duplicate could not be removed.", + "Das Theme-Verzeichnis konnte nicht erstellt werden.": "The theme directory could not be created.", + "Das Ticket": "The ticket", + "Das Ticket verschwindet aus den Listen und kommt zum Zeitpunkt zurück, mit Benachrichtigung. Antwortet der Kunde früher, kommt es sofort zurück.": "The ticket disappears from the lists and returns at the set time, with a notification. If the customer replies earlier, it returns immediately.", + "Das Ticket wird angelegt und gleich geschlossen. Es gibt keine Benachrichtigung an Mitarbeiter oder Kunden.": "The ticket is created and closed immediately. Neither staff nor customers are notified.", + "Das Ticket wurde Ihrem Konto hinzugefügt.": "The ticket was added to your account.", + "Das Ticket wurde abgelehnt.": "The ticket was rejected.", + "Das Ticket wurde nicht gefunden.": "The ticket was not found.", + "Das Token sieht ungültig aus (erwartet: 20 bis 200 Zeichen aus Buchstaben, Ziffern, _ - .). Bitte genau so einfügen, wie Gitea es anzeigt.": "The token looks invalid (expected: 20 to 200 characters of letters, digits, _ - .). Please paste it exactly as Gitea shows it.", + "Das ZIP-Archiv enthält einen ungültigen Eintrag.": "The ZIP archive contains an invalid entry.", + "Das ZIP-Archiv enthält einen unsicheren Dateipfad.": "The ZIP archive contains an unsafe file path.", + "Das ZIP-Archiv konnte nicht geöffnet werden.": "The ZIP archive could not be opened.", + "Das Ziel-Ticket wurde bereits in ein anderes Ticket zusammengeführt.": "The target ticket has already been merged into another ticket.", + "Das aktuelle Passwort ist falsch.": "The current password is wrong.", + "Das ausgewählte Theme wurde nicht gefunden.": "The selected theme was not found.", + "Das entpackte Paket ist zu groß.": "The unpacked package is too large.", + "Das folgende Ticket hat die SLA-Lösungsfrist überschritten und benötigt Aufmerksamkeit:": "The following ticket has exceeded the SLA resolution time and needs attention:", + "Das folgende Ticket hat die SLA-Lösungsfrist überschritten und benötigt Aufmerksamkeit: {}": "The following ticket has exceeded the SLA resolution time and needs attention: {}", + "Das gewählte Hilfethema existiert nicht.": "The selected help topic does not exist.", + "Das gewählte Thema gibt es nicht.": "The selected topic does not exist.", + "Das ging nicht. Bitte unter System-Update die Datenbank aktualisieren.": "That did not work. Please update the database under System update.", + "Das ist keine Dienstkonto-Datei (Typ \"service_account\" fehlt). Bitte in der Firebase-Konsole unter Projekteinstellungen → Dienstkonten einen neuen privaten Schlüssel erzeugen.": "This is not a service account file (type “service_account” is missing). In the Firebase console, create a new private key under Project settings → Service accounts.", + "Das ist keine gültige GIF-Datei.": "This is not a valid GIF file.", + "Das ist keine gültige ICO-Datei.": "This is not a valid ICO file.", + "Das ist keine gültige JPG-Datei.": "This is not a valid JPG file.", + "Das ist keine gültige PNG-Datei.": "This is not a valid PNG file.", + "Das ist keine gültige SVG-Datei.": "This is not a valid SVG file.", + "Das ist keine gültige WebP-Datei.": "This is not a valid WebP file.", + "Das sind deutsche Texte, die der Sammelmodus gesehen hat. Sie bilden die Vorlage für ein neues Sprachpaket.": "These are the German texts the collection mode has seen. They form the template for a new language pack.", + "Das ursprüngliche Ticket bleibt mit den verbleibenden Nachrichten erhalten": "The original ticket keeps the remaining messages", + "Das verknüpfte Ticket wurde nicht gefunden.": "The linked ticket was not found.", + "Das vorhandene Plugin konnte nicht ersetzt werden.": "The existing plugin could not be replaced.", + "Das vorhandene Theme konnte nicht für die Aktualisierung vorbereitet werden.": "The existing theme could not be prepared for the update.", + "Das waren viele Fragen in kurzer Zeit. Bitte warten Sie einen Moment.": "That was a lot of questions in a short time. Please wait a moment.", + "Das übergeordnete Thema existiert nicht.": "The parent topic does not exist.", + "Datei auf dem Handy herunterladen und öffnen.": "Download the file on your phone and open it.", + "Datei auswählen": "Choose file", + "Datei fehlt": "File missing", + "Datei herunterladen und starten.": "Download the file and run it.", + "Datei nicht beschreibbar:": "File not writable:", + "Datei nicht beschreibbar: {}": "File not writable: {}", + "Datei nicht gefunden.": "File not found.", + "Datei nicht gefunden:": "File not found:", + "Datei nicht gefunden: {}": "File not found: {}", + "Datei per FTP in den Ordner": "Upload the file via FTP into the folder", + "Datei:": "File:", + "Datei: {}": "File: {}", + "Dateien zu den Nachrichten, bis": "Files for the messages, up to", + "Dateien). Der Stand von vorher steht im Sicherheits-Backup": "files). The previous state is in the safety backup", + "Dateityp nicht erlaubt:": "File type not allowed:", + "Dateityp nicht erlaubt: {}": "File type not allowed: {}", + "Daten löschen": "Delete data", + "Datenanonymisierung": "Data anonymization", + "Datenanonymisierung jetzt manuell ausführen?": "Run data anonymization manually now?", + "Datenanonymisierung manuell ausgeführt:": "Data anonymization run manually:", + "Datenanonymisierung manuell ausgeführt: {}": "Data anonymization run manually: {}", + "Datenbank": "Database", + "Datenbank und Dateien aus diesem Backup zurückspielen": "Restore database and files from this backup", + "Datenbank-Datei": "Database file", + "Datenbank-Update mit Fehlern:": "Database update with errors:", + "Datenbank-Update mit Fehlern: {}": "Database update with errors: {}", + "Datenbank-Änderung des Plugins fehlgeschlagen:": "Plugin database change failed:", + "Datenbank-Änderung des Plugins fehlgeschlagen: {}": "Plugin database change failed: {}", + "Datenbank-Änderung fehlgeschlagen:": "Database change failed:", + "Datenbank-Änderung fehlgeschlagen: {}": "Database change failed: {}", + "Datenschutz": "Privacy", + "Datenschutz & Impressum": "Privacy & legal notice", + "Datenschutzeinstellungen gespeichert.": "Privacy settings saved.", + "Datenschutzeinstellungen geändert": "Privacy settings changed", + "Datensätze,": "records,", + "Datum": "Date", + "Dazu habe ich leider keine passende Antwort. Soll ich ein Ticket für Sie erstellen? Unser Team meldet sich dann per E-Mail.": "Unfortunately I have no suitable answer for that. Shall I create a ticket for you? Our team will then contact you by email.", + "Deaktiviert": "Disabled", + "Deaktiviert (nicht erreichbar)": "Disabled (unreachable)", + "Definiere an welchen Tagen und zu welchen Zeiten dieser Mitarbeiter verfügbar ist. Tickets werden außerhalb der Schicht nicht automatisch zugewiesen.": "Define on which days and at which times this staff member is available. Outside the shift, tickets are not assigned automatically.", + "Dem Release fehlt die Signatur des Herausgebers.": "The release is missing the publisher’s signature.", + "Den Schlüssel bekommst du von der Plugin-Webseite. Ist er hinterlegt, prüft DeskHub bei jeder Installation, ob das Paket wirklich vom Herausgeber stammt und unverändert ist.": "You get the key from the plugin website. Once it is set, DeskHub checks on every installation that the package really comes from the publisher and is unchanged.", + "Der Agent ist Mitglied in folgenden Teams.": "The agent is a member of the following teams.", + "Der Anfragekörper muss gültiges JSON sein.": "The request body must be valid JSON.", + "Der Anzeigename wird automatisch aus dem ZIP-Dateinamen übernommen, zum Beispiel": "The display name is taken automatically from the ZIP file name, for example", + "Der Artikel wurde nicht gefunden.": "The article was not found.", + "Der Assistent beantwortet Fragen von Kunden aus der Wissensdatenbank und aus den Antworten unten. Findet er nichts, fragt er, ob er ein Ticket erstellen soll, und erfragt dafür alles Nötige. Es wird kein externer KI-Dienst verwendet, Fragen bleiben auf diesem Server.": "The assistant answers customer questions from the knowledge base and the answers below. If it finds nothing, it asks whether it should create a ticket and collects everything needed. No external AI service is used; questions stay on this server.", + "Der Assistent ist gerade nicht verfügbar.": "The assistant is not available right now.", + "Der Assistent ist gesperrt. Zusätzlich empfohlen: Ordner install/ vom Server löschen.": "The assistant is locked. Also recommended: delete the install/ folder from the server.", + "Der Authenticator-Code ist ungültig.": "The authenticator code is invalid.", + "Der Befehl \"crontab\" konnte nicht ausgeführt werden.": "The “crontab” command could not be run.", + "Der Code ist neuer als die Datenbank. Vor dem Einspielen wird automatisch ein Backup erstellt.": "The code is newer than the database. A backup is created automatically before it is applied.", + "Der Datei-Upload ist fehlgeschlagen.": "The file upload failed.", + "Der Datenbank-Abzug im Backup ist keine gültige SQLite-Datenbank.": "The database dump in the backup is not a valid SQLite database.", + "Der Datenbank-Abzug im Backup ist nicht lesbar.": "The database dump in the backup is not readable.", + "Der Datenbank-Abzug ist unvollständig (das Ende fehlt).": "The database dump is incomplete (the end is missing).", + "Der Datenbank-Abzug konnte nicht entpackt werden.": "The database dump could not be unpacked.", + "Der Eintrag wurde nicht gefunden.": "The entry was not found.", + "Der Empfänger wurde nicht gefunden.": "The recipient was not found.", + "Der Firebase-Schlüssel wurde vom Server entfernt.": "The Firebase key was removed from the server.", + "Der Herausgeber-Schlüssel ist kein gültiger öffentlicher RSA-Schlüssel (PEM, mindestens 2048 Bit).": "The publisher key is not a valid public RSA key (PEM, at least 2048 bits).", + "Der Hintergrundjob „{}“ hat einen Fehler gemeldet und wurde abgebrochen. Beim nächsten Intervall wird er erneut versucht.": "The background job “{}” reported an error and was aborted. It will be retried at the next interval.", + "Der Import kann gefahrlos wiederholt werden: Vorhandene Kunden und Ticketnummern werden übersprungen, bereits importierte Nachrichten nicht doppelt angelegt. Vorher ein Backup erstellen ist trotzdem empfehlenswert.": "The import can safely be repeated: existing customers and ticket numbers are skipped, and already imported messages are not created twice. Creating a backup beforehand is still recommended.", + "Der Inhalt der Datei „{}“ sieht nach einem Skript aus und ist aus Sicherheitsgründen nicht erlaubt.": "The content of the file “{}” looks like a script and is not allowed for security reasons.", + "Der JSON-Inhalt ist ungültig.": "The JSON content is invalid.", + "Der Katalog enthält keine Plugins.": "The catalog contains no plugins.", + "Der Katalog enthält keine Themes.": "The catalog contains no themes.", + "Der Katalog hat ein ungültiges Format.": "The catalog has an invalid format.", + "Der Katalog konnte nicht geladen werden:": "The catalog could not be loaded:", + "Der Katalog konnte nicht geladen werden: SSL certificate problem: unable to get local issuer certificate": "The catalog could not be loaded: SSL certificate problem: unable to get local issuer certificate", + "Der Katalog konnte nicht geladen werden: {}": "The catalog could not be loaded: {}", + "Der Kunde wurde nicht gefunden.": "The customer was not found.", + "Der Körper ist JSON mit": "The body is JSON with", + "Der Mail-Abruf für das Postfach": "The mail retrieval for the mailbox", + "Der Mail-Abruf wurde seit": "Mail retrieval has not run since", + "Der Mitarbeiter wurde nicht gefunden.": "The staff member was not found.", + "Der Nachrichtentyp ist ungültig.": "The message type is invalid.", + "Der Name ist zu lang (höchstens 80 Zeichen).": "The name is too long (80 characters at most).", + "Der Name wird neben dem Logo nicht mehr angezeigt.": "The name is no longer shown next to the logo.", + "Der Name wird wieder neben dem Logo angezeigt.": "The name is shown next to the logo again.", + "Der Ordner install/ existiert ohne Sperrdatei. Löschen Sie den Ordner install/ vom Server.": "The install/ folder exists without a lock file. Delete the install/ folder from the server.", + "Der Plan ersetzt die Zeiten der Priorität für Tickets, deren": "The plan replaces the times of the priority for tickets whose", + "Der SLA-Plan wird noch verwendet und kann nicht gelöscht werden.": "The SLA plan is still in use and cannot be deleted.", + "Der Schlüssel braucht mindestens ein Recht (Tickets anlegen oder lesen).": "The key needs at least one permission (create or read tickets).", + "Der Server hat keine SMTP-Begrüßung gesendet.": "The server did not send an SMTP greeting.", + "Der Server konnte den Upload-Teil nicht speichern (Speicherplatz oder Schreibrechte). Bitte die Datei per FTP hochladen (Option 1).": "The server could not store the upload part (disk space or write permissions). Please upload the file via FTP (option 1).", + "Der Server lehnt den Upload-Teil ab, er ist größer als erlaubt (upload_max_filesize": "The server rejects the upload part because it is larger than allowed (upload_max_filesize", + "Der Stand von vorher steht im Sicherheits-Backup": "The previous state is in the safety backup", + "Der Status ist ungültig.": "The status is invalid.", + "Der Theme-Autor darf maximal 80 Zeichen lang sein.": "The theme author may be 80 characters at most.", + "Der Theme-Dateiname ist ungültig.": "The theme file name is invalid.", + "Der Theme-Name darf maximal 80 Zeichen lang sein.": "The theme name may be 80 characters at most.", + "Der Theme-Upload ist fehlgeschlagen.": "The theme upload failed.", + "Der Upload ist fehlgeschlagen.": "The upload failed.", + "Der Upload-Teil kam nur unvollständig an (Verbindung unterbrochen). Bitte erneut versuchen.": "The upload part arrived incomplete (connection interrupted). Please try again.", + "Der Web-Server-Benutzer hat keine Berechtigung für crontab.": "The web server user has no permission for crontab.", + "Der Zielstatus ist ungültig.": "The target status is invalid.", + "Der aktuelle Stand der Datenbank wird durch den Stand dieses Backups ersetzt. Vorher wird automatisch ein Sicherheits-Backup erstellt. Programmdateien und die Konfiguration bleiben unverändert.": "The current state of the database is replaced by the state of this backup. A safety backup is created automatically beforehand. Program files and the configuration stay unchanged.", + "Der ausgewählte Mitarbeiter ist nicht verfügbar.": "The selected staff member is not available.", + "Der gewählte Abteilungsleiter existiert nicht oder ist deaktiviert.": "The selected department manager does not exist or is disabled.", + "Der gewählte SLA-Plan existiert nicht.": "The selected SLA plan does not exist.", + "Der gewählte Teamleiter existiert nicht oder ist deaktiviert.": "The selected team leader does not exist or is disabled.", + "Der private Schlüssel in der Datei ist nicht lesbar.": "The private key in the file is not readable.", + "Der since-Zeitstempel ist ungültig.": "The since timestamp is invalid.", + "DeskHub Status Check": "DeskHub status check", + "DeskHub Ticketsystem": "DeskHub ticket system", + "DeskHub erkennt Datenbank, API, konfigurierte Mailserver, Push-Zugang sowie Android- und Windows-Verbindungen automatisch. Android-Apps gelten bei einem API-Kontakt innerhalb der letzten 60 Minuten, Windows-Apps innerhalb der letzten 10 Minuten als verbunden. Statusprüfungen laufen jede Minute; externe Webseiten und weitere Apps benötigen eine Prüf-URL.": "DeskHub automatically detects the database, API, configured mail servers, push access and Android and Windows connections. Android apps count as connected after an API contact within the last 60 minutes, Windows apps within the last 10 minutes. Status checks run every minute; external websites and other apps need a check URL.", + "DeskHub ist noch nicht eingerichtet: Die Datenbank fehlt. Bitte die Installation unter /install/ abschließen.": "DeskHub is not set up yet: the database is missing. Please complete the installation at /install/.", + "DeskHub meldet Ereignisse (Ticket erstellt, beantwortet, Status geändert, zugewiesen) per HTTP-POST an die hinterlegten URLs – z. B. für Chat-Benachrichtigungen oder Ihr eigenes System. Tickets von außen anlegen:": "DeskHub reports events (ticket created, replied, status changed, assigned) via HTTP POST to the stored URLs – e.g. for chat notifications or your own system. Create tickets from outside:", + "DeskHub meldet Ereignisse (Ticket erstellt, beantwortet, Status geändert, zugewiesen) per HTTP-POST an die hinterlegten URLs – z. B. für Chat-Benachrichtigungen oder Ihr eigenes System. Tickets von außen anlegen: {}": "DeskHub reports events (ticket created, replied, status changed, assigned) via HTTP POST to the stored URLs – e.g. for chat notifications or your own system. Create tickets from outside: {}", + "DeskHub-Dienste automatisch hinzufügen": "Add DeskHub services automatically", + "DeskHub-Mitarbeiter-App für Android": "DeskHub staff app for Android", + "DeskHub-Mitarbeiter-App für Windows": "DeskHub staff app for Windows", + "DeskHub: Backup nicht wiederherstellbar": "DeskHub: backup cannot be restored", + "DeskHub: Mail-Abruf für „{}“ fehlgeschlagen": "DeskHub: Mail retrieval for “{}” failed", + "DeskHub: Postfach „{}“ ist wieder erreichbar": "DeskHub: Mailbox “{}” is reachable again", + "Deutsch": "German", + "Die": "The", + "Die Abteilung existiert nicht (mehr).": "The department no longer exists.", + "Die Abteilung ist ungültig.": "The department is invalid.", + "Die Abteilung wird noch verwendet und kann nicht gelöscht werden.": "The department is still in use and cannot be deleted.", + "Die Adresse für Fehler-Mails ist ungültig:": "The address for error emails is invalid:", + "Die Adresse für Fehler-Mails ist ungültig: {}": "The address for error emails is invalid: {}", + "Die Adresse zeigt auf ein internes oder nicht auflösbares Ziel und ist nicht erlaubt.": "The address points to an internal or unresolvable target and is not allowed.", + "Die Adresse zeigt auf ein internes oder nicht auflösbares Ziel.": "The address points to an internal or unresolvable target.", + "Die Anfrage ist zu groß.": "The request is too large.", + "Die Anfrage konnte nicht verarbeitet werden.": "The request could not be processed.", + "Die Anmeldeseite war zu lange geöffnet und die Sitzung ist abgelaufen. Bitte melden Sie sich jetzt noch einmal an.": "The login page was open too long and the session expired. Please log in again.", + "Die Anmeldung ist abgelaufen. Bitte melden Sie sich erneut an.": "The login has expired. Please log in again.", + "Die Antwort gibt es nicht.": "The reply does not exist.", + "Die Antwort ist größer als erlaubt.": "The response is larger than allowed.", + "Die Art der automatischen Zuweisung ist ungültig.": "The type of automatic assignment is invalid.", + "Die Backup-Datei fehlt oder ist leer.": "The backup file is missing or empty.", + "Die Datei ist zu groß (max.": "The file is too large (max.", + "Die Datei ist zu groß (max. 5 MB).": "The file is too large (max. 5 MB).", + "Die Datei konnte nicht gespeichert werden.": "The file could not be saved.", + "Die Datei konnte nicht vollständig gespeichert werden (Speicherplatz voll?).": "The file could not be saved completely (disk full?).", + "Die Datenbank im Backup ist beschädigt:": "The database in the backup is corrupt:", + "Die Datenbank im Backup ist beschädigt: {}": "The database in the backup is corrupt: {}", + "Die Datenbank im Backup lässt sich nicht lesen:": "The database in the backup cannot be read:", + "Die Datenbank im Backup lässt sich nicht lesen: {}": "The database in the backup cannot be read: {}", + "Die Datenbank ist bereits auf dem aktuellen Stand.": "The database is already up to date.", + "Die Datenbank ist noch nicht aktuell. Bitte im Adminportal unter System-Update „Datenbank aktualisieren“ klicken.": "The database is not up to date yet. Please click “Update database” in the admin portal under System update.", + "Die Datenbank ist noch nicht aktuell. Bitte „Datenbank aktualisieren“ ausführen.": "The database is not up to date yet. Please run “Update database”.", + "Die Datenbank ist noch nicht auf dem neuesten Stand. Bitte unter System-Update auf \"Datenbank aktualisieren\" klicken und es dann erneut versuchen.": "The database is not up to date yet. Please click “Update database” under System update and try again.", + "Die Datenbank ist noch nicht auf dem neuesten Stand. Bitte unter System-Update auf „Datenbank aktualisieren“ klicken.": "The database is not up to date yet. Please click “Update database” under System update.", + "Die Datenbankkopie im Backup ist keine gültige SQLite-Datenbank.": "The database copy in the backup is not a valid SQLite database.", + "Die Dienstkonto-Adresse in der Datei ist ungültig.": "The service account address in the file is invalid.", + "Die E-Mail befindet sich bereits in „{}“.": "The email is already in “{}”.", + "Die E-Mail-Adresse ist zu lang.": "The email address is too long.", + "Die Liste der Versionen konnte nicht geladen werden:": "The list of versions could not be loaded:", + "Die Liste der Versionen konnte nicht geladen werden: API HTTP 0": "The list of versions could not be loaded: API HTTP 0", + "Die Liste der Versionen konnte nicht geladen werden: {}": "The list of versions could not be loaded: {}", + "Die Mitarbeiter-ID ist ungültig.": "The staff ID is invalid.", + "Die Nachricht ist zu lang.": "The message is too long.", + "Die PHP-Erweiterung ZIP ist auf diesem Server nicht installiert.": "The PHP extension ZIP is not installed on this server.", + "Die PHP-Erweiterung curl fehlt.": "The PHP extension curl is missing.", + "Die PHP-Erweiterung zip fehlt.": "The PHP extension zip is missing.", + "Die PHP-IMAP-Erweiterung fehlt – eingehende Mails können nicht abgerufen werden.": "The PHP IMAP extension is missing – incoming mail cannot be fetched.", + "Die Parameter number und email sind erforderlich.": "The parameters number and email are required.", + "Die Passwörter stimmen nicht überein.": "The passwords do not match.", + "Die Priorität ist ungültig.": "The priority is invalid.", + "Die Projekt-ID in der Datei ist ungültig.": "The project ID in the file is invalid.", + "Die Prüfsumme (SHA-256) des Downloads stimmt nicht mit dem Katalog überein.": "The checksum (SHA-256) of the download does not match the catalog.", + "Die Prüfsumme (SHA-256) stimmt nicht überein. Erhalten:": "The checksum (SHA-256) does not match. Received:", + "Die Prüfsumme (SHA-256) stimmt nicht überein. Erhalten: {}": "The checksum (SHA-256) does not match. Received: {}", + "Die Push-Benachrichtigungen funktionieren.": "Push notifications are working.", + "Die Reaktionszeit darf nicht länger als die Lösungszeit sein.": "The response time must not be longer than the resolution time.", + "Die Regel wurde nicht gefunden.": "The rule was not found.", + "Die SQL-Datei konnte nicht geöffnet werden.": "The SQL file could not be opened.", + "Die SVG enthält Skripte oder aktive Inhalte und wird nicht angenommen.": "The SVG contains scripts or active content and is not accepted.", + "Die Seite wird verschlüsselt ausgeliefert, Sitzungs-Cookies sind als \"secure\" markiert.": "The page is delivered encrypted, session cookies are marked “secure”.", + "Die Signatur ist ungültig. Das Paket wurde verändert oder stammt nicht vom Herausgeber.": "The signature is invalid. The package was modified or does not come from the publisher.", + "Die Signatur ist ungültig. Das Paket wurde verändert oder stammt nicht vom Herausgeber. Es wird nicht installiert.": "The signature is invalid. The package was modified or does not come from the publisher. It will not be installed.", + "Die Signatur konnte nicht geladen werden (HTTP": "The signature could not be loaded (HTTP", + "Die Sitzung ist abgelaufen oder der Upload-Teil war größer als der Server erlaubt (post_max_size": "The session expired or the upload part was larger than the server allows (post_max_size", + "Die Sitzung ist abgelaufen. Bitte laden Sie die Seite neu.": "The session has expired. Please reload the page.", + "Die Standardabteilung kann nicht gelöscht werden. Bitte zuerst eine andere Abteilung als Standard festlegen.": "The default department cannot be deleted. Please set another department as default first.", + "Die Standardabteilung muss aktiv sein.": "The default department must be active.", + "Die Theme-Metadaten konnten nicht gespeichert werden.": "The theme metadata could not be saved.", + "Die Tickets tragen den Tag „Assistent“ und durchlaufen deine Ticket-Regeln und die automatische Zuweisung der Abteilung. Wählt der Kunde ein Hilfethema, bestimmt dieses Abteilung und Priorität.": "The tickets carry the tag “Assistant” and go through your ticket rules and the department’s automatic assignment. If the customer selects a help topic, it determines department and priority.", + "Die Website-URL ist https, aber DeskHub erkennt die Verbindung nicht als verschlüsselt. Läuft DeskHub hinter einem Reverse-Proxy, tragen Sie dessen Adresse in config/config.php unter site → trusted_proxies ein.": "The website URL is https, but DeskHub does not recognize the connection as encrypted. If DeskHub runs behind a reverse proxy, enter its address in config/config.php under site → trusted_proxies.", + "Die Wiedervorlage muss in der Zukunft liegen (höchstens 1 Jahr).": "The follow-up must be in the future (1 year at most).", + "Die Wissensdatenbank ist derzeit nicht verfügbar.": "The knowledge base is currently unavailable.", + "Die ZIP-Datei ist beschädigt oder unvollständig.": "The ZIP file is damaged or incomplete.", + "Die angeforderte Seite existiert nicht.": "The requested page does not exist.", + "Die automatische Prüfung hat ein Problem gefunden:": "The automatic check found a problem:", + "Die automatische Prüfung hat ein Problem gefunden: {}": "The automatic check found a problem: {}", + "Die hochgeladene Datei ist kein gültiges ZIP-Archiv.": "The uploaded file is not a valid ZIP archive.", + "Die letzte Abteilung kann nicht gelöscht werden.": "The last department cannot be deleted.", + "Die meistgelesenen Antworten aus unserer Wissensdatenbank.": "The most-read answers from our knowledge base.", + "Die mobile Anmeldung ist ausschließlich über HTTPS erlaubt.": "Mobile login is only allowed via HTTPS.", + "Dienst entfernen?": "Remove service?", + "Dienst gespeichert.": "Service saved.", + "Dienst konnte nicht gefunden werden.": "Service could not be found.", + "Dienst setzen auf": "Set service to", + "Dienstag": "Tuesday", + "Dienste": "Services", + "Dienste & automatische Prüfungen": "Services & automatic checks", + "Dies ist eine Test-Mail von DeskHub.": "This is a test email from DeskHub.", + "Diese Absenderadresse ist gesperrt.": "This sender address is blocked.", + "Diese Abteilung ist deaktiviert. Bitte eine aktive Abteilung wählen.": "This department is disabled. Please select an active department.", + "Diese Abteilung kann nicht gelöscht werden, sie wird noch verwendet von:": "This department cannot be deleted, it is still used by:", + "Diese Abteilung kann nicht gelöscht werden, sie wird noch verwendet von: {}": "This department cannot be deleted, it is still used by: {}", + "Diese Adresse gebt ihr beim ersten Start der App ein, danach meldet ihr euch mit eurem Mitarbeiter-Konto an.": "You enter this address when you first start the app, then sign in with your staff account.", + "Diese Adressen liefern Inhalt aus, obwohl sie gesperrt sein müssen:": "These addresses serve content although they must be blocked:", + "Diese Adressen liefern Inhalt aus, obwohl sie gesperrt sein müssen: {}": "These addresses serve content although they must be blocked: {}", + "Diese Ansicht gehört einem anderen Mitarbeiter.": "This view belongs to another staff member.", + "Diese Antworten gelten zusätzlich zur Wissensdatenbank und haben Vorrang. Der Assistent findet sie über die Wörter in der Frage und in den Stichwörtern.": "These answers apply in addition to the knowledge base and take precedence. The assistant finds them via the words in the question and in the keywords.", + "Diese App ist nicht hinterlegt.": "This app is not available.", + "Diese E-Mail-Adresse ist bereits angelegt.": "This email address already exists.", + "Diese E-Mail-Adresse steht auf der Sperrliste.": "This email address is on the block list.", + "Diese E-Mail-Adresse wird bereits von einem anderen Mitarbeiter verwendet.": "This email address is already used by another staff member.", + "Diese Felder erscheinen zusätzlich zu Name, E-Mail, Betreff und Beschreibung auf dem Formular „Neues Ticket erstellen“. Die eingegebenen Werte werden im Ticket angezeigt.": "These fields appear in addition to name, email, subject and description on the “Create new ticket” form. The entered values are shown in the ticket.", + "Diese Funktion ist nur für Administratoren verfügbar.": "This function is only available to administrators.", + "Diese HTTP-Methode wird nicht unterstützt.": "This HTTP method is not supported.", + "Diese Kategorie enthält noch Artikel und kann nicht gelöscht werden.": "This category still contains articles and cannot be deleted.", + "Diese Priorität wird noch von Tickets verwendet und kann nicht gelöscht werden.": "This priority is still used by tickets and cannot be deleted.", + "Diese Seite darf nicht geöffnet werden.": "This page must not be opened.", + "Diese Seite wurde nicht per HTTPS aufgerufen": "This page was not accessed via HTTPS", + "Diese Test-E-Mail bestätigt, dass Ihr SMTP-Versand korrekt eingerichtet ist. 🎉": "This test email confirms that your SMTP sending is set up correctly. 🎉", + "Diese Werte werden beim Anlegen eines Tickets mit diesem Thema automatisch gesetzt.": "These values are set automatically when a ticket with this topic is created.", + "Diese Zusatzfelder erscheinen auf dem Ticketformular, sobald Kunden dieses Hilfethema wählen.": "These additional fields appear on the ticket form as soon as customers choose this help topic.", + "Dieselbe Meldung wird höchstens einmal pro Stunde gesendet. Ausschalten oder Empfänger ändern: Einstellungen → Allgemein.": "The same message is sent once per hour at most. To switch it off or change the recipient: Settings → General.", + "Diesen Bericht speichern": "Save this report", + "Dieser Abteilung sind noch keine Mitarbeiter zugewiesen. Die Zuweisung erfolgt beim jeweiligen Mitarbeiter unter": "No staff are assigned to this department yet. The assignment is done for each staff member under", + "Dieser Artikel wurde nicht gefunden.": "This article was not found.", + "Dieser Bericht gehört einem anderen Mitarbeiter.": "This report belongs to another staff member.", + "Dieser Bewertungslink ist ungültig oder abgelaufen.": "This rating link is invalid or has expired.", + "Dieser Chat wurde beendet.": "This chat has ended.", + "Dieser Dateiname ist nicht erlaubt.": "This file name is not allowed.", + "Dieser Link ist abgelaufen oder wurde schon benutzt. Bitte in der App erneut öffnen.": "This link has expired or has already been used. Please open it again in the app.", + "Dieser Link ist ungültig oder abgelaufen.": "This link is invalid or has expired.", + "Dieser Link ist ungültig oder abgelaufen. Bitte fordern Sie einen neuen Link an.": "This link is invalid or has expired. Please request a new link.", + "Dieser Monat": "This month", + "Dieser Plugin-Name ist reserviert.": "This plugin name is reserved.", + "Dieser Schlüssel darf keine Tickets anlegen.": "This key is not allowed to create tickets.", + "Dieser Schlüssel darf keine Tickets lesen.": "This key is not allowed to read tickets.", + "Dieser Slug wird bereits verwendet.": "This slug is already in use.", + "Dieses Format wird nicht unterstützt.": "This format is not supported.", + "Dieses Jahr": "This year", + "Dieses Passwort ist zu häufig verwendet. Bitte wählen Sie ein sichereres Passwort.": "This password is used too often. Please choose a more secure password.", + "Dieses Plugin ist bereits in der aktuellen Version installiert.": "This plugin is already installed in the current version.", + "Dieses Plugin steht nicht im Katalog.": "This plugin is not in the catalog.", + "Dieses Theme ist bereits in der aktuellen Version installiert.": "This theme is already installed in the current version.", + "Dieses Theme steht nicht im Katalog.": "This theme is not in the catalog.", + "Dieses Ticket": "This ticket", + "Dieses Ticket ist bereits als Spam markiert.": "This ticket is already marked as spam.", + "Dieses Ticket ist geschlossen. Bei weiteren Fragen erstellen Sie bitte ein": "This ticket is closed. If you have further questions, please create a", + "Dieses Ticket ist nicht als Spam markiert.": "This ticket is not marked as spam.", + "Dieses Ticket wurde nicht gefunden.": "This ticket was not found.", + "Dieses Ticket wurde zusammengeführt.": "This ticket has been merged.", + "Dieses ältere Backup enthält eine Kopie der laufenden Datenbankdatei. Sie lässt sich nicht garantiert fehlerfrei wiederherstellen.": "This older backup contains a copy of the running database file. It cannot be guaranteed to restore without errors.", + "Digitalen Assistenten einschalten": "Enable digital assistant", + "Digitaler Assistent": "Digital assistant", + "Discord Webhook-URL": "Discord webhook URL", + "Domain (alle @domain.de)": "Domain (all @domain.com)", + "Donnerstag": "Thursday", + "Download-Adresse nicht erlaubt:": "Download address not allowed:", + "Download-Adresse nicht erlaubt: {}": "Download address not allowed: {}", + "Dringend": "Urgent", + "Dropdown-Auswahl": "Dropdown selection", + "Druckdatum: 24.10.2026 19:44": "Print date: 24.10.2026 19:44", + "Druckdatum: {}": "Print date: {}", + "Du beobachtest dieses Ticket jetzt und bekommst Benachrichtigungen bei Antworten.": "You are now watching this ticket and will receive notifications for replies.", + "Du beobachtest dieses Ticket nicht mehr.": "You are no longer watching this ticket.", + "Du hast bereits eine Ansicht mit diesem Namen.": "You already have a view with this name.", + "E-Mail": "Email", + "E-Mail (SMTP und IMAP)": "Email (SMTP and IMAP)", + "E-Mail / Domain": "Email / domain", + "E-Mail nach „{}“ verschoben.": "Email moved to “{}”.", + "E-Mail(s) nach Spam/Junk verschoben": "email(s) moved to spam/junk", + "E-Mail(s) zurückverschoben": "email(s) moved back", + "E-Mail-Abruf": "Email fetching", + "E-Mail-Abruf (IMAP)": "Email fetching (IMAP)", + "E-Mail-Abruf jetzt manuell ausführen?": "Run email fetching manually now?", + "E-Mail-Adresse": "Email address", + "E-Mail-Adresse *": "Email address *", + "E-Mail-Adresse erstellt.": "Email address created.", + "E-Mail-Adresse erstellt:": "Email address created:", + "E-Mail-Adresse erstellt: {}": "Email address created: {}", + "E-Mail-Adresse gelöscht.": "Email address deleted.", + "E-Mail-Adresse gelöscht:": "Email address deleted:", + "E-Mail-Adresse gelöscht: {}": "Email address deleted: {}", + "E-Mail-Adresse nicht gefunden.": "Email address not found.", + "E-Mail-Adresse oder Passwort ist falsch.": "Email address or password is incorrect.", + "E-Mail-Adresse und Passwort sind erforderlich.": "Email address and password are required.", + "E-Mail-Adresse wirklich löschen?": "Really delete this email address?", + "E-Mail-Adressen": "Email addresses", + "E-Mail-Adressen oder Domains die keine Tickets mehr erstellen dürfen. Beim Sperren werden alle offenen Tickets automatisch geschlossen.": "Email addresses or domains that may no longer create tickets. When blocking, all open tickets are closed automatically.", + "E-Mail-Adressen öffnen": "Open email addresses", + "E-Mail-Informationen und Einstellungen": "Email information and settings", + "E-Mail-Versand aktiv (PHP mail() Fallback)": "Email sending active (PHP mail() fallback)", + "E-Mail-Vorlage geändert:": "Email template changed:", + "E-Mail-Vorlage geändert: {}": "Email template changed: {}", + "E-Mail-Vorlage zurückgesetzt:": "Email template reset:", + "E-Mail-Vorlage zurückgesetzt: {}": "Email template reset: {}", + "E-Mail-Vorlagen": "Email templates", + "E-Mails / Domains": "Emails / domains", + "Echter Server-Cronjob": "Real server cron job", + "Eigene Endpunkte in der Mitarbeiter-API": "Custom endpoints in the staff API", + "Eigene Inhaltsseiten für das Kundenportal (z. B. Impressum, Datenschutz, Willkommen). Erreichbar unter": "Custom content pages for the customer portal (e.g. legal notice, privacy, welcome). Available at", + "Eigene Kundenportal-Themes": "Custom customer portal themes", + "Eigene Menüpunkte und Seiten im Mitarbeiterbereich": "Custom menu items and pages in the staff area", + "Eigene Sprache als Plugin erstellen": "Create your own language as a plugin", + "Eigenen Dienst hinzufügen": "Add custom service", + "Eigenen Schlüssel entfernen": "Remove custom key", + "Eigener SMTP": "Own SMTP", + "Eigenes Formular für diese Abteilung verwenden": "Use a separate form for this department", + "Eigenes Plugin hochladen": "Upload your own plugin", + "Eigenschaften": "Properties", + "Ein Drittel": "One third", + "Ein JSON-Objekt wird erwartet.": "A JSON object is expected.", + "Ein Mitarbeiter": "A staff member", + "Ein Mitarbeiter ist jetzt erreichbar. Laden Sie die Seite neu, um den Live-Chat zu nutzen.": "A staff member is available now. Reload the page to use the live chat.", + "Ein Mitarbeiter mit dieser E-Mail-Adresse existiert bereits.": "A staff member with this email address already exists.", + "Ein SLA-Plan mit diesem Namen existiert bereits.": "An SLA plan with this name already exists.", + "Ein Team mit diesem Namen existiert bereits.": "A team with this name already exists.", + "Ein Thema kann nicht sich selbst oder einem eigenen Unterthema untergeordnet werden.": "A topic cannot be placed under itself or under one of its own subtopics.", + "Ein Theme-Unterverzeichnis konnte nicht erstellt werden.": "A theme subdirectory could not be created.", + "Ein Ticket kann nicht mit sich selbst zusammengeführt werden.": "A ticket cannot be merged with itself.", + "Ein gültiger API-Schlüssel ist erforderlich (Header X-API-Key).": "A valid API key is required (header X-API-Key).", + "Ein gültiges Bearer-Token ist erforderlich.": "A valid bearer token is required.", + "Ein neues Ticket wurde erstellt.": "A new ticket has been created.", + "Ein von dir gesetzter Status bleibt, bis der Mitarbeiter ihn selbst ändert oder du ihn erneut änderst.": "A status you set stays until the staff member changes it or you change it again.", + "Eine Adresse pro Zeile, optional mit Anzeigename nach einem Komma (z. B.": "One address per line, optionally with a display name after a comma (e.g.", + "Eine E-Mail oder Domain pro Zeile (oder kommagetrennt). Typ wird automatisch erkannt.": "One email or domain per line (or comma-separated). The type is detected automatically.", + "Eine Liste mit diesem Namen existiert bereits.": "A list with this name already exists.", + "Eine Priorität mit diesem Namen existiert bereits.": "A priority with this name already exists.", + "Eine Rolle mit diesem Namen existiert bereits.": "A role with this name already exists.", + "Eine Ticketnummer ist erforderlich.": "A ticket number is required.", + "Eine deaktivierte Adresse wird weder für das Routing noch als Absender verwendet; der Abruf pausiert.": "A disabled address is used neither for routing nor as a sender; retrieval is paused.", + "Eine deaktivierte Rolle wird ignoriert; betroffene Mitarbeiter haben dann die Standard-Mitarbeiterrechte.": "A disabled role is ignored; affected staff then have the default staff permissions.", + "Eine kurze Bewertung hilft uns, besser zu werden. Es dauert nur einen Klick.": "A short rating helps us improve. It only takes one click.", + "Eine von:": "One of:", + "Eine von: {}": "One of: {}", + "Eine öffentliche Seite, auf der Ihre Kunden sehen, ob alles läuft, und über Störungen und Wartungen informiert werden.": "A public page where your customers can see whether everything is running and are informed about incidents and maintenance.", + "Eingang": "Inbox", + "Eingangsbestätigung per E-Mail an Kunden senden (nur wenn E-Mail angegeben)": "Send an acknowledgement of receipt to the customer by email (only if an email address was given)", + "Eingehende Mails an diese Adresse landen automatisch in der gewählten Abteilung; ausgehende Antworten dieser Abteilung werden mit dieser Adresse als Absender verschickt.": "Incoming mail to this address lands automatically in the selected department; outgoing replies from this department are sent with this address as the sender.", + "Eingeschränkt": "Degraded", + "Einige ausgewählte Tickets gehören zu Abteilungen, auf die Sie keinen Zugriff haben, und wurden übersprungen.": "Some of the selected tickets belong to departments you do not have access to and were skipped.", + "Einstellungen": "Settings", + "Einstellungen bei neuem Ticket": "Settings for new tickets", + "Einstellungen des digitalen Assistenten geändert": "Digital assistant settings changed", + "Einstellungen des digitalen Assistenten geändert (App)": "Digital assistant settings changed (app)", + "Einstellungen für die Android-Benachrichtigungen gespeichert.": "Settings for Android notifications saved.", + "Einstellungen gespeichert.": "Settings saved.", + "Einstellungen → Allgemein": "Settings → General", + "Einträge": "Entries", + "Einträge entfernt)": "entries removed)", + "Einträge gesperrt,": "entries blocked,", + "Einträge – ein Wert pro Zeile, die Reihenfolge entspricht der Anzeige": "Entries – one value per line, the order matches the display", + "Einträge).": "entries).", + "Einzeiliger Text": "Single-line text", + "Einzeln sperren": "Block individually", + "Empfänger (leer = Administratoren), mehrere mit Komma": "Recipients (empty = administrators), several separated by comma", + "Entfernen": "Remove", + "Entfernen der Server-Crontab fehlgeschlagen:": "Removing the server crontab failed:", + "Entfernen der Server-Crontab fehlgeschlagen: {}": "Removing the server crontab failed: {}", + "Entfernte Zeilen werden gelöscht, bereits in Tickets gespeicherte Werte bleiben dort unverändert sichtbar.": "Removed rows are deleted; values already stored in tickets stay visible there unchanged.", + "Ereignisse": "Events", + "Erhalte Desktop-Benachrichtigungen bei neuen Tickets und Antworten — auch wenn der Browser-Tab nicht aktiv ist. Funktioniert in Chrome, Firefox und Edge. Erfordert HTTPS.": "Receive desktop notifications for new tickets and replies — even when the browser tab is not active. Works in Chrome, Firefox and Edge. Requires HTTPS.", + "Erhalten eine Kopie jeder öffentlichen Antwort per E-Mail.": "Receive a copy of every public reply by email.", + "Erinnerung (an Kunde, wenn er nicht reagiert)": "Reminder (to customer, if they do not respond)", + "Erinnerung zu Ihrem Ticket [#{ticket_number}]": "Reminder about your ticket [#{ticket_number}]", + "Erlaubt sind GET und POST.": "Allowed are GET and POST.", + "Erlaubt: ICO, PNG, JPG, GIF, WebP, SVG.": "Allowed: ICO, PNG, JPG, GIF, WebP, SVG.", + "Erlaubt: PNG, JPG, GIF, SVG.": "Allowed: PNG, JPG, GIF, SVG.", + "Erlaubt: PNG, JPG, GIF.": "Allowed: PNG, JPG, GIF.", + "Erlaubte Datei-Endungen": "Allowed file extensions", + "Erlaubte Dateitypen": "Allowed file types", + "Erlaubte IP-Adressen (optional)": "Allowed IP addresses (optional)", + "Erlaubte IPs": "Allowed IPs", + "Erledigt": "Done", + "Erscheint in jedem Popup neben dem App-Namen („DeskHub“). Den App-Namen selbst kann Android pro Server nicht ändern.": "Appears in every popup next to the app name (“DeskHub”). Android cannot change the app name itself per server.", + "Erste Schritte": "Getting started", + "Erstelle ein neues Backup und prüfe die Einstellungen unter Adminportal → Backup.": "Create a new backup and check the settings under Admin portal → Backup.", + "Erstellen": "Create", + "Erstellen Sie ein Kundenkonto, um Tickets zu verfolgen.": "Create a customer account to track your tickets.", + "Erstellen Sie ein Ticket": "Create a ticket", + "Erstellen Sie unter Backup eines und prüfen Sie es.": "Create one under Backup and check it.", + "Erstellt": "Created", + "Erstellt durch Aufteilen von #": "Created by splitting #", + "Erstellt durch Aufteilen von #{#}": "Created by splitting #{}", + "Erstellt:": "Created:", + "Erstes Ticket erstellen": "Create first ticket", + "Erstreaktion": "First response", + "Erwartete Prüfsumme (SHA-256, optional)": "Expected checksum (SHA-256, optional)", + "Erweiterter Zugriff": "Extended access", + "Erwähnung": "Mention", + "Erwähnung-Mail": "Mention email", + "Erwähnungen": "Mentions", + "Eröffnen Sie ein Ticket – wir antworten so schnell wie möglich.": "Open a ticket – we will reply as quickly as possible.", + "Es gibt keine aktiven Mitarbeiter.": "There are no active staff members.", + "Es ist ein Fehler aufgetreten.": "An error occurred.", + "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.": "An error occurred. Please try again.", + "Es ist ein technischer Fehler aufgetreten. Bitte versuchen Sie es später erneut.": "A technical error occurred. Please try again later.", + "Es ist kein Herausgeber-Schlüssel hinterlegt, die Signatur kann nicht geprüft werden.": "No publisher key is set, the signature cannot be verified.", + "Es ist keine Abteilung eingerichtet.": "No department has been set up.", + "Es ist keine Katalog-Adresse für Themes hinterlegt.": "No catalog address is set for themes.", + "Es ist keine Katalog-Adresse hinterlegt.": "No catalog address is set.", + "Es ist noch keine Katalog-Adresse hinterlegt. Trage unten die Adresse der Plugin-Webseite ein, dann könnt ihr Plugins direkt von dort installieren.": "No catalog address is set yet. Enter the address of the plugin website below, then you can install plugins directly from there.", + "Es ist weiterhin nicht aktiv.": "It is still not active.", + "Es kam kein Upload-Teil an.": "No upload part arrived.", + "Es sind noch keine Dienste eingetragen.": "No services have been entered yet.", + "Es sind noch keine Teams angelegt. Teams legst du unter": "No teams have been created yet. You create teams under", + "Es wurden noch keine Artikel veröffentlicht.": "No articles have been published yet.", + "Eskalationsregel erstellt:": "Escalation rule created:", + "Eskalationsregel erstellt: {}": "Escalation rule created: {}", + "Eskalationsregel gelöscht: #": "Escalation rule deleted: #", + "Eskalationsregel gelöscht: #{#}": "Escalation rule deleted: #{}", + "Eskalationsregel gespeichert.": "Escalation rule saved.", + "Eskalationsregel geändert:": "Escalation rule changed:", + "Eskalationsregel geändert: {}": "Escalation rule changed: {}", + "Eskalationsregeln": "Escalation rules", + "Eskalationsregeln jetzt manuell ausführen?": "Run escalation rules manually now?", + "Eskalationsregeln werden stündlich per Cron geprüft (": "Escalation rules are checked hourly via cron (", + "Exportieren (CSV)": "Export (CSV)", + "Externer Link": "External link", + "Externer Link (optional)": "External link (optional)", + "FTP nicht konfiguriert.": "FTP not configured.", + "FTP speichern": "Save FTP", + "FTP-Backup-Einstellungen gespeichert": "FTP backup settings saved", + "FTP-Einstellungen gespeichert.": "FTP settings saved.", + "FTP-Host": "FTP host", + "FTP-Rotation (Kopien auf Server)": "FTP rotation (copies on server)", + "Falls Sie dies nicht angefordert haben, ignorieren Sie diese E-Mail einfach – es wird nichts verändert.": "If you did not request this, simply ignore this email – nothing will be changed.", + "Falls Windows warnt („Der Computer wurde geschützt“):": "If Windows warns (\"Windows protected your PC\"):", + "Falls du abgemeldet wirst: Der Mitarbeiter-Stand entspricht jetzt dem Backup, bitte neu anmelden.": "If you are logged out: the staff data now matches the backup, please log in again.", + "Falls ein Konto mit dieser E-Mail-Adresse existiert, wurde soeben ein Link zum Zurücksetzen versendet.": "If an account with this email address exists, a reset link has just been sent.", + "Falls ein aktives Mitarbeiterkonto mit dieser E-Mail-Adresse existiert, wurde soeben ein Link zum Zurücksetzen versendet.": "If an active staff account with this email address exists, a reset link has just been sent.", + "Falsches Passwort.": "Wrong password.", + "Favicon (Symbol im Browser-Tab)": "Favicon (icon in the browser tab)", + "Favicon aktualisiert. Browser zeigen Änderungen oft erst nach Neuladen (Strg+F5) oder in einem neuen Tab.": "Favicon updated. Browsers often show changes only after a reload (Ctrl+F5) or in a new tab.", + "Fehlende DeskHub-Dienste und passende Kategorien wurden hinzugefuegt. Vorhandene Eintraege blieben erhalten.": "Missing DeskHub services and matching categories were added. Existing entries were kept.", + "Fehlende werden angelegt, gleichnamige vorhandene wiederverwendet. Tickets landen damit in der richtigen Abteilung.": "Missing ones are created, existing ones with the same name are reused. Tickets thus end up in the right department.", + "Fehler beim Suchen.": "Error while searching.", + "Fehler beim Zusammenführen:": "Error while merging:", + "Fehler beim Zusammenführen: {}": "Error while merging: {}", + "Fehler im Plugin.": "Error in the plugin.", + "Fehler in Folge (nach 10 wird der Webhook automatisch deaktiviert)": "Consecutive errors (after 10 the webhook is disabled automatically)", + "Fehler verursacht und wurde automatisch deaktiviert. Die Webseite selbst läuft weiter. Die Funktionen des Plugins stehen erst wieder zur Verfügung, wenn Sie es unter Plugins erneut aktivieren.": "caused an error and was disabled automatically. The website itself keeps running. The plugin’s functions are only available again when you reactivate it under Plugins.", + "Fehler:": "Error:", + "Fehlern wird es automatisch deaktiviert.": "errors it is disabled automatically.", + "Feiertag hinzugefügt.": "Holiday added.", + "Feiertag hinzugefügt:": "Holiday added:", + "Feiertag hinzugefügt: {}": "Holiday added: {}", + "Feiertag(e) für": "holiday(s) for", + "Feiertage": "Holidays", + "Feiertage (0)": "Holidays (0)", + "Feiertage automatisch übernehmen": "Import holidays automatically", + "Feld bearbeiten": "Edit field", + "Feld erstellt.": "Field created.", + "Feld gelöscht (bereits erfasste Werte bleiben in bestehenden Tickets sichtbar).": "Field deleted (values already entered remain visible in existing tickets).", + "Feld gelöscht (bereits erfasste Werte in Tickets bleiben erhalten).": "Field deleted (values already entered in tickets are kept).", + "Feld gespeichert.": "Field saved.", + "Felder dieser Abteilung": "Fields of this department", + "Felder für alle Themen": "Fields for all topics", + "Felder mit gleichem Namen landen im selben Abschnitt.": "Fields with the same name end up in the same section.", + "Feldtyp": "Field type", + "Fertig! Kunden:": "Done! Customers:", + "Fertig! Kunden: {}": "Done! Customers: {}", + "Fertige Designs direkt installieren. Prüfsumme und Signatur werden vor der Installation geprüft.": "Install ready-made designs directly. Checksum and signature are verified before installation.", + "Filter in der": "Filter in the", + "Filter zurücksetzen": "Reset filters", + "Filtern": "Filter", + "Firebase-Dienstkonto für Android-Push entfernt": "Firebase service account for Android push removed", + "Firebase-Zugang konnte nicht bestätigt werden": "Firebase access could not be confirmed", + "Firmenlogo": "Company logo", + "Footer-Einstellungen gespeichert.": "Footer settings saved.", + "Footer-Seiten geändert": "Footer pages changed", + "Fordert keine Berechtigungen an.": "Does not request any permissions.", + "Formular": "Form", + "Formular gespeichert.": "Form saved.", + "Formular speichern": "Save form", + "Frage ausprobieren": "Try a question", + "Fragen-Log": "Question log", + "Fragen-Log des digitalen Assistenten geleert": "Digital assistant question log cleared", + "Fragen-Log des digitalen Assistenten geleert (App)": "Digital assistant question log cleared (app)", + "Fragen-Log: Aufbewahrung in Tagen (0 = nichts speichern)": "Question log: retention in days (0 = store nothing)", + "Freitag": "Friday", + "Fällig": "Due", + "Fällig bis": "Due until", + "Fällig bis:": "Due by:", + "Fällig bis: {}": "Due by: {}", + "Fällig:": "Due:", + "Fällig: {}": "Due: {}", + "Für Berichte fehlt die erforderliche Berechtigung.": "The required permission for reports is missing.", + "Für Gast-Anfrager ohne Konto nicht verfügbar.": "Not available for guest requesters without an account.", + "Für Kunden sichtbar (auf „Neues Ticket“)": "Visible to customers (on \"New ticket\")", + "Für alle Abteilungen": "For all departments", + "Für alle Mitarbeiter sichtbar": "Visible to all staff", + "Für automatische Backups den Cron einrichten:": "Set up cron for automatic backups:", + "Für den Abruf bitte ein Passwort angeben.": "Please enter a password for retrieval.", + "Für den Abruf bitte einen Server (Host) angeben.": "Please enter a server (host) for retrieval.", + "Für den eigenen Versand bitte einen SMTP-Server angeben.": "Please enter an SMTP server for your own sending.", + "Für diese Adresse ist kein Postfach hinterlegt. Bitte zuerst speichern.": "No mailbox is set up for this address. Please save first.", + "Für diese Adresse ist kein eigener SMTP-Server hinterlegt. Bitte zuerst speichern.": "No own SMTP server is set up for this address. Please save first.", + "Für diese Aktion fehlt die erforderliche Berechtigung.": "The required permission for this action is missing.", + "Für diese E-Mail-Adresse existiert bereits ein Konto.": "An account already exists for this email address.", + "Für diese Funktion fehlt die erforderliche Berechtigung.": "The required permission for this function is missing.", + "Für dieses Thema gibt es noch keine eigenen Felder.": "There are no custom fields for this topic yet.", + "Für „Signatur erforderlich“ muss ein Herausgeber-Schlüssel hinterlegt sein.": "A publisher key must be set for “Signature required”.", + "Gast-Anfrager ohne eigenes Kundenkonto – Notizen und Kontaktdaten-Bearbeitung sind daher nicht verfügbar.": "Guest requester without their own customer account – notes and editing of contact details are therefore not available.", + "Gast-Ticket zum Konto hinzufügen": "Add guest ticket to your account", + "Gedruckt: 24.10.2026 19:44": "Printed: 24.10.2026 19:44", + "Gedruckt: {}": "Printed: {}", + "Gefährliche Typen (PHP, EXE, SH etc.) werden immer blockiert – unabhängig von dieser Liste.": "Dangerous types (PHP, EXE, SH etc.) are always blocked – regardless of this list.", + "Geheimnis zum Signieren": "Secret for signing", + "Gelten zusätzlich bei jedem Thema und werden unter": "Apply to every topic in addition and are", + "Gelöscht": "Deleted", + "Gelöscht.": "Deleted.", + "Gelöschte osTicket-Tickets wurden nicht importiert.": "Deleted osTicket tickets were not imported.", + "Gelöst": "Resolved", + "Gelöst diesen Monat": "Resolved this month", + "Gelöst/Geschlossen": "Resolved/Closed", + "Gemeldet werden Fehler, bei denen eine Seite nicht angezeigt werden kann. Dieselbe Meldung kommt höchstens einmal pro Stunde, insgesamt höchstens 10 Mails pro Stunde. Voraussetzung ist ein funktionierender E-Mail-Versand und eine erreichbare Datenbank.": "Errors where a page cannot be displayed are reported. The same message is sent once per hour at most, and at most 10 emails per hour in total. This requires working email sending and a reachable database.", + "Geprüfte Plugins": "Verified plugins", + "Gerade ist niemand verfügbar – wir antworten aber, sobald wir wieder da sind.": "Nobody is available right now – we will reply as soon as we are back.", + "Gern geschehen! Kann ich noch etwas für Sie tun?": "You’re welcome! Is there anything else I can do for you?", + "Gern, ich erstelle ein Ticket für Sie.": "Gladly, I will create a ticket for you.", + "Gerät(e) angemeldet": "device(s) signed in", + "Gerät(e) gesendet. Sie sollte jetzt auf dem Handy erscheinen.": "device(s) sent. It should now appear on the phone.", + "Gesammelte Texte gelöscht.": "Collected texts deleted.", + "Gesammelte Texte löschen?": "Delete collected texts?", + "Gesammelte Texte: 556": "Collected texts: 556", + "Gesammelte Texte: {#}": "Collected texts: {}", + "Gesamt": "Total", + "Gesamtgröße": "Total size", + "Geschlossen": "Closed", + "Geschlossene und gelöste Tickets werden nach der gewählten Zeit automatisch anonymisiert. Name, E-Mail-Adresse und IP werden unkenntlich gemacht — das Ticket und seine Historie bleiben erhalten.": "Closed and resolved tickets are anonymized automatically after the selected time. Name, email address and IP are made unrecognizable — the ticket and its history are kept.", + "Geschäftszeiten": "Business hours", + "Geschäftszeiten aktualisiert": "Business hours updated", + "Geschäftszeiten aktualisiert (Mobile App)": "Business hours updated (mobile app)", + "Geschäftszeiten für SLA-Berechnung verwenden": "Use business hours for SLA calculation", + "Geschäftszeiten gespeichert.": "Business hours saved.", + "Geschäftszeiten verwalten": "Manage business hours", + "Gespeichert": "Saved", + "Gespeichert werden:": "The following are saved:", + "Gespeichert werden: assigned": "Saved: assigned", + "Gespeichert werden: keine Filter (alle Tickets)": "Saved: no filters (all tickets)", + "Gespeichert werden: status": "Saved: status", + "Gespeichert werden: {}": "The following are saved: {}", + "Gespeichert.": "Saved.", + "Gespeicherte Ansichten": "Saved views", + "Gespeicherte Zugangsdaten (SMTP, IMAP, Webhooks) sind mit einem eigenen Schlüssel verschlüsselt.": "Stored credentials (SMTP, IMAP, webhooks) are encrypted with a separate key.", + "Gesperrt": "Blocked", + "Gesperrt am": "Blocked on", + "Gesperrt aus Kundenverwaltung": "Blocked from customer management", + "Gesperrt und alle zugehörigen Tickets geschlossen.": "Blocked and all related tickets closed.", + "Gesperrte Einträge (0)": "Blocked entries (0)", + "Geöffnet": "Opened", + "Gilt für Hilfe-Thema": "Applies to help topic", + "Gilt für Tickets aus Formular, E-Mail, API (z. B. Minecraft-Plugin) und Live-Chat. Eine Ticket-Regel mit „Mitarbeiter zuweisen“ hat Vorrang. Ist der Mitarbeiter im Urlaub, geht das Ticket an seine Vertretung. „Reihum“ überspringt Mitarbeiter im Urlaub, offline oder außerhalb ihrer Schicht.": "Applies to tickets from the form, email, API (e.g. Minecraft plugin) and live chat. A ticket rule with “Assign staff member” takes precedence. If the staff member is on vacation, the ticket goes to their substitute. “Round robin” skips staff who are on vacation, offline or outside their shift.", + "Gleichbedeutende Wörter": "Synonyms", + "Gleichbedeutende Wörter des digitalen Assistenten geändert": "Synonyms of the digital assistant changed", + "Gleichbedeutende Wörter des digitalen Assistenten geändert (App)": "Synonyms of the digital assistant changed (app)", + "Grund": "Reason", + "Grund (optional)": "Reason (optional)", + "Grund für alle (optional)": "Reason for all (optional)", + "Gruppe": "Group", + "Gruppieren nach": "Group by", + "Guten Abend, {}": "Good evening, {}", + "Guten Morgen, {}": "Good morning, {}", + "Guten Tag, {}": "Hello, {}", + "HTML-Inhalt (Popup)": "HTML content (popup)", + "HTML-Inhalt (öffnet Popup). Ist ein Link gesetzt, wird das HTML-Feld ignoriert.": "HTML content (opens popup). If a link is set, the HTML field is ignored.", + "Hallo {customer_name}, wir haben Ihnen zu Ihrem Ticket": "Hello {customer_name}, we have sent you a reminder about your ticket", + "Hallo! Ich bin der digitale Assistent. Gerade ist niemand direkt erreichbar, aber ich kann Ihre Fragen beantworten oder ein Ticket für Sie erstellen. Wie kann ich helfen?": "Hello! I am the digital assistant. Nobody is directly available right now, but I can answer your questions or create a ticket for you. How can I help?", + "Hallo! Was möchten Sie wissen?": "Hello! What would you like to know?", + "Handlungsbedarf ·": "Action needed ·", + "Hat nicht geholfen": "Did not help", + "Hauptabteilung": "Main department", + "Heilige Drei Könige": "Epiphany", + "Helpdesk-Status": "Helpdesk status", + "Herkunft": "Origin", + "Hessen": "Hesse", + "Hier finden Sie das Archiv und den Verlauf Ihrer aktuellen und vorherigen Supportanfragen inklusive der Antworten.": "Here you can find the archive and history of your current and previous support requests, including the replies.", + "Hier finden Sie den Verlauf und Status Ihrer aktuellen und bisherigen Supportanfragen.": "Here you can find the history and status of your current and previous support requests.", + "Hier ist noch keine Android-App hinterlegt.": "No Android app has been stored here yet.", + "Hier ist noch keine Windows-App hinterlegt.": "No Windows app has been stored here yet.", + "Hier könnt ihr eigene Plugins als ZIP installieren oder aktualisieren, auch ohne Signatur. Diese Plugins sind": "Here you can install or update your own plugins as ZIP, even without a signature. These plugins are", + "Hier legst du fest, wie das Formular „Neues Ticket“ aussieht, wenn ein Kunde diese Abteilung wählt (direkt oder über ein Hilfe-Thema dieser Abteilung).": "Here you define how the “New ticket” form looks when a customer selects this department (directly or via a help topic of this department).", + "Hier siehst du, was Kunden den Assistenten gefragt haben und ob er eine Antwort gefunden hat. Es werden nur Frage und Ergebnis gespeichert (kein Name, keine E-Mail-Adresse). Fragen ohne Antwort zeigen, was du noch hinterlegen solltest.": "Here you can see what customers asked the assistant and whether it found an answer. Only the question and the result are stored (no name, no email address). Questions without an answer show what you should still add.", + "Hilfe-Thema": "Help topic", + "Hilfe-Thema (optional)": "Help topic (optional)", + "Hilfe-Thema setzen": "Set help topic", + "Hilfethema": "Help topic", + "Hilfethema erstellt.": "Help topic created.", + "Hilfethema erstellt:": "Help topic created:", + "Hilfethema erstellt: {}": "Help topic created: {}", + "Hilfethema gelöscht.": "Help topic deleted.", + "Hilfethema gelöscht:": "Help topic deleted:", + "Hilfethema gelöscht: {}": "Help topic deleted: {}", + "Hilfethema wirklich löschen?": "Really delete this help topic?", + "Hilfethemen": "Help topics", + "Hilfethemen erscheinen im Kundenportal als Auswahl bei der Ticket-Erstellung und setzen automatisch Abteilung und Priorität.": "Help topics appear in the customer portal as a selection when creating a ticket and set the department and priority automatically.", + "Hintergrundbild im dunklen Hero-Bereich. Mind. 1600×500 px, max. 5 MB.": "Background image in the dark hero area. At least 1600×500 px, max. 5 MB.", + "Hintergrundjob „{}“ ist fehlgeschlagen": "Background job “{}” failed", + "Hinweis für Administratoren: Zum Aktualisieren einer App die neue Datei per FTP in": "Note for administrators: to update an app, upload the new file via FTP to", + "Hinweise": "Notes", + "Hinweise ·": "Notes ·", + "Hinweistext (optional)": "Note text (optional)", + "Hinzufügen": "Add", + "Hoch": "High", + "Hochgeladene Dateien (Anhänge)": "Uploaded files (attachments)", + "Hochgeladene Dateien werden nicht ausgeführt": "Uploaded files are not executed", + "Hochgeladene PHP-Dateien würden ausgeführt": "Uploaded PHP files would be executed", + "Hochladen": "Upload", + "Hochladen & installieren": "Upload & install", + "Hochladen →": "Upload →", + "Hohe Priorität": "High priority", + "Häufige Fragen": "Frequently asked questions", + "Häufige Fragen ohne Antwort": "Frequent questions without an answer", + "ICO, PNG, JPG, GIF, WebP oder SVG, höchstens 1 MB, am besten quadratisch (z. B. 256×256). Ohne Favicon verwendet DeskHub das Logo.": "ICO, PNG, JPG, GIF, WebP or SVG, 1 MB at most, ideally square (e.g. 256×256). Without a favicon, DeskHub uses the logo.", + "IMAP-Postfach gelöscht:": "IMAP mailbox deleted:", + "IMAP-Postfach gelöscht: {}": "IMAP mailbox deleted: {}", + "IMAP-Quell- oder Zielordner fehlt.": "IMAP source or target folder is missing.", + "IMAP-Quellordner konnte nicht geöffnet werden:": "IMAP source folder could not be opened:", + "IMAP-Quellordner konnte nicht geöffnet werden: {}": "IMAP source folder could not be opened: {}", + "IP-Adresse": "IP address", + "IP-Adressen sofort beim Speichern kürzen (letztes Oktett entfernen)": "Shorten IP addresses immediately when saving (remove last octet)", + "Ich kenne den Inhalt dieses Plugins und vertraue ihm. Mir ist bewusst, dass es mit allen Rechten des Systems läuft.": "I know the content of this plugin and trust it. I am aware that it runs with all permissions of the system.", + "Ich wurde erwähnt": "I was mentioned", + "Ihr Anliegen": "Your request", + "Ihr Chatverlauf – Ticket #{ticket_number}": "Your chat history – ticket #{ticket_number}", + "Ihr Name": "Your name", + "Ihr Passwort wurde geändert. Sie können sich jetzt anmelden.": "Your password has been changed. You can now log in.", + "Ihr Ticket": "Your ticket", + "Ihr Ticket #": "Your ticket #", + "Ihr Ticket #{#}": "Your ticket #{}", + "Ihr Ticket #{ticket_number} wurde erstellt": "Your ticket #{ticket_number} has been created", + "Ihre Antwort wurde übermittelt.": "Your reply has been submitted.", + "Ihre Bewertung für Ticket": "Your rating for ticket", + "Ihre Bewertung – {}": "Your rating – {}", + "Ihre E-Mail-Adresse": "Your email address", + "Ihre Kontaktdaten": "Your contact details", + "Ihre Nachricht": "Your message", + "Ihre Nachricht...": "Your message...", + "Ihre Nachricht…": "Your message…", + "Ihre Sitzung ist abgelaufen. Bitte laden Sie die Seite neu und versuchen Sie es erneut.": "Your session has expired. Please reload the page and try again.", + "Ihre Sitzung ist abgelaufen. Bitte laden Sie die Seite neu.": "Your session has expired. Please reload the page.", + "Im Backup fehlt der Datenbank-Abzug.": "The database dump is missing in the backup.", + "Im Ordner uploads/ läuft PHP-Code. Wer eine Datei hochladen kann, könnte den Server übernehmen. Sperren Sie die PHP-Ausführung in uploads/ (README, Abschnitt Sicherheit → nginx).": "PHP code runs in the uploads/ folder. Anyone who can upload a file could take over the server. Block PHP execution in uploads/ (README, section Security → nginx).", + "Im Stammverzeichnis des ZIP-Archivs fehlt die Datei theme.css.": "The file theme.css is missing in the root of the ZIP archive.", + "Im Zeitraum wurden noch keine Abfragen verschickt.": "No surveys were sent in this period.", + "Im geprüften Modus ist der Katalog fest vorgegeben.": "In verified mode the catalog is fixed.", + "Im geprüften Modus sind Katalog und Schlüssel fest vorgegeben.": "In verified mode the catalog and key are fixed.", + "Immer (zum Testen)": "Always (for testing)", + "Immer an einen bestimmten Mitarbeiter": "Always to a specific staff member", + "Import aus osTicket": "Import from osTicket", + "Import läuft...": "Import running...", + "Impressum": "Legal notice", + "In 1 Stunde": "In 1 hour", + "In 1 Woche": "In 1 week", + "In 3 Stunden": "In 3 hours", + "In 3 Tagen": "In 3 days", + "In Betrieb": "Operational", + "In Ordner verschieben": "Move to folder", + "In der Datei": "In the file", + "In der Datei wurden keine Anhangsdaten gefunden.": "No attachment data was found in the file.", + "In dieser Version ist kein Push-Dienst eingetragen. Ihr könnt unten ein eigenes Firebase-Projekt verwenden.": "No push service is set in this version. Below you can use your own Firebase project.", + "Individuelle Ticket-Felder": "Custom ticket fields", + "Inhalt (HTML erlaubt)": "Content (HTML allowed)", + "Inhalt / Zusammenfassung": "Content / summary", + "Installationsassistent ist nicht gesperrt": "Installation wizard is not locked", + "Installierte Sprachen": "Installed languages", + "Installierte Version": "Installed version", + "Interne Dateien sind aus dem Internet abrufbar": "Internal files can be accessed from the internet", + "Interne Dateien sind gesperrt": "Internal files are blocked", + "Interne Notiz": "Internal note", + "Interne Notiz hinzugefügt": "Internal note added", + "Interne Notiz hinzugefügt (Mobile App)": "Internal note added (mobile app)", + "Interne Notizen": "Internal notes", + "Interner Chat": "Internal chat", + "Interner Kommentar…": "Internal comment…", + "Ist das aktiv, erscheinen für diese Abteilung": "If this is active, the following appear for this department", + "Jahr": "Year", + "Jar herunterladen und in den Ordner": "Download the jar and place it in the folder", + "Jede Sprache ist ein Plugin („Sprachpaket“): Deutsch ist eingebaut, weitere Sprachen installieren Sie unter Plugins. Besucher und Mitarbeiter wechseln die Sprache über die Flaggen. Texte ohne Übersetzung bleiben deutsch.": "Every language is a plugin (“language pack”): German is built in, you install further languages under Plugins. Visitors and staff switch the language via the flags. Texts without a translation stay German.", + "Jede Zustellung enthält den Header": "Every delivery contains the header", + "Jeder Job kann hier zusätzlich jederzeit sofort manuell gestartet werden.": "Each job can also be started manually at any time here.", + "Jedes Postfach wird beim Abruf (Cronjob": "Each mailbox is queried individually when fetching (cron job", + "Jetzt anmelden": "Sign in now", + "Jetzt ausführen": "Run now", + "Jetzt erkennen und prüfen": "Detect and check now", + "Jetzt registrieren": "Register now", + "Jetzt sofort ein Ticket erstellen": "Create a ticket now", + "Jetzt zurückholen": "Retrieve now", + "KB-Artikel erstellt:": "KB article created:", + "KB-Artikel erstellt: {}": "KB article created: {}", + "KB-Artikel gelöscht:": "KB article deleted:", + "KB-Artikel gelöscht: {}": "KB article deleted: {}", + "KB-Kategorie erstellt:": "KB category created:", + "KB-Kategorie erstellt: {}": "KB category created: {}", + "KB-Kategorie gelöscht:": "KB category deleted:", + "KB-Kategorie gelöscht: {}": "KB category deleted: {}", + "Kanal (web/email)": "Channel (web/email)", + "Kanal-Einstellungen → Integrationen → Webhooks → Neuer Webhook": "Channel settings → Integrations → Webhooks → New webhook", + "Kann ZIP nicht erstellen:": "Cannot create ZIP:", + "Kann ZIP nicht erstellen: {}": "Cannot create ZIP: {}", + "Katalog aktualisieren": "Refresh catalog", + "Katalog und Herausgeber-Schlüssel": "Catalog and publisher key", + "Katalog-Adresse gespeichert.": "Catalog address saved.", + "Kategorie": "Category", + "Kategorie erstellt.": "Category created.", + "Kategorie gelöscht.": "Category deleted.", + "Kategorie und Reihenfolge gespeichert.": "Category and order saved.", + "Kategorie wirklich löschen?": "Really delete this category?", + "Kategorien": "Categories", + "Kein Absturzbericht übermittelt.": "No crash report was submitted.", + "Kein App-Key gesetzt:": "No app key set:", + "Kein App-Key gesetzt: {}": "No app key set: {}", + "Kein Backup nötig.": "No backup needed.", + "Kein E-Mail-Server eingerichtet": "No email server set up", + "Kein Hilfethema": "No help topic", + "Kein Kanal konfiguriert oder Fehler.": "No channel configured or error.", + "Kein Konto nötig:": "No account needed:", + "Kein Live-Chat ausgewählt": "No live chat selected", + "Kein Logo hinterlegt.": "No logo stored.", + "Kein Titelbild hinterlegt.": "No cover image stored.", + "Kein Token eingetragen (öffentlicher Zugriff).": "No token entered (public access).", + "Kein Update seit X Stunden": "No update for X hours", + "Kein Update-ZIP vorhanden.": "No update ZIP available.", + "Kein Verschlüsselungsschlüssel (app_key)": "No encryption key (app_key)", + "Kein Zugriff auf diese Abteilung.": "No access to this department.", + "Kein Zugriff auf diese Datei.": "No access to this file.", + "Kein Zugriffstoken (Dienstkonto prüfen)": "No access token (check the service account)", + "Kein aktiver Chat gefunden.": "No active chat found.", + "Kein eigenes Favicon hinterlegt.": "No custom favicon stored.", + "Kein gültiges Release gewählt.": "No valid release selected.", + "Keine": "None", + "Keine Anhänge zum Übernehmen.": "No attachments to import.", + "Keine Antwort": "No answer", + "Keine Artikel gefunden.": "No articles found.", + "Keine Aufgaben gefunden.": "No tasks found.", + "Keine Berechtigung.": "No permission.", + "Keine Dateien extrahiert!": "No files extracted!", + "Keine Daten": "No data", + "Keine Daten im gewählten Zeitraum.": "No data in the selected period.", + "Keine Daten vorhanden.": "No data available.", + "Keine Erwähnungen vorhanden.": "No mentions.", + "Keine Fragen für diese Auswahl.": "No questions for this selection.", + "Keine Kunden gefunden.": "No customers found.", + "Keine Meldungen in den letzten 60 Tagen.": "No reports in the last 60 days.", + "Keine Mitarbeiter-Antwort seit X Stunden": "No staff reply for X hours", + "Keine Signatur": "No signature", + "Keine Störungen in den letzten 14 Tagen.": "No incidents in the last 14 days.", + "Keine Tickets gefunden.": "No tickets found.", + "Keine Tickets vorhanden.": "No tickets available.", + "Keine Zeiteinträge im gewählten Zeitraum.": "No time entries in the selected period.", + "Keine offenen Tickets – gute Arbeit!": "No open tickets – good job!", + "Keine passende Antwort: Der Assistent würde anbieten, ein Ticket zu erstellen. Lege dafür unten eine Antwort an oder ergänze die Wissensdatenbank.": "No matching answer: the assistant would offer to create a ticket. Create an answer below or extend the knowledge base.", + "Keine passenden Ziele in der Dienst-Konfiguration gefunden": "No matching targets found in the service configuration", + "Keine weitere Einstellung nötig.": "No further setting needed.", + "Kennzahlen": "Key figures", + "Klicke rechts auf einen Mitarbeiter": "Click a staff member on the right", + "Klicken Sie auf Aktivieren um Benachrichtigungen zu erhalten": "Click Enable to receive notifications", + "Klicken Sie auf den folgenden Button, um Ihr Passwort zurückzusetzen. Der Link ist": "Click the button below to reset your password. The link is", + "Kollaborator hinzugefügt.": "Collaborator added.", + "Kollaborator hinzugefügt:": "Collaborator added:", + "Kollaborator hinzugefügt: {}": "Collaborator added: {}", + "Kollaboratoren": "Collaborators", + "Kommentar löschen": "Delete comment", + "Kommentieren": "Comment", + "Konfiguration": "Configuration", + "Konfiguration mit Datenbank-Passwort und Schlüssel": "Configuration with database password and key", + "Konfiguration, Datenbank, Backups, Programmcode und Tests sind von außen nicht abrufbar.": "Configuration, database, backups, program code and tests cannot be accessed from outside.", + "Kontaktdaten": "Contact details", + "Kontakte": "Contacts", + "Kontakte von „{}“": "Contacts of “{}”", + "Konto": "Account", + "Konto erstellen": "Create account", + "Konto erstellen – {}": "Create account – {}", + "Kontodaten": "Account details", + "Kontodaten gespeichert.": "Account data saved.", + "Kontoinformationen": "Account information", + "Kontotyp": "Account type", + "Kopiere ihn jetzt – aus Sicherheitsgründen wird er nie wieder angezeigt:": "Copy it now – for security reasons it will never be shown again:", + "Kopiere ihn jetzt – aus Sicherheitsgründen wird er nie wieder angezeigt: {}": "Copy it now – for security reasons it will never be shown again: {}", + "Kopieren": "Copy", + "Kostenloses Konto erstellen": "Create a free account", + "Kunde": "Customer", + "Kunde gesperrt:": "Customer blocked:", + "Kunde gesperrt: {}": "Customer blocked: {}", + "Kunde hat geantwortet": "Customer replied", + "Kunde nicht gefunden.": "Customer not found.", + "Kunde tippt …": "Customer is typing …", + "Kunden": "Customers", + "Kunden erinnern, wenn sie auf eine Antwort nicht reagieren (einmalig, vor dem automatischen Schließen)": "Remind customers if they do not respond to a reply (once, before automatic closing)", + "Kunden-Organisationen": "Customer organizations", + "Kundendaten": "Customer data", + "Kundendaten gespeichert.": "Customer data saved.", + "Kundenerinnerung": "Customer reminder", + "Kundenerinnerung jetzt manuell ausführen?": "Run customer reminder manually now?", + "Kundennachrichten, Antworten, interne Notizen und Mitlesende": "Customer messages, replies, internal notes and followers", + "Kundenportal-Theme aus dem Katalog installiert:": "Customer portal theme installed from the catalog:", + "Kundenportal-Theme aus dem Katalog installiert: {}": "Customer portal theme installed from the catalog: {}", + "Kundenportal-Theme gelöscht:": "Customer portal theme deleted:", + "Kundenportal-Theme gelöscht: {}": "Customer portal theme deleted: {}", + "Kundenprofil: {}": "Customer profile: {}", + "Kundenverzeichnis": "Customer directory", + "Kundenzufriedenheit": "Customer satisfaction", + "Kurzbeschreibung (optional)": "Short description (optional)", + "Kurze Zusammenfassung Ihres Problems": "Short summary of your problem", + "Laden Sie mehrere Designs als ZIP hoch und aktivieren Sie eines davon global für alle Kunden. Das ZIP muss im Stammverzeichnis eine": "Upload several designs as ZIP and activate one of them globally for all customers. The ZIP must contain in its root a", + "Leere Vorlage laden": "Load empty template", + "Legen Sie fest, welche zusätzlichen Bereiche auf der Kundenportal-Startseite angezeigt werden.": "Choose which additional sections are shown on the customer portal home page.", + "Legt fest, innerhalb welcher Zeiten die SLA-Fristen (Reaktion/Lösung) laufen. Bei deaktivierten Geschäftszeiten gelten die Fristen wie bisher rund um die Uhr.": "Defines within which times the SLA deadlines (response/resolution) run. With business hours disabled, the deadlines apply around the clock as before.", + "Leserecht": "Read permission", + "Letzte 30 Tage": "Last 30 days", + "Letzte 7 Tage": "Last 7 days", + "Letzte Prüfung:": "Last check:", + "Letzte Prüfung: {}": "Last check: {}", + "Letzte Prüfungen": "Recent checks", + "Letzte Zustellung": "Last delivery", + "Letzter Abruf": "Last fetch", + "Letzter Fehler:": "Last error:", + "Letzter Fehler: {}": "Last error: {}", + "Letztes Auto-Backup": "Last auto backup", + "Letztes Backup": "Last backup", + "Letztes Backup nicht wiederherstellbar": "Last backup cannot be restored", + "Letztes geprüftes Backup ist älter als 8 Tage": "The last verified backup is older than 8 days", + "Liest die Datei in 4-MB-Blöcken. Bei sehr großen Dateien (Anhänge, Sitzungsdaten) kann das einige Minuten dauern.": "Reads the file in 4 MB blocks. For very large files (attachments, session data) this can take a few minutes.", + "Link anfordern": "Request link", + "Link nicht gültig": "Link not valid", + "Link-Adresse": "Link address", + "Liste": "List", + "Liste aktualisieren": "Update list", + "Liste aktualisiert:": "List updated:", + "Liste aktualisiert: {}": "List updated: {}", + "Liste erstellt.": "List created.", + "Liste erstellt:": "List created:", + "Liste erstellt: {}": "List created: {}", + "Liste gelöscht.": "List deleted.", + "Liste gelöscht: #": "List deleted: #", + "Liste gelöscht: #{#}": "List deleted: #{}", + "Live-Chat": "Live chat", + "Live-Chat im Kundenportal (Chat-Widget unten rechts, auch ohne Kundenkonto nutzbar)": "Live chat in the customer portal (chat widget at the bottom right, also usable without a customer account)", + "Live-Chat ist derzeit": "Live chat is currently", + "Live-Chat ist derzeit deaktiviert. Aktivieren unter": "Live chat is currently disabled. Enable it under", + "Live-Chat ist derzeit nicht verfügbar (keine Abteilung eingerichtet).": "Live chat is currently unavailable (no department set up).", + "Live-Chat ist derzeit nicht verfügbar (keine Priorität eingerichtet).": "Live chat is currently unavailable (no priority set up).", + "Live-Chat ist derzeit nicht verfügbar.": "Live chat is currently unavailable.", + "Live-Chat-Antwort gesendet": "Live chat reply sent", + "Live-Chat-Antwort gesendet (Mobile App)": "Live chat reply sent (mobile app)", + "Live-Chat-Nachricht empfangen": "Live chat message received", + "Läuft komplett eingebaut, ganz ohne echten Server-Cronjob und ohne externen Dienst: bei jeder Anmeldung/Nutzung im Backend": "Runs fully built in, without a real server cron job and without an external service: on every login/use in the backend", + "Löschen": "Delete", + "Lösung": "Solution", + "Lösungsrate": "Resolution rate", + "Lösungszeit (Std) *": "Resolution time (hrs) *", + "MB je Datei. Setzt die Nachrichten voraus.": "MB per file. Requires the messages.", + "MB übersprungen.": "MB skipped.", + "MB, passend zum Limit dieses Servers)": "MB, matching the limit of this server)", + "Mail senden nach": "Send email after", + "Manuell": "Manual", + "Manueller Schlüssel:": "Manual key:", + "Manueller Schlüssel: {}": "Manual key: {}", + "Manuelles Update": "Manual update", + "Mariä Himmelfahrt": "Assumption Day", + "Markierte Tickets wirklich unwiderruflich löschen?": "Really delete the selected tickets permanently?", + "Maximale Dateigröße": "Maximum file size", + "Maximale Dateigröße: 2 MB.": "Maximum file size: 2 MB.", + "Mecklenburg-Vorpommern": "Mecklenburg-Western Pomerania", + "Mehrere Adressen auf einmal anlegen": "Create several addresses at once", + "Mehrere sperren": "Block several", + "Mehrzeiliger Text": "Multi-line text", + "Mein Profil": "My profile", + "Mein Status": "My status", + "Mein Status:": "My status:", + "Meine": "My", + "Meine Antwort gefunden": "My reply found", + "Meine Erwähnungen": "My mentions", + "Meine Signatur (nicht hinterlegt)": "My signature (not set)", + "Meine Signatur bearbeiten": "Edit my signature", + "Meine Tickets": "My tickets", + "Meine Tickets ansehen": "View my tickets", + "Meine Tickets – {}": "My tickets – {}", + "Meine offenen Tickets": "My open tickets", + "Melden Sie sich an oder erstellen Sie ein Konto mit derselben E-Mail-Adresse. Dieses Ticket bleibt in diesem Browser freigeschaltet und kann danach in „Meine Tickets“ hinzugefügt werden.": "Log in or create an account with the same email address. This ticket stays unlocked in this browser and can then be added to “My tickets”.", + "Melden Sie sich an, um alle Ihre Tickets im Überblick zu sehen.": "Sign in to see all your tickets at a glance.", + "Meldung gelöscht.": "Message deleted.", + "Meldung löschen?": "Delete message?", + "Meldung nicht gefunden.": "Message not found.", + "Meldung veröffentlicht.": "Message published.", + "Meldungen": "Messages", + "Methode nicht erlaubt.": "Method not allowed.", + "Mindestens 10 Zeichen mit Groß- und Kleinbuchstaben, einer Ziffer und einem Sonderzeichen.": "At least 10 characters with upper and lower case letters, a digit and a special character.", + "Minuten (5–480). Countdown wird oben rechts angezeigt.": "Minutes (5–480). Countdown is shown at the top right.", + "Minuten (so bleibt Zeit, ein versehentlich geschlossenes Ticket wieder zu öffnen). Gilt nur für Tickets, die ab dem Einschalten geschlossen werden. Die Auswertung steht unter Übersicht.": "minutes (this leaves time to reopen a ticket that was closed by mistake). Only applies to tickets closed after it is switched on. The evaluation is on the overview.", + "Minuten ohne Aktivität": "Minutes without activity", + "Minuten ohne Aktivität automatisch auf Offline gesetzt.": "minutes without activity automatically set to offline.", + "Mir zugewiesen": "Assigned to me", + "Mit den Apps bearbeitet ihr Tickets am PC oder unterwegs. Beide haben ein helles und dunkles Design.": "With the apps you work on tickets at the PC or on the go. Both have a light and a dark design.", + "Mit einem Schlüssel können Fremdsysteme (Website-Formular, Shop, Monitoring …) Tickets über die öffentliche API anlegen oder deren Status abfragen. Ereignisse an andere Systeme meldest du über": "With a key, third-party systems (website form, shop, monitoring …) can create tickets via the public API or query their status. You report events to other systems via", + "Mit „Halbe Zeile“ steht der Betreff neben einem benachbarten eigenen Feld (zum Beispiel einem Zahlenfeld direkt vor oder nach dem Betreff).": "With “Half row” the subject sits next to a neighboring custom field (for example a number field directly before or after the subject).", + "Mitarbeiter": "Staff", + "Mitarbeiter (nur bei „Immer an einen bestimmten Mitarbeiter“)": "Staff member (only for \"Always to a specific staff member\")", + "Mitarbeiter aktualisiert:": "Staff member updated:", + "Mitarbeiter aktualisiert: {}": "Staff member updated: {}", + "Mitarbeiter angelegt.": "Staff member created.", + "Mitarbeiter angelegt:": "Staff member created:", + "Mitarbeiter angelegt: {}": "Staff member created: {}", + "Mitarbeiter auswählen": "Select staff member", + "Mitarbeiter gelöscht.": "Staff member deleted.", + "Mitarbeiter gelöscht: #": "Staff member deleted: #", + "Mitarbeiter gelöscht: #{#}": "Staff member deleted: #{}", + "Mitarbeiter können diese Textbausteine beim Beantworten eines Tickets per Klick in die Antwort einfügen.": "Staff can insert these text snippets into a reply with one click when answering a ticket.", + "Mitarbeiter mit dieser Hauptabteilung": "Staff with this main department", + "Mitarbeiter nicht gefunden.": "Staff member not found.", + "Mitarbeiter tippt …": "Agent is typing …", + "Mitarbeiter verwalten": "Manage staff", + "Mitarbeiter werden bei neuen Tickets und Antworten benachrichtigt. Ticket-Daten werden dabei an den jeweiligen Drittanbieter übermittelt.": "Staff are notified about new tickets and replies. Ticket data is transmitted to the respective third-party provider.", + "Mitarbeiter werden nach": "Staff are", + "Mitarbeiter wirklich löschen?": "Really delete this staff member?", + "Mitarbeiter zugewiesen:": "Staff member assigned:", + "Mitarbeiter zugewiesen: {}": "Staff member assigned: {}", + "Mitarbeiter zuweisen": "Assign staff member", + "Mitarbeiter-Login": "Staff login", + "Mitarbeiter-Login –": "Staff login –", + "Mitarbeiter-Login – {}": "Staff login – {}", + "Mitarbeiter-Login →": "Staff login →", + "Mitarbeiter-Verzeichnis": "Staff directory", + "Mitarbeiterbereich": "Staff area", + "Mitarbeiterbereich – wir senden Ihnen einen Link zum Zurücksetzen.": "Staff area – we will send you a reset link.", + "Mitglieder": "Members", + "Mitglieder (2)": "Members (2)", + "Mitglieder können nach dem Erstellen der Abteilung unter": "After creating the department, members can be set under", + "Mitlesende übernommen.": "Followers imported.", + "Mittwoch": "Wednesday", + "Monat": "Month", + "Monate": "Months", + "Monatlich": "Monthly", + "Montag": "Monday", + "Morgen früh (8:00 Uhr)": "Tomorrow morning (8:00)", + "Muster bearbeiten": "Edit pattern", + "Möchten Sie uns noch etwas mitteilen? (optional)": "Would you like to tell us anything else? (optional)", + "Nach Mitarbeiter": "By staff member", + "Nach Priorität": "By priority", + "Nach Status": "By status", + "Nach dem Update Browser-Cache leeren": "Clear the browser cache after the update", + "Nach der Installation sollte die Datei nur lesbar sein (chmod 640, Besitzer root/Deploy-Benutzer, Gruppe des Webservers).": "After installation the file should be read-only (chmod 640, owner root/deploy user, group of the web server).", + "Nach wie vielen Tagen ohne Kundenreaktion": "After how many days without customer response", + "Nach wie vielen Tagen ohne Reaktion": "After how many days without response", + "Nachricht": "Message", + "Nachricht (erster Thread-Eintrag)": "Message (first thread entry)", + "Nachricht eingeben...": "Enter message...", + "Nachricht ist zu lang.": "Message is too long.", + "Nachricht schreiben…": "Write a message…", + "Nachrichten auswählen": "Select messages", + "Nachrichten zu nicht importierten Tickets wurden übersprungen.": "Messages of tickets that were not imported were skipped.", + "Nachricht…": "Message…", + "Name": "Name", + "Name (optional)": "Name (optional)", + "Name *": "Name *", + "Name der Ansicht": "Name of the view", + "Name der Vorlage": "Name of the template", + "Name des Assistenten": "Name of the assistant", + "Name in der Benachrichtigung (optional)": "Name in the notification (optional)", + "Name neben dem Logo ausgeblendet": "Name next to the logo hidden", + "Name neben dem Logo wird angezeigt": "Name next to the logo is shown", + "Name oder E-Mail": "Name or email", + "Name und E-Mail-Adresse": "Name and email address", + "Name „{}“ neben dem Logo ausblenden": "Hide name “{}” next to the logo", + "Nebeneinander": "Side by side", + "Neue Abteilung": "New department", + "Neue Abteilung hinzufügen": "Add new department", + "Neue Antwort": "New reply", + "Neue Antwort (an Kunde)": "New reply (to customer)", + "Neue Antwort: #": "New reply: #", + "Neue Antwort: #{#}": "New reply: #{}", + "Neue App-Versionen veröffentlichst du in der Plugin-Website unter „DeskHub-Apps veröffentlichen“. Downloads hier bleiben auf angemeldete Mitarbeiter beschränkt.": "You publish new app versions on the plugin website under “Publish DeskHub apps”. Downloads here remain restricted to logged-in staff.", + "Neue Aufgabe": "New task", + "Neue Berechtigungen müssen bestätigt werden:": "New permissions must be confirmed:", + "Neue Berechtigungen müssen bestätigt werden: {}": "New permissions must be confirmed: {}", + "Neue Chat-Nachricht: #": "New chat message: #", + "Neue Chat-Nachricht: #{#}": "New chat message: #{}", + "Neue E-Mail-Adresse": "New email address", + "Neue Eskalationsregel": "New escalation rule", + "Neue Kategorie": "New category", + "Neue Kategorie, z. B. API-Schnittstellen": "New category, e.g. API interfaces", + "Neue Kundenantwort": "New customer reply", + "Neue Liste": "New list", + "Neue Liste hinzufügen": "Add new list", + "Neue Meldung (Störung oder Wartung)": "New message (incident or maintenance)", + "Neue Organisation": "New organization", + "Neue Priorität": "New priority", + "Neue Priorität hinzufügen": "Add new priority", + "Neue Regel": "New rule", + "Neue Regel hinzufügen": "Add new rule", + "Neue Rolle": "New role", + "Neue Rolle hinzufügen": "Add new role", + "Neue Seite": "New page", + "Neue Seite hinzufügen": "Add new page", + "Neue Tickets automatisch zuweisen": "Assign new tickets automatically", + "Neue Tickets werden nicht automatisch diesem Konto zugewiesen, während der Urlaubsmodus aktiv ist. Bereits zugewiesene Tickets bleiben unverändert.": "New tickets are not assigned automatically to this account while vacation mode is active. Tickets already assigned remain unchanged.", + "Neue Tickets werden während Ihrer Abwesenheit automatisch dieser Person zugewiesen.": "New tickets are automatically assigned to this person during your absence.", + "Neue Vorlage": "New template", + "Neue-Antwort-Mail": "New reply email", + "Neue-Antwort-Mail (Kollaborateur)": "New reply email (collaborator)", + "Neuen Agenten hinzufügen": "Add new agent", + "Neuen Chat starten": "Start a new chat", + "Neuen Link anfordern →": "Request a new link →", + "Neuen SLA-Plan hinzufügen": "Add new SLA plan", + "Neuen Schlüssel erstellen": "Create new key", + "Neuen Webhook hinzufügen": "Add new webhook", + "Neuer Agent": "New agent", + "Neuer Dienst, z. B. Webseite": "New service, e.g. website", + "Neuer Live-Chat": "New live chat", + "Neues Bild hochladen (JPG, PNG, WEBP · max. 2 MB)": "Upload new image (JPG, PNG, WEBP · max. 2 MB)", + "Neues Feld": "New field", + "Neues Hilfethema hinzufügen": "Add new help topic", + "Neues Passwort": "New password", + "Neues Passwort (leer = unverändert)": "New password (empty = unchanged)", + "Neues Passwort festlegen": "Set new password", + "Neues Passwort wiederholen": "Repeat new password", + "Neues Postfach": "New mailbox", + "Neues Support-Ticket erstellen": "Create new support ticket", + "Neues Team hinzufügen": "Add new team", + "Neues Ticket": "New ticket", + "Neues Ticket (an Abteilung)": "New ticket (to department)", + "Neues Ticket [#{ticket_number}] {subject}": "New ticket [#{ticket_number}] {subject}", + "Neues Ticket erstellen": "Create new ticket", + "Neues Ticket eröffnen": "Open a new ticket", + "Neues Ticket – {}": "New ticket – {}", + "Neues Ticket:": "New ticket:", + "Neues Ticket: {}": "New ticket: {}", + "Neues-Ticket-Mail (Abteilung)": "New ticket email (department)", + "Neues-Ticket-Mail (Mitarbeiter)": "New ticket email (staff)", + "Nicht angegeben": "Not specified", + "Nicht automatisch zuweisen": "Do not assign automatically", + "Nicht eingeloggt": "Not logged in", + "Nicht für den Produktivbetrieb geeignet. Bitte in": "Not suitable for production use. Please in", + "Nicht mehr beobachten": "Stop watching", + "Nicht prüfbar: Der Ordner uploads/ ist nicht beschreibbar.": "Cannot be checked: the uploads/ folder is not writable.", + "Nicht prüfbar: Der Server antwortet auf jede Adresse mit \"200\". Testen Sie die Adressen von Hand (siehe README, Abschnitt Sicherheit).": "Cannot be checked: the server answers every address with “200”. Test the addresses by hand (see README, section Security).", + "Nicht prüfbar: die eigene Adresse ließ sich nicht abrufen.": "Cannot be checked: your own address could not be fetched.", + "Nicht signiert": "Not signed", + "Nicht verfügbar.": "Not available.", + "Nicht vom Herausgeber geprüft": "Not verified by the publisher", + "Nicht zugewiesen": "Unassigned", + "Niedersachsen": "Lower Saxony", + "Niedrig": "Low", + "Niemand. Beobachter bekommen Benachrichtigungen, ohne dass ihnen das Ticket zugewiesen ist.": "Nobody. Watchers receive notifications without the ticket being assigned to them.", + "Noch kein Konto?": "No account yet?", + "Noch kein Postfach angelegt.": "No mailbox created yet.", + "Noch kein Sprachpaket aktiv. Installieren Sie zum Beispiel „English“ unter": "No language pack is active yet. Install for example “English” under", + "Noch kein geprüftes Backup": "No verified backup yet", + "Noch keine API-Schlüssel angelegt.": "No API keys created yet.", + "Noch keine Abteilungen angelegt.": "No departments created yet.", + "Noch keine Backups vorhanden.": "No backups available yet.", + "Noch keine Bewertung abgegeben.": "No rating submitted yet.", + "Noch keine Dienste. Legen Sie unten zum Beispiel Webseite, E-Mail oder Telefon an.": "No services yet. Below you can add for example website, email or phone.", + "Noch keine E-Mail-Adressen angelegt.": "No email addresses created yet.", + "Noch keine Einträge.": "No entries yet.", + "Noch keine Eskalationsregeln. Erstellen Sie eine neue Regel mit dem Button oben.": "No escalation rules yet. Create a new rule with the button above.", + "Noch keine Feiertage eingetragen.": "No holidays entered yet.", + "Noch keine Hilfethemen angelegt.": "No help topics created yet.", + "Noch keine Kategorien angelegt.": "No categories created yet.", + "Noch keine Kunden zugeordnet. Das geht unter": "No customers assigned yet. You can do this under", + "Noch keine Listen angelegt.": "No lists created yet.", + "Noch keine Muster angelegt.": "No patterns created yet.", + "Noch keine Nachrichten – schreib etwas!": "No messages yet – write something!", + "Noch keine Nachrichten.": "No messages yet.", + "Noch keine Notizen.": "No notes yet.", + "Noch keine Organisationen angelegt.": "No organizations created yet.", + "Noch keine Plugins installiert.": "No plugins installed yet.", + "Noch keine Prüfungen": "No checks yet", + "Noch keine SLA-Pläne angelegt.": "No SLA plans created yet.", + "Noch keine Seiten angelegt.": "No pages created yet.", + "Noch keine Teams angelegt.": "No teams created yet.", + "Noch keine Ticket-Regeln angelegt.": "No ticket rules created yet.", + "Noch keine Tickets": "No tickets yet", + "Noch keine Verlaufsdaten": "No history data yet", + "Noch keine Vorlagen.": "No templates yet.", + "Noch keine Webhooks angelegt.": "No webhooks created yet.", + "Noch keine Zeit erfasst.": "No time recorded yet.", + "Noch keine benutzerdefinierten Rollen angelegt.": "No custom roles created yet.", + "Noch keine eigenen Felder. Rechts kannst du das erste anlegen.": "No custom fields yet. On the right you can create the first one.", + "Noch keine eigenen Themes hochgeladen.": "No custom themes uploaded yet.", + "Noch keine gespeicherten Ansichten vorhanden.": "No saved views yet.", + "Noch keine individuellen Felder angelegt.": "No custom fields created yet.", + "Noch keine zusätzlichen Antworten.": "No additional replies yet.", + "Noch nicht auf Wiederherstellbarkeit geprüft": "Not yet checked for restorability", + "Noch nie": "Never", + "Nordrhein-Westfalen": "North Rhine-Westphalia", + "Normale Tickets": "Normal tickets", + "Notiz (optional)": "Note (optional)", + "Notiz (optional, z.B. «In Besprechung bis 14:00»)": "Note (optional, e.g. \"In a meeting until 14:00\")", + "Notiz gespeichert.": "Note saved.", + "Notiz hinzufügen…": "Add note…", + "Notiz hinzugefügt.": "Note added.", + "Notiz speichern": "Save note", + "Notizen (optional)": "Notes (optional)", + "Nur Abteilung": "Department only", + "Nur Administratoren dürfen den Status anderer Mitarbeiter ändern.": "Only administrators may change the status of other staff members.", + "Nur Administratoren können Ticket-Regeln verwalten.": "Only administrators can manage ticket rules.", + "Nur Administratoren können die Administrator-Rolle vergeben.": "Only administrators can assign the administrator role.", + "Nur Administratoren können die Sperre eines anderen Mitarbeiters aufheben.": "Only administrators can release another staff member’s lock.", + "Nur Admins können das Admin-Protokoll leeren.": "Only admins can clear the admin log.", + "Nur Admins können fremde Sperren aufheben.": "Only admins can release other people’s locks.", + "Nur E-Mail-Tickets können als Spam geändert werden.": "Only email tickets can be changed to spam.", + "Nur Nachrichten löschen": "Delete messages only", + "Nur POST erlaubt.": "Only POST allowed.", + "Nur Priorität": "Priority only", + "Nur Status": "Status only", + "Nur ZIP-Dateien erlaubt.": "Only ZIP files allowed.", + "Nur ZIP-Dateien sind erlaubt.": "Only ZIP files are allowed.", + "Nur ausfüllen, wenn der Anbieter eine Prüfsumme nennt": "Only fill in if the provider states a checksum", + "Nur ausfüllen, wenn der Anbieter eine Signatur nennt": "Only fill in if the provider states a signature", + "Nur interne Notiz speichern": "Save internal note only", + "Nur nötig, wenn das Repository mit den Releases": "Only needed if the repository with the releases", + "Nur per E-Mail eingegangene Tickets können als Spam markiert werden.": "Only tickets received by email can be marked as spam.", + "Nur signierte Releases:": "Signed releases only:", + "Nur wenn der Live-Chat ausgeschaltet oder niemand erreichbar ist (Standard)": "Only if live chat is switched off or nobody can be reached (default)", + "Nächste Ausführung": "Next run", + "Offen": "Open", + "Offene Tickets": "Open tickets", + "Offline (Wartungsmodus)": "Offline (maintenance mode)", + "Offline-Nachricht": "Offline message", + "Ohne Abteilung": "No department", + "Ohne Beschreibung wird der Text des Tickets aus deinen eigenen Feldern zusammengesetzt („Bezeichnung: Eingabe“).": "Without a description, the ticket text is composed from your own fields (“Label: input”).", + "Ohne Betrefffeld wird der Betreff automatisch „Anfrage": "Without a subject field, the subject automatically becomes “Request", + "Ohne Konto nicht bearbeitbar.": "Cannot be edited without an account.", + "Ohne Konto: Geben Sie Ihre Ticketnummer und E-Mail-Adresse ein.": "Without an account: enter your ticket number and email address.", + "Ohne app_key wird ein schwacher Ersatzschlüssel aus den Datenbank-Zugangsdaten abgeleitet. Eintragen in config/config.php: php -r \"echo bin2hex(random_bytes(32));\". Danach nie mehr ändern.": "Without app_key, a weak substitute key is derived from the database credentials. Enter it in config/config.php: php -r \"echo bin2hex(random_bytes(32));\". Never change it afterwards.", + "Ohne eigenen Server werden Mails mit dieser Absenderadresse über den globalen SMTP aus den": "Without its own server, mails with this sender address are sent via the global SMTP from the", + "Online Mitarbeiter": "Staff online", + "Option 1: Datei in den DeskHub-Ordner legen (für große Dateien empfohlen)": "Option 1: put the file in the DeskHub folder (recommended for large files)", + "Option 2: Direkt hochladen (in Teilen von 5 MB, passend zum Limit dieses Servers)": "Option 2: upload directly (in 5 MB parts, matching this server's limit)", + "Optionale Felder beim Anlegen:": "Optional fields when creating:", + "Optionen": "Options", + "Optionen (eine pro Zeile)": "Options (one per line)", + "Optionen bei neuem Ticket": "Options for new tickets", + "Ordner mit diesen Dateien packen:": "Pack the folder with these files:", + "Organisation": "Organization", + "Organisation bearbeiten": "Edit organization", + "Organisation erstellt.": "Organization created.", + "Organisation erstellt:": "Organization created:", + "Organisation erstellt: {}": "Organization created: {}", + "Organisation gelöscht.": "Organization deleted.", + "Organisation gelöscht: #": "Organization deleted: #", + "Organisation gelöscht: #{#}": "Organization deleted: #{}", + "Organisation zugeordnet für Kunde #": "Organization assigned for customer #", + "Organisation zugeordnet für Kunde #{#}": "Organization assigned for customer #{}", + "Organisationen": "Organizations", + "Original-E-Mail wurde im IMAP-Ordner nicht gefunden.": "The original email was not found in the IMAP folder.", + "PHP FTP-Erweiterung nicht verfügbar.": "PHP FTP extension not available.", + "PHP-Code im Ordner uploads/ wird nicht ausgeführt.": "PHP code in the uploads/ folder is not executed.", + "PHP-Fehler werden im Browser angezeigt": "PHP errors are displayed in the browser", + "PHP-IMAP ist nicht installiert.": "PHP IMAP is not installed.", + "PHP-IMAP-Erweiterung (php-imap) ist auf diesem Server nicht installiert.": "The PHP IMAP extension (php-imap) is not installed on this server.", + "PNG/SVG empfohlen, max. 2 MB. Wird überall statt „DeskHub\" angezeigt. Der Name der Installation steht standardmäßig daneben und lässt sich unten ausblenden.": "PNG/SVG recommended, 2 MB at most. Shown everywhere instead of “DeskHub”. The installation name is shown next to it by default and can be hidden below.", + "Passwort": "Password", + "Passwort *": "Password *", + "Passwort eingeben": "Enter password", + "Passwort geändert": "Password changed", + "Passwort geändert.": "Password changed.", + "Passwort per Reset-Link zurückgesetzt": "Password reset via reset link", + "Passwort speichern": "Save password", + "Passwort vergessen": "Forgot password", + "Passwort vergessen – {}": "Forgot password – {}", + "Passwort vergessen?": "Forgot your password?", + "Passwort wiederholen": "Repeat password", + "Passwort zurücksetzen": "Reset password", + "Passwort zurücksetzen (Mitarbeiterbereich)": "Reset password (staff area)", + "Passwort zurücksetzen – Mitarbeiterbereich": "Reset password – staff area", + "Passwort ändern": "Change password", + "Passwort-zurücksetzen-Mail (Kunde)": "Password reset email (customer)", + "Passwort-zurücksetzen-Mail (Mitarbeiter)": "Password reset email (staff)", + "Passwörter werden nur schwach verschlüsselt. Bitte in": "Passwords are only weakly encrypted. Please in", + "Pause": "Break", + "Pausiert": "Paused", + "Pflichtfeld": "Required field", + "Pflichtfelder sind mit": "Required fields are marked with", + "Platzhaltertext der Beschreibung": "Placeholder text of the description", + "Plugin aus dem Katalog aktualisiert:": "Plugin updated from the catalog:", + "Plugin aus dem Katalog aktualisiert: {}": "Plugin updated from the catalog: {}", + "Plugin aus dem Katalog installiert:": "Plugin installed from the catalog:", + "Plugin aus dem Katalog installiert: {}": "Plugin installed from the catalog: {}", + "Plugin nicht gefunden.": "Plugin not found.", + "Plugin „{}“ meldet einen Fehler": "Plugin “{}” reports an error", + "Plugin „{}“ wurde wegen Fehlern deaktiviert": "Plugin “{}” was disabled because of errors", + "Plugin-Einstellungen geändert (Katalog/Herausgeber-Schlüssel)": "Plugin settings changed (catalog/publisher key)", + "Plugin-Endpunkt nicht gefunden oder Plugin nicht aktiv.": "Plugin endpoint not found or plugin not active.", + "Plugin-Updates verfügbar:": "Plugin updates available:", + "Plugin-Updates verfügbar: {}": "Plugin updates available: {}", + "Plugins (Hintergrundaufgaben)": "Plugins (background tasks)", + "Plugins (Hintergrundaufgaben) jetzt manuell ausführen?": "Run plugins (background tasks) manually now?", + "Plugins müssen signiert sein (Einstellung „Signatur erforderlich“). Diesem Paket fehlt die Signatur.": "Plugins must be signed (setting “Signature required”). This package has no signature.", + "Plugins und Themes": "Plugins and themes", + "Popups auf dem Handy bei neuen Tickets, Kundenantworten und Zuweisungen, auch wenn die App geschlossen ist. Die Nachrichten laufen über Google (Firebase Cloud Messaging).": "Popups on the phone for new tickets, customer replies and assignments, even when the app is closed. The messages are delivered via Google (Firebase Cloud Messaging).", + "Postfach": "Mailbox", + "Postfach / Ordner": "Mailbox / folder", + "Postfach bearbeiten": "Edit mailbox", + "Postfach gelöscht.": "Mailbox deleted.", + "Postfach gespeichert.": "Mailbox saved.", + "Postfach nicht gefunden.": "Mailbox not found.", + "Postfächer (Abruf)": "Mailboxes (retrieval)", + "Postfächer (E-Mail-Abruf)": "Mailboxes (email fetching)", + "Postfächer für den E-Mail-Abruf": "Mailboxes for email fetching", + "Postfächer verwalten →": "Manage mailboxes →", + "Postfächer werden jetzt direkt bei der jeweiligen": "Mailboxes are now fetched directly at the respective", + "Postfächer, aus denen eingehende E-Mails als Tickets importiert werden. Es können mehrere Postfächer angelegt werden (z.B. ein eigenes je Abteilung) – jedes mit eigenem Server, Zugangsdaten und optionaler Standardabteilung.": "Mailboxes from which incoming emails are imported as tickets. Several mailboxes can be set up (e.g. one per department) – each with its own server, credentials and optional default department.", + "Priorisiert (mir zugewiesen oder unbearbeitet)": "Prioritized (assigned to me or unprocessed)", + "Priorität": "Priority", + "Priorität *": "Priority *", + "Priorität / SLA aktualisieren": "Update priority / SLA", + "Priorität aktualisiert:": "Priority updated:", + "Priorität aktualisiert: {}": "Priority updated: {}", + "Priorität erstellt.": "Priority created.", + "Priorität erstellt:": "Priority created:", + "Priorität erstellt: {}": "Priority created: {}", + "Priorität für Tickets des Assistenten": "Priority for assistant tickets", + "Priorität gelöscht.": "Priority deleted.", + "Priorität gelöscht: #": "Priority deleted: #", + "Priorität gelöscht: #{#}": "Priority deleted: #{}", + "Priorität geändert": "Priority changed", + "Priorität setzen": "Set priority", + "Priorität wirklich löschen?": "Really delete this priority?", + "Priorität:": "Priority:", + "Prioritäten & SLA-Zeiten": "Priorities & SLA times", + "Prioritäten / SLA": "Priorities / SLA", + "Prioritäten / SLA verwalten": "Manage priorities / SLA", + "Prioritätsinformationen": "Priority information", + "Profil": "Profile", + "Profil aktualisiert: Name/E-Mail/Telefon": "Profile updated: name/email/phone", + "Profilbild": "Profile picture", + "Protokoll administrativer Änderungen (Mitarbeiter, Stammdaten, Einstellungen) – getrennt vom Aktivitätsprotokoll einzelner Tickets.": "Log of administrative changes (staff, master data, settings) – separate from the activity log of individual tickets.", + "Prüf-URL oder Host:Port": "Check URL or host:port", + "Prüfart": "Check type", + "Prüfen": "Check", + "Prüfen ·": "Check ·", + "Prüft die Einrichtung dieser Installation und ruft interne Adressen selbst ab, um zu sehen, ob sie von außen erreichbar wären.": "Checks the setup of this installation and retrieves internal addresses itself to see whether they would be reachable from outside.", + "Prüft, ob sich das Backup wiederherstellen lässt (verändert nichts)": "Checks whether the backup can be restored (changes nothing)", + "Prüfung konfigurieren": "Configure check", + "Prüfung speichern": "Save check", + "Prüfziel fehlt – wartet auf Zuordnung": "Check target missing – waiting for assignment", + "Push fehlgeschlagen:": "Push failed:", + "Push ist nicht eingerichtet: Es ist kein Push-Dienst eingetragen und kein eigener Firebase-Schlüssel hinterlegt.": "Push is not set up: no push service is set and no own Firebase key is stored.", + "Push-Benachrichtigungen senden": "Send push notifications", + "Push-Benachrichtigungen sind auf diesem Server nicht verfügbar (OpenSSL-Erweiterung fehlt oder PHP zu alt).": "Push notifications are not available on this server (OpenSSL extension missing or PHP too old).", + "Push-Dienst nicht eingerichtet": "Push service not set up", + "Push-Dienst nicht erreichbar": "Push service not reachable", + "Push-Einstellungen gespeichert.": "Push settings saved.", + "Quelle": "Source", + "Quelltext": "Source code", + "Queue gelöscht.": "Queue deleted.", + "Radio-Auswahl (Punkte)": "Radio selection (dots)", + "Reaktion": "Response", + "Reaktions- und Lösungszeit ab Ticketerstellung bzw. Prioritätsänderung. Mit aktivierten": "Response and resolution time from ticket creation or priority change. With enabled", + "Reaktionszeit (Std)": "Response time (hrs)", + "Rechnungsfrage": "Billing question", + "Rechte": "Permissions", + "Regel bearbeiten": "Edit rule", + "Regel gelöscht.": "Rule deleted.", + "Regelmäßig im Hintergrund laufen (etwa alle 5 Minuten)": "Run regularly in the background (about every 5 minutes)", + "Registrierte Kundenkonten und Gast-Anfrager (ohne Konto) aus allen Tickets.": "Registered customer accounts and guest requesters (without account) from all tickets.", + "Reihenfolge": "Order", + "Reihenfolge gespeichert.": "Order saved.", + "Reihenfolge per Drag & Drop ändern. Klick auf den Namen öffnet die Ansicht.": "Change the order by drag & drop. Clicking the name opens the view.", + "Reihenfolge speichern": "Save order", + "Reihum an die Mitarbeiter der Abteilung": "Round robin among the department's staff", + "Reiner Text. Adressen mit https:// werden anklickbar.": "Plain text. Addresses with https:// become clickable.", + "Reverse-Proxy nicht eingetragen": "Reverse proxy not entered", + "Rheinland-Pfalz": "Rhineland-Palatinate", + "Richtung:": "Direction:", + "Rolle": "Role", + "Rolle (für Mitarbeiter)": "Role (for staff)", + "Rolle erstellt.": "Role created.", + "Rolle erstellt:": "Role created:", + "Rolle erstellt: {}": "Role created: {}", + "Rolle gelöscht.": "Role deleted.", + "Rolle gelöscht: #": "Role deleted: #", + "Rolle gelöscht: #{#}": "Role deleted: #{}", + "Rolle in dieser Abteilung": "Role in this department", + "Rolle:": "Role:", + "Rollen": "Roles", + "Rollen legst du unter": "You create roles under", + "Rollenname": "Role name", + "Rücklaufquote": "Response rate", + "SLA Erste Antwort": "SLA first response", + "SLA Lösung": "SLA resolution", + "SLA überschritten": "SLA breached", + "SLA überschritten: Ticket #{ticket_number}": "SLA exceeded: ticket #{ticket_number}", + "SLA-Fristen": "SLA deadlines", + "SLA-Plan": "SLA plan", + "SLA-Plan erstellt.": "SLA plan created.", + "SLA-Plan erstellt:": "SLA plan created:", + "SLA-Plan erstellt: {}": "SLA plan created: {}", + "SLA-Plan gelöscht. Betroffene Abteilungen und Themen nutzen wieder die Zeiten der Priorität.": "SLA plan deleted. Affected departments and topics use the times of the priority again.", + "SLA-Plan gelöscht:": "SLA plan deleted:", + "SLA-Plan gelöscht: {}": "SLA plan deleted: {}", + "SLA-Pläne": "SLA plans", + "SLA-Prüfung": "SLA check", + "SLA-Prüfung jetzt manuell ausführen?": "Run SLA check manually now?", + "SLA-Status": "SLA status", + "SMTP geändert": "SMTP changed", + "SMTP-Einstellungen gespeichert.": "SMTP settings saved.", + "SMTP-Server": "SMTP server", + "SMTP-Versand": "SMTP sending", + "SQL-Datei hochladen oder Pfad angeben": "Upload SQL file or enter path", + "SQLite ist für Tests und kleine Installationen gedacht. Für den Produktivbetrieb mit mehreren Mitarbeitern wird MySQL/MariaDB empfohlen.": "SQLite is intended for tests and small installations. For production use with several staff members, MySQL/MariaDB is recommended.", + "SQLite-Modus aktiv:": "SQLite mode active:", + "STARTTLS-Verschlüsselung konnte nicht aktiviert werden.": "STARTTLS encryption could not be activated.", + "Sachsen": "Saxony", + "Sachsen-Anhalt": "Saxony-Anhalt", + "Sammelaktion: Mitarbeiter zugewiesen": "Bulk action: staff member assigned", + "Sammelaktion: Priorität geändert": "Bulk action: priority changed", + "Sammelaktion: Status geändert": "Bulk action: status changed", + "Sammelmodus einschalten, die Seiten durchklicken, dann bei Deutsch „Leere Vorlage laden“ (alle gesammelten Texte, noch ohne Übersetzung). Für Ergänzungen zu einer vorhandenen Sprache bei dieser „Vorlage laden“: bereits Übersetztes ist eingetragen.": "Switch on collection mode, click through the pages, then under German choose “Load empty template” (all collected texts, still without translation). To add to an existing language, choose “Load template” there: what is already translated is entered.", + "Sammelmodus für Übersetzer:": "Collection mode for translators:", + "Samstag": "Saturday", + "Scannen Sie den QR-Code oder geben Sie den Schlüssel manuell ein": "Scan the QR code or enter the key manually", + "Schema-Datei nicht gefunden:": "Schema file not found:", + "Schema-Datei nicht gefunden: {}": "Schema file not found: {}", + "Schichtplan bearbeiten": "Edit shift schedule", + "Schichtplan für": "Shift schedule for", + "Schichtplan für Mitarbeiter #": "Shift schedule for staff member #", + "Schichtplan für Mitarbeiter #{#}": "Shift schedule for staff member #{}", + "Schließen": "Close", + "Schlüssel": "Key", + "Schlüssel = deutscher Text, Wert = Übersetzung. {} steht für wechselnde Teile. Leere Werte werden ignoriert.": "Key = German text, value = translation. {} stands for changing parts. Empty values are ignored.", + "Schlüssel erstellen": "Create key", + "Schlüssel gelöscht. Systeme, die ihn nutzen, werden ab sofort abgewiesen.": "Key deleted. Systems that use it are rejected from now on.", + "Schlüssel „{}“ wurde erstellt.": "Key “{}” was created.", + "Schnellfilter": "Quick filters", + "Schreiben zum SMTP-Server fehlgeschlagen.": "Writing to the SMTP server failed.", + "Schwerer Fehler:": "Critical error:", + "Schwerer Fehler: {}": "Critical error: {}", + "Schützen Sie Ihr Konto mit einem zeitbasierten Einmalcode (TOTP – kompatibel mit Google Authenticator, Authy, etc.).": "Protect your account with a time-based one-time code (TOTP – compatible with Google Authenticator, Authy, etc.).", + "Seit": "Since", + "Seit 24.10.2026 19:44 geöffnet – wird beim Antworten automatisch als Zeit erfasst.": "Open since 24.10.2026 19:44 – time is recorded automatically when you reply.", + "Seite": "Page", + "Seite aktualisieren": "Update page", + "Seite aktualisiert:": "Page updated:", + "Seite aktualisiert: {}": "Page updated: {}", + "Seite erstellt.": "Page created.", + "Seite erstellt:": "Page created:", + "Seite erstellt: {}": "Page created: {}", + "Seite gelöscht.": "Page deleted.", + "Seite gelöscht: #": "Page deleted: #", + "Seite gelöscht: #{#}": "Page deleted: #{}", + "Seite nicht gefunden": "Page not found", + "Seite nicht gefunden oder Plugin nicht aktiv.": "Page not found or plugin not active.", + "Seite nicht gefunden – {}": "Page not found – {}", + "Seite nicht gefunden.": "Page not found.", + "Seite nicht schließen.": "Do not close the page.", + "Seite:": "Page:", + "Seite: {}": "Page: {}", + "Seiten": "Pages", + "Seiten-Verwaltung": "Page management", + "Seitenleiste einblenden": "Show sidebar", + "Seitenleiste einklappen": "Collapse sidebar", + "Senden": "Send", + "Server einmal starten, dann": "Start the server once, then", + "Server oder Port nicht erreichbar": "Server or port not reachable", + "Server und Port": "Server and port", + "Server-Crontab-Eintrag von DeskHub entfernt": "DeskHub server crontab entry removed", + "Server: 0,00 MB": "Server: 0.00 MB", + "Serveradresse für die Anmeldung": "Server address for sign-in", + "Servicezeit (Std)": "Service time (hrs)", + "Setzen": "Set", + "Sicherheitsprüfung": "Security check", + "Sie haben Ticket #": "You have ticket #", + "Sie haben Ticket #{#}": "You have ticket #{}", + "Sie haben bisher keine Supportanfragen erstellt.": "You have not created any support requests yet.", + "Sie haben in kurzer Zeit zu viele Tickets erstellt. Bitte versuchen Sie es später erneut.": "You have created too many tickets in a short time. Please try again later.", + "Sie haben keinen Zugriff auf Tickets dieser Abteilung.": "You do not have access to tickets of this department.", + "Sie haben keinen Zugriff auf die Abteilung des Ziel-Tickets.": "You do not have access to the department of the target ticket.", + "Sie haben keinen Zugriff auf die Abteilung „{}“.": "You do not have access to the department “{}”.", + "Sie haben keinen Zugriff auf diese Abteilung.": "You do not have access to this department.", + "Sie können Ihr eigenes Konto nicht deaktivieren.": "You cannot disable your own account.", + "Sie können Ihr eigenes Konto nicht löschen.": "You cannot delete your own account.", + "Sie wurden in Ticket #": "You were in ticket #", + "Sie wurden in Ticket #{#}": "You were in ticket #{}", + "Sie wurden wegen Inaktivität abgemeldet. Bitte melden Sie sich erneut an.": "You were logged out due to inactivity. Please log in again.", + "Signatur": "Signature", + "Signatur (E-Mail-Fuß für Antworten ohne Mitarbeiter-Signatur)": "Signature (email footer for replies without a staff signature)", + "Signatur (E-Mail-Fuß für eigene Antworten)": "Signature (email footer for own replies)", + "Signatur (optional, Base64)": "Signature (optional, Base64)", + "Signatur geprüft": "Signature verified", + "Signatur geprüft.": "Signature verified.", + "Signatur gespeichert.": "Signature saved.", + "Signatur vorhanden, Schlüssel fehlt": "Signature present, key missing", + "Sitzung abgelaufen. Bitte neu anmelden.": "Session expired. Please log in again.", + "Sitzungsfehler. Bitte nochmals versuchen.": "Session error. Please try again.", + "So nutzt du die API": "How to use the API", + "Sonntag": "Sunday", + "Sortieren nach": "Sort by", + "Sortiermodus:": "Sort mode:", + "Sortierung": "Sorting", + "Spam-/Junk-Ordner": "Spam/junk folder", + "Speichern": "Save", + "Speichern fehlgeschlagen (Ordner assets/branding/ nicht beschreibbar?).": "Saving failed (folder assets/branding/ not writable?).", + "Speichern fehlgeschlagen.": "Saving failed.", + "Sperre aufgehoben – Sie können das Ticket jetzt öffnen.": "Lock released – you can open the ticket now.", + "Sperre aufheben": "Remove lock", + "Sperre aufheben und übernehmen": "Release lock and take over", + "Sperren": "Block", + "Sperrliste": "Block list", + "Sperrliste ist leer.": "The block list is empty.", + "Sprach-Einstellungen geändert": "Language settings changed", + "Sprachen": "Languages", + "Sprachpaket: nach der Aktivierung erscheint die Flagge zum Umschalten": "Language pack: after activation the flag for switching appears", + "Stand: {} Uhr": "As of: {}", + "Standard": "Default", + "Standard-Berichte": "Default reports", + "Standard-Mitarbeiterrechte (ohne eigene Rolle)": "Default staff permissions (without own role)", + "Standardabteilung": "Default department", + "Standardabteilung (für E-Mail-Tickets ohne Zuordnung)": "Default department (for email tickets without assignment)", + "Standardabteilung verwenden": "Use default department", + "Standardpriorität (optional)": "Default priority (optional)", + "Standardsprache (für alle, die noch keine Flagge gewählt haben)": "Default language (for everyone who has not yet chosen a flag)", + "Startseiten-Inhalte": "Home page content", + "Startseiten-Inhalte gespeichert.": "Home page content saved.", + "Statistiken": "Statistics", + "Status": "Status", + "Status & Schichten": "Status & shifts", + "Status & Vorschau": "Status & preview", + "Status *": "Status *", + "Status abfragen:": "Query status:", + "Status der Mitarbeiter ändern (Admin)": "Change staff status (admin)", + "Status geändert": "Status changed", + "Status geändert:": "Status changed:", + "Status geändert: {}": "Status changed: {}", + "Status konnte nicht gespeichert werden.": "The status could not be saved.", + "Status nach dem Senden": "Status after sending", + "Status prüfen": "Check status", + "Status setzen": "Set status", + "Status von Mitarbeiter #": "Status of staff member #", + "Status von Mitarbeiter #{#}": "Status of staff member #{}", + "Status, Kennzahlen & Berichte": "Status, metrics & reports", + "Status:": "Status:", + "Status: {}": "Status: {}", + "Statusprüfungen": "Status checks", + "Statusseite": "Status page", + "Statusseite für Kunden anzeigen (Link „Status“ im Kundenbereich)": "Show status page to customers (link \"Status\" in the customer area)", + "Statusseite: Dienste automatisch erkannt und geprüft": "Status page: services detected and checked automatically", + "Statusseite: Einstellungen geändert": "Status page: settings changed", + "Statusseite: Meldung veröffentlicht": "Status page: incident published", + "Statusseite: Meldung veröffentlicht (App)": "Status page: incident published (app)", + "Stichwörter": "Keywords", + "Stichwörter (optional, durch Komma getrennt)": "Keywords (optional, comma-separated)", + "Stille Zeiten (keine Popups)": "Quiet hours (no popups)", + "Stille Zeiten bitte als Uhrzeit von/bis angeben (z. B. 22:00 und 06:00).": "Please enter quiet hours as a time from/to (e.g. 22:00 and 06:00).", + "Strg+F5": "Ctrl+F5", + "Stufe": "Level", + "Störung oder Wartung melden": "Report an incident or maintenance", + "Störung:": "Incident:", + "Störung: {}": "Incident: {}", + "Stündliche Prüfung. Letzte Ausführung:": "Hourly check. Last run:", + "Stündliche Prüfung. Letzte Ausführung: noch nie": "Hourly check. Last run: never", + "Stündliche Prüfung. Letzte Ausführung: {}": "Hourly check. Last run: {}", + "Suchbegriff eingeben …": "Enter a search term …", + "Suche": "Search", + "Suchen": "Search", + "Suchen…": "Search…", + "Supportcenter": "Support center", + "Supportcenter-Startseite": "Support center home", + "Supportcenter-Startseite – {}": "Support center home – {}", + "System-Update": "System update", + "Systemeinstellungen gespeichert.": "System settings saved.", + "Systemeinstellungen geändert": "System settings changed", + "Systemstandard": "System default", + "Systemstatus": "System status", + "Systemstatus – {}": "System status – {}", + "Tabellen, die es im Backup noch nicht gab, blieben unverändert:": "Tables that did not yet exist in the backup were left unchanged:", + "Tabellen, die es im Backup noch nicht gab, blieben unverändert: {}": "Tables that did not yet exist in the backup were left unchanged: {}", + "Tag der Arbeit": "Labour Day", + "Tag der Deutschen Einheit": "German Unity Day", + "Tag hinzufügen": "Add tag", + "Tag hinzugefügt:": "Tag added:", + "Tag hinzugefügt: {}": "Tag added: {}", + "Tag-Name": "Tag name", + "Tage": "Days", + "Tage (am besten kürzer als die Frist zum automatischen Schließen)": "Days (preferably shorter than the period for automatic closing)", + "Team erstellt.": "Team created.", + "Team erstellt:": "Team created:", + "Team erstellt: {}": "Team created: {}", + "Team gelöscht.": "Team deleted.", + "Team gelöscht:": "Team deleted:", + "Team gelöscht: {}": "Team deleted: {}", + "Team-Übersicht": "Team overview", + "Teamleiter": "Team lead", + "Teamname": "Team name", + "Technik": "Technology", + "Technisches Problem": "Technical issue", + "Teilweise eingeschränkt": "Partially degraded", + "Telefon": "Phone", + "Telefonnummer (optional)": "Phone number (optional)", + "Telegram Bot-Token": "Telegram bot token", + "Telegram Chat-ID": "Telegram chat ID", + "Test-Ereignis von DeskHub": "Test event from DeskHub", + "Test-Mail senden": "Send test email", + "Testen": "Test", + "Testnachricht an meine Geräte": "Test message to my devices", + "Testnachricht senden": "Send test message", + "Tests verwenden die gespeicherten Werte.": "Tests use the saved values.", + "Text (Vorschau)": "Text (preview)", + "Text des Absende-Knopfs": "Text of the submit button", + "Text, wenn er keine Antwort findet": "Text if it finds no answer", + "Textbaustein bearbeiten": "Edit text snippet", + "Textbaustein erstellt.": "Text snippet created.", + "Textbaustein erstellt:": "Text snippet created:", + "Textbaustein erstellt: {}": "Text snippet created: {}", + "Textbaustein gelöscht.": "Text snippet deleted.", + "Textbaustein gelöscht: #": "Text snippet deleted: #", + "Textbaustein gelöscht: #{#}": "Text snippet deleted: #{}", + "Textbaustein wirklich löschen?": "Really delete this text snippet?", + "Texte der automatischen E-Mails anpassen. Platzhalter in geschweiften Klammern werden beim Versand durch die echten Werte ersetzt. Der Branding-Rahmen (Kopfzeile mit Firmenname, Fußzeile) wird beim Versand automatisch um diesen Text herum ergänzt – hier nur den Inhalt der Karte anpassen.": "Customize the texts of the automatic emails. Placeholders in curly braces are replaced with the real values when sending. The branding frame (header with company name, footer) is added around this text automatically when sending – here only adjust the content of the card.", + "Theme hochladen": "Upload theme", + "Theme „{}“ ist jetzt aktiv.": "Theme “{}” is now active.", + "Theme „{}“ wurde gelöscht.": "Theme “{}” was deleted.", + "Theme-Datei ist beschädigt:": "Theme file is damaged:", + "Theme-Datei ist beschädigt: {}": "Theme file is damaged: {}", + "Theme-Datei konnte nicht entpackt werden:": "Theme file could not be unpacked:", + "Theme-Datei konnte nicht entpackt werden: {}": "Theme file could not be unpacked: {}", + "Theme-Paket": "Theme package", + "Themen": "Topics", + "Themes aus dem Katalog": "Themes from the catalog", + "Themes müssen signiert sein (Einstellung „Signatur erforderlich“). Diesem Paket fehlt die Signatur.": "Themes must be signed (setting “Signature required”). This package has no signature.", + "Thüringen": "Thuringia", + "Ticket": "Ticket", + "Ticket #": "Ticket #", + "Ticket #{#}": "Ticket #{}", + "Ticket #{}": "Ticket #{}", + "Ticket #{} – {}": "Ticket #{1} – {2}", + "Ticket aktualisiert.": "Ticket updated.", + "Ticket als Spam markiert": "Ticket marked as spam", + "Ticket anlegen (JSON). Antwort:": "Create ticket (JSON). Response:", + "Ticket ansehen": "View ticket", + "Ticket ansehen – {}": "View ticket – {}", + "Ticket aufgeteilt → #": "Ticket split → #", + "Ticket aufgeteilt → #{#}": "Ticket split → #{}", + "Ticket aufgeteilt. Neues Ticket: #": "Ticket split. New ticket: #", + "Ticket aufgeteilt. Neues Ticket: #{#}": "Ticket split. New ticket: #{}", + "Ticket aufteilen": "Split ticket", + "Ticket automatisch geschlossen (Ticket-Regel)": "Ticket closed automatically (ticket rule)", + "Ticket dauerhaft in Ihrem Konto speichern?": "Save ticket permanently in your account?", + "Ticket durch Mitarbeiter erstellt (Mobile App)": "Ticket created by staff (mobile app)", + "Ticket durch Mitarbeiter erstellt (Quelle:": "Ticket created by staff (source:", + "Ticket durch Mitarbeiter erstellt (Quelle: {}": "Ticket created by staff (source: {}", + "Ticket eingegangen": "Ticket received", + "Ticket erstellen": "Create ticket", + "Ticket erstellt": "Ticket created", + "Ticket erstellt (an Kunde)": "Ticket created (to customer)", + "Ticket für den Kunden-Zugriffslink nicht gefunden.": "Ticket for the customer access link not found.", + "Ticket hinzufügen": "Add ticket", + "Ticket im Namen eines Kunden anlegen – z.B. bei Telefonanrufen oder Vor-Ort-Anfragen.": "Create a ticket on behalf of a customer – e.g. for phone calls or on-site requests.", + "Ticket inkl. Verlauf unwiderruflich löschen?": "Permanently delete the ticket including its history?", + "Ticket ist überfällig (SLA überschritten)": "Ticket is overdue (SLA exceeded)", + "Ticket mir zugewiesen": "Ticket assigned to me", + "Ticket nicht gefunden oder kein Zugriff.": "Ticket not found or no access.", + "Ticket nicht gefunden.": "Ticket not found.", + "Ticket offen seit X Stunden": "Ticket open for X hours", + "Ticket schließen": "Close ticket", + "Ticket schließen (wird angelegt, aber sofort geschlossen)": "Close ticket (is created but closed immediately)", + "Ticket verknüpfen (Ticket-Nr., optional)": "Link ticket (ticket no., optional)", + "Ticket verwerfen (z.B. Spam)": "Discard ticket (e.g. spam)", + "Ticket wieder geöffnet": "Ticket reopened", + "Ticket wurde": "Ticket was", + "Ticket zugewiesen": "Ticket assigned", + "Ticket über den digitalen Assistenten erstellt": "Ticket created via the digital assistant", + "Ticket über die API erstellt": "Ticket created via the API", + "Ticket überfällig (an Admins)": "Ticket overdue (to admins)", + "Ticket(s)": "ticket(s)", + "Ticket(s) anonymisiert (geschlossen/gelöst, älter als": "ticket(s) anonymized (closed/resolved, older than", + "Ticket(s) anonymisiert (geschlossen/gelöst, älter als 24 Monate).": "ticket(s) anonymized (closed/resolved, older than 24 months).", + "Ticket(s) anonymisiert.": "ticket(s) anonymized.", + "Ticket(s) waren Mitarbeitern zugewiesen, die es in DeskHub nicht gibt (Zuordnung über gleiche E-Mail-Adresse). Sie sind jetzt unzugewiesen.": "ticket(s) were assigned to staff who do not exist in DeskHub (matched via the same email address). They are now unassigned.", + "Ticket-Bewertung aktivieren (Kunden können nach Schließung 1–5 Sterne vergeben)": "Enable ticket rating (customers can give 1–5 stars after closing)", + "Ticket-Details": "Ticket details", + "Ticket-Feld": "Ticket field", + "Ticket-Feld aktualisiert:": "Ticket field updated:", + "Ticket-Feld aktualisiert: {}": "Ticket field updated: {}", + "Ticket-Feld erstellt:": "Ticket field created:", + "Ticket-Feld erstellt: {}": "Ticket field created: {}", + "Ticket-Feld gelöscht:": "Ticket field deleted:", + "Ticket-Feld gelöscht: {}": "Ticket field deleted: {}", + "Ticket-Felder": "Ticket fields", + "Ticket-Formular": "Ticket form", + "Ticket-Liste": "Ticket list", + "Ticket-Nachrichten": "Ticket messages", + "Ticket-Nr.:": "Ticket no.:", + "Ticket-Nummer, Betreff, Status": "Ticket number, subject, status", + "Ticket-Regel aktualisiert.": "Ticket rule updated.", + "Ticket-Regel aktualisiert:": "Ticket rule updated:", + "Ticket-Regel aktualisiert: {}": "Ticket rule updated: {}", + "Ticket-Regel angewendet:": "Ticket rule applied:", + "Ticket-Regel angewendet: {}": "Ticket rule applied: {}", + "Ticket-Regel erstellt.": "Ticket rule created.", + "Ticket-Regel erstellt:": "Ticket rule created:", + "Ticket-Regel erstellt: {}": "Ticket rule created: {}", + "Ticket-Regel gelöscht.": "Ticket rule deleted.", + "Ticket-Regel gelöscht:": "Ticket rule deleted:", + "Ticket-Regel gelöscht: #": "Ticket rule deleted: #", + "Ticket-Regel gelöscht: #{#}": "Ticket rule deleted: #{}", + "Ticket-Regel gelöscht: {}": "Ticket rule deleted: {}", + "Ticket-Regel:": "Ticket rule:", + "Ticket-Regel: {}": "Ticket rule: {}", + "Ticket-Regeln": "Ticket rules", + "Ticket-Regeln (Filter)": "Ticket rules (filter)", + "Ticket-Vorlage gelöscht": "Ticket template deleted", + "Ticket-Vorlage gespeichert:": "Ticket template saved:", + "Ticket-Vorlage gespeichert: {}": "Ticket template saved: {}", + "Ticket-Vorlagen": "Ticket templates", + "Ticket-erstellt-Mail": "Ticket created email", + "Ticket-Übersicht": "Ticket overview", + "Ticket-überfällig-Mail": "Ticket overdue email", + "Ticketaktivität": "Ticket activity", + "Ticketnummer": "Ticket number", + "Ticketnummer nicht gefunden oder die Ticket-E-Mail-Adresse stimmt nicht mit Ihrem Konto überein.": "Ticket number not found or the ticket email address does not match your account.", + "Ticketnummer oder Betreff suchen…": "Search ticket number or subject…", + "Ticketnummer und E-Mail-Adresse passen nicht zusammen. Bitte prüfen Sie Ihre Eingabe.": "Ticket number and email address do not match. Please check your input.", + "Tickets": "Tickets", + "Tickets ({#})": "Tickets ({})", + "Tickets anlegen": "Create tickets", + "Tickets ansehen": "View tickets", + "Tickets automatisch schließen, wenn der Kunde nach einer Antwort nicht mehr reagiert": "Close tickets automatically if the customer does not respond after a reply", + "Tickets beantworten": "Reply to tickets", + "Tickets die automatisch nach einem festen Intervall neu erstellt werden (z.B. monatliche Wartung). Erstellung per Cronjob:": "Tickets that are recreated automatically at a fixed interval (e.g. monthly maintenance). Creation via cron job:", + "Tickets die automatisch nach einem festen Intervall neu erstellt werden (z.B. monatliche Wartung). Erstellung per Cronjob: {}": "Tickets that are recreated automatically at a fixed interval (e.g. monthly maintenance). Creation via cron job: {}", + "Tickets gesamt": "Total tickets", + "Tickets im Namen von Kunden erstellen": "Create tickets on behalf of customers", + "Tickets innerhalb der Frist gelöst": "Tickets resolved within the deadline", + "Tickets lesen": "Read tickets", + "Tickets löschen": "Delete tickets", + "Tickets schließen/lösen": "Close/resolve tickets", + "Tickets zusammenführen": "Merge tickets", + "Tickets zuweisen": "Assign tickets", + "Tickets zuweisen (Mitarbeiter/Team)": "Assign tickets (staff/team)", + "Tickets übertragen": "Transfer tickets", + "Tickets übertragen (Abteilung ändern)": "Transfer tickets (change department)", + "Tickets)": "tickets)", + "Ticketstatus überprüfen": "Check ticket status", + "Titel": "Title", + "Titel *": "Title *", + "Titelbild (Hero-Banner)": "Cover image (hero banner)", + "Token aus Gitea einfügen": "Paste token from Gitea", + "Tragen Sie den 6-stelligen Code ein und klicken Sie „2FA aktivieren\"": "Enter the 6-digit code and click “Enable 2FA”", + "Trägt die gesetzlichen Feiertage des gewählten Bundeslandes für das gewählte Jahr ein (inkl. beweglicher Feiertage wie Ostern). Bereits vorhandene Daten werden übersprungen, nichts wird doppelt angelegt.": "Adds the statutory holidays of the selected federal state for the selected year (including movable holidays such as Easter). Existing data is skipped, nothing is created twice.", + "Typ": "Type", + "Typisch bei Shared-Hosting (z.B. den meisten Strato-Webhosting-Paketen). Der oben aktive automatische Hintergrund-Betrieb deckt das in der Regel bereits ab – alternativ unten die Zeilen manuell im Hosting-Kundenlogin eintragen, falls dort ein Cronjob-Manager verfügbar ist.": "Typical for shared hosting (e.g. most Strato web hosting plans). The automatic background operation enabled above usually covers this already – alternatively enter the lines below manually in your hosting customer login if a cron job manager is available there.", + "Täglich": "Daily", + "Uhr. Das Ticket kommt dann zurück und du wirst benachrichtigt.": "o’clock. The ticket then comes back and you are notified.", + "Um 2FA zu deaktivieren, bestätigen Sie mit Ihrem Passwort:": "To disable 2FA, confirm with your password:", + "Um 2FA zu deaktivieren, bestätigen Sie mit Ihrem Passwort: {}": "To disable 2FA, confirm with your password: {}", + "Um Ihnen weiterhelfen zu können, benötigen wir noch ein paar zusätzli…": "To help you further, we need a few additional details…", + "Unbeantwortet": "Unanswered", + "Unbekannter Status.": "Unknown status.", + "Unbekanntes Bundesland-Kürzel:": "Unknown federal state code:", + "Unbekanntes Bundesland-Kürzel: {}": "Unknown federal state code: {}", + "Unerwartete SMTP-Antwort:": "Unexpected SMTP response:", + "Unerwartete SMTP-Antwort: {}": "Unexpected SMTP response: {}", + "Ungültige Anfrage (CSRF-Token fehlt oder ist ungültig). Bitte gehen Sie zurück und versuchen Sie es erneut.": "Invalid request (CSRF token missing or invalid). Please go back and try again.", + "Ungültige Anfrage.": "Invalid request.", + "Ungültige E-Mail-Adresse.": "Invalid email address.", + "Ungültige IP-Adresse:": "Invalid IP address:", + "Ungültige IP-Adresse: {}": "Invalid IP address: {}", + "Ungültige oder nicht unterstützte Prüf-URL": "Invalid or unsupported check URL", + "Ungültiger Code. Bitte erneut versuchen.": "Invalid code. Please try again.", + "Ungültiger Dateiname.": "Invalid file name.", + "Ungültiger Dateipfad.": "Invalid file path.", + "Ungültiger Dienst oder Zustand.": "Invalid service or state.", + "Ungültiger Mitarbeiter oder Status.": "Invalid staff member or status.", + "Ungültiger Mitarbeiter.": "Invalid staff member.", + "Ungültiger Status": "Invalid status", + "Ungültiger Status.": "Invalid status.", + "Ungültiger Trigger.": "Invalid trigger.", + "Ungültiger Upload-Pfad.": "Invalid upload path.", + "Ungültiger Zielstatus.": "Invalid target status.", + "Ungültiges Prüfziel": "Invalid check target", + "Untereinander": "Stacked", + "Unterstützt werden SQL-Dumps von osTicket 1.10 bis 1.18 (phpMyAdmin-Export oder": "SQL dumps from osTicket 1.10 to 1.18 are supported (phpMyAdmin export or", + "Unzulässige Datei im Paket:": "Not permitted file in the package:", + "Unzulässige Datei im Paket: {}": "Not permitted file in the package: {}", + "Unzulässiger Pfad im Backup:": "Not permitted path in the backup:", + "Unzulässiger Pfad im Backup: {}": "Not permitted path in the backup: {}", + "Update für die Kunden": "Update for the customers", + "Update senden": "Send update", + "Updates verfügbar:": "Updates available:", + "Updates verfügbar: {}": "Updates available: {}", + "Updates werden nur installiert, wenn sie mit dem Schlüssel des Herausgebers signiert sind. Ein manipuliertes Paket wird abgelehnt. (Ein manuell hochgeladenes ZIP wird nicht geprüft: Laden Sie nur Pakete aus vertrauenswürdiger Quelle hoch.)": "Updates are only installed if they are signed with the publisher’s key. A tampered package is rejected. (A manually uploaded ZIP is not checked: only upload packages from a trusted source.)", + "Updates: neue Datei laden und darüber installieren. Eure Anmeldung bleibt erhalten.": "Updates: load a new file and install over it. Your sign-in is kept.", + "Upload-Einstellungen gespeichert.": "Upload settings saved.", + "Upload-Einstellungen geändert": "Upload settings changed", + "Upload-Fehler (Code": "Upload error (code", + "Upload-Fehler Code:": "Upload error code:", + "Upload-Fehler Code: {}": "Upload error code: {}", + "Urlaubsmodus ist aktuell": "Vacation mode is currently", + "Ursache gefunden": "Cause found", + "Ursprüngliches Ticket": "Original ticket", + "Verbindung testen": "Test connection", + "Verfügbar": "Available", + "Verfügbare Platzhalter:": "Available placeholders:", + "Verfügbare Variablen — klicken zum Einfügen:": "Available variables — click to insert:", + "Verfügbare Variablen — klicken zum Einfügen: {}": "Available variables — click to insert: {}", + "Verfügbarkeit & Schichten": "Availability & shifts", + "Verfügbarkeit der letzten 24 Stunden": "Availability over the last 24 hours", + "Verfügbarkeit wird geprüft…": "Checking availability…", + "Vergangene Meldungen (letzte 14 Tage)": "Past incidents (last 14 days)", + "Verknüpftes Ticket": "Linked ticket", + "Verknüpfung der Bedingungen": "How the conditions are combined", + "Verlauf (1 Nachricht)": "History (1 message)", + "Verlauf und Status Ihrer aktuellen und bisherigen Supportanfragen.": "History and status of your current and previous support requests.", + "Verlauf, Tags und Collaborators werden ins Ziel-Ticket verschoben. Dieses Ticket wird geschlossen.": "History, tags and collaborators are moved to the target ticket. This ticket will be closed.", + "Verlinkter Teil des Textes": "Linked part of the text", + "Versand fehlgeschlagen. Bitte SMTP-Daten prüfen.": "Sending failed. Please check the SMTP data.", + "Versand über:": "Sent via:", + "Versand über: {}": "Sent via: {}", + "Verschieben nach „{}“ fehlgeschlagen: {}": "Moving to “{}” failed: {}", + "Verschlüsselung": "Encryption", + "Verschlüsselungsschlüssel gesetzt": "Encryption key set", + "Versuchen fehl. Eingehende Mails werden in dieser Zeit": "attempts fail. Incoming mails are during this time", + "Verwalten": "Manage", + "Verwenden →": "Use →", + "Verzeichnis": "Directory", + "Veröffentliche die Version im Administrationsbereich der Plugin-Website.": "Publish the version in the administration area of the plugin website.", + "Veröffentlichen": "Publish", + "Vielen Dank für Ihre Bewertung!": "Thank you very much for your rating!", + "Vielen Dank für Ihre Nachricht. Wir haben Ihr Anliegen erhalten und k…": "Thank you for your message. We have received your request and…", + "Vielen Dank! Ihr Ticket wurde erstellt.": "Thank you! Your ticket has been created.", + "Vielen Dank, Sie haben dieses Ticket bereits bewertet.": "Thank you, you have already rated this ticket.", + "Von": "From", + "Von:": "From:", + "Von: {}": "From: {}", + "Vorbelegte Formulare für häufige Anliegen, zum Beispiel „Neuer Mitarbeiter“ oder „Passwort zurücksetzen“. Kunden wählen sie auf der Seite „Neues Ticket“ (wenn sie für Kunden sichtbar sind), Mitarbeiter beim Anlegen eines Tickets im Web, im Windows-Programm und in der App.": "Pre-filled forms for common requests, for example “New employee” or “Reset password”. Customers choose them on the “New ticket” page (if they are visible to customers), staff when creating a ticket on the web, in the Windows program and in the app.", + "Vorgabe für den Betreff": "Default for the subject", + "Vorhandene Backups": "Existing backups", + "Vorhandene Vorlagen": "Existing templates", + "Vorlage auf Standard zurückgesetzt.": "Template reset to default.", + "Vorlage bearbeiten": "Edit template", + "Vorlage gelöscht.": "Template deleted.", + "Vorlage gespeichert.": "Template saved.", + "Vorlage laden": "Load template", + "Vorlagen": "Templates", + "Vorlagen / Textbausteine": "Templates / text snippets", + "Vorname Nachname": "First name last name", + "Vorschau": "Preview", + "Vorübergehend nicht erreichbar": "Temporarily unavailable", + "Wann ist er aktiv?": "When is it active?", + "War dieser Artikel hilfreich? Wenn nicht,": "Was this article helpful? If not,", + "Wartet auf Kunde": "Waiting for customer", + "Wartung": "Maintenance", + "Wartungsstatus geändert.": "Maintenance status changed.", + "Was hat gut geklappt, was können wir besser machen?": "What went well, what can we do better?", + "Was ist zu tun?": "What needs to be done?", + "Was soll importiert werden?": "What should be imported?", + "Was wird anonymisiert?": "What is anonymized?", + "Webhook erstellt.": "Webhook created.", + "Webhook erstellt:": "Webhook created:", + "Webhook erstellt: {}": "Webhook created: {}", + "Webhook gelöscht.": "Webhook deleted.", + "Webhook gelöscht: #": "Webhook deleted: #", + "Webhook gelöscht: #{#}": "Webhook deleted: #{}", + "Webseite antwortet mit HTTP": "Website responds with HTTP", + "Website-URL": "Website URL", + "Website-URL nutzt kein HTTPS": "Website URL does not use HTTPS", + "Weiter →": "Next →", + "Weitere Aktionen": "More actions", + "Weitere Informationen benötigt": "More information needed", + "Weitere Informationen → Trotzdem ausführen": "More information → Run anyway", + "Wenige Stunden pro Tag (z. B. nur abends) lassen die Fälligkeit in": "A few hours per day (e.g. only evenings) let the due date in", + "Wert": "Value", + "Wie erstelle ich ein Ticket?": "How do I create a ticket?", + "Wie können wir helfen?": "How can we help?", + "Wie lange dauert die Bearbeitung?": "How long does processing take?", + "Wie zufrieden waren Sie mit der Bearbeitung?": "How satisfied were you with the handling?", + "Wieder geöffnet": "Reopened", + "Wiederkehrende Tickets": "Recurring tickets", + "Wiederkehrende Tickets jetzt manuell ausführen?": "Run recurring tickets manually now?", + "Wiederkehrendes Ticket bearbeitet:": "Recurring ticket edited:", + "Wiederkehrendes Ticket bearbeitet: {}": "Recurring ticket edited: {}", + "Wiederkehrendes Ticket erstellt.": "Recurring ticket created.", + "Wiederkehrendes Ticket erstellt:": "Recurring ticket created:", + "Wiederkehrendes Ticket erstellt: {}": "Recurring ticket created: {}", + "Wiederkehrendes Ticket gelöscht": "Recurring ticket deleted", + "Wiederverwendbare Auswahllisten für Ticket-Felder. Wähle in einem Ticket-Feld den Typ „Liste“ und verknüpfe eine dieser Listen.": "Reusable selection lists for ticket fields. In a ticket field choose the type “List” and link one of these lists.", + "Wiederverwendbare Auswahllisten für Ticket-Felder: Wähle in einem": "Reusable selection lists for ticket fields: in a", + "Wiedervorlage": "Snooze", + "Wiedervorlage beendet (Kunde hat geantwortet)": "Follow-up ended (customer replied)", + "Wiedervorlage fällig": "Snooze due", + "Wiedervorlagen": "Snoozes", + "Wiedervorlagen jetzt manuell ausführen?": "Run snoozes manually now?", + "Willkommen zurück, {}": "Welcome back, {}", + "Willkommen! Ihr Konto wurde erstellt.": "Welcome! Your account has been created.", + "Willkommen, Gast": "Welcome, Guest", + "Willkommen, {}": "Welcome, {}", + "Windows-Server werden nicht unterstützt (Crontab ist ein Unix/Linux-Mechanismus).": "Windows servers are not supported (crontab is a Unix/Linux mechanism).", + "Wir senden Ihnen einen Link zum Zurücksetzen.": "We will send you a reset link.", + "Wird automatisch an Ihre ausgehenden Ticket-Antworten angehängt. Ist keine Mitarbeiter-Signatur gesetzt, greift die Abteilungs-Signatur.": "Appended automatically to your outgoing ticket replies. If no staff signature is set, the department signature applies.", + "Wird beobachtet": "Being monitored", + "Wird im Browser-Tab, in E-Mails und in der Web-App angezeigt.": "Shown in the browser tab, in emails and in the web app.", + "Wird in E-Mail-Links verwendet. Kein abschließendes /": "Used in email links. No trailing /", + "Wird nur an öffentliche Antworten angehängt, nicht an interne Notizen.": "Only appended to public replies, not to internal notes.", + "Wird oberhalb der Felder angezeigt": "Shown above the fields", + "Wird untersucht": "Investigating", + "Wird verwendet, wenn ein eingegangenes E-Mail-Ticket als Spam markiert wird.": "Used when an incoming email ticket is marked as spam.", + "Wirklich sperren?": "Really block?", + "Wirksame Rechte": "Effective permissions", + "Wissensdatenbank": "Knowledge base", + "Wissensdatenbank durchsuchen oder direkt ein Ticket eröffnen – wir antworten so schnell wie möglich.": "Search the knowledge base or open a ticket right away – we will reply as quickly as possible.", + "Wissensdatenbank im Kundenportal anzeigen": "Show knowledge base in the customer portal", + "Wissensdatenbank verwalten": "Manage knowledge base", + "Wissensdatenbank – {}": "Knowledge base – {}", + "Wo im Formular erscheint das Feld?": "Where in the form does the field appear?", + "Woche": "Week", + "Wochenzeiten": "Weekly hours", + "Wollte ein Ticket": "Wanted a ticket", + "Womit können wir helfen? Eine Vorlage füllt das Formular für Sie vor:": "How can we help? A template pre-fills the form for you:", + "Womit können wir helfen? Eine Vorlage füllt das Formular für Sie vor: {}": "How can we help? A template pre-fills the form for you: {}", + "Wonach suchen Sie?": "What are you looking for?", + "Worum geht es?": "What is it about?", + "Wähle Gruppierung, Kennzahlen, Zeitraum und Filter – nach dem Erstellungsdatum der Tickets. Berichte lassen sich speichern und mit allen teilen.": "Choose grouping, metrics, period and filters – by the creation date of the tickets. Reports can be saved and shared with everyone.", + "Wähle die Abteilungen, zu denen der Agent Zugang haben soll.": "Choose the departments the agent should have access to.", + "Wähle die Nachrichten aus die in das neue Ticket verschoben werden sollen. Die gewählten Nachrichten werden aus diesem Ticket entfernt.": "Select the messages to be moved to the new ticket. The selected messages are removed from this ticket.", + "Wähle, wofür die App ein Popup zeigen soll.": "Choose what the app should show a popup for.", + "Wöchentlich": "Weekly", + "Wörter, die Kunden und Artikel unterschiedlich nennen, aber dasselbe meinen. Eine Gruppe je Zeile, durch Komma getrennt, zum Beispiel": "Words that customers and articles name differently but mean the same. One group per line, separated by commas, for example", + "ZIP konnte nicht geöffnet werden (Code:": "ZIP could not be opened (code:", + "ZIP konnte nicht geöffnet werden (Code: {}": "ZIP could not be opened (code: {}", + "ZIP unter Plugins hochladen und aktivieren (das Sprachpaket braucht keine Berechtigungen). Die Flagge erscheint sofort.": "Upload the ZIP under Plugins and activate it (the language pack needs no permissions). The flag appears immediately.", + "ZIP-Datei": "ZIP file", + "ZIP-Datei konnte nicht geöffnet werden.": "ZIP file could not be opened.", + "ZIP-Datei von Gitea hochladen und installieren.": "Upload and install a ZIP file from Gitea.", + "Zahl": "Number", + "Zeigt, was der Assistent auf eine Kundenfrage antworten würde (ohne Zähler und ohne Ticket).": "Shows what the assistant would answer to a customer question (without counters and without a ticket).", + "Zeiten in Stunden ab Ticketerstellung bzw. Prioritätsänderung. Sie gelten kalendarisch (rund um die Uhr) –": "Times in hours from ticket creation or priority change. They apply in calendar time (around the clock) –", + "Zeiterfassung": "Time tracking", + "Zeitplan aus": "Schedule off", + "Zeitplan gespeichert.": "Schedule saved.", + "Zeitplan speichern": "Save schedule", + "Zeitzone": "Time zone", + "Ziel": "Target", + "Ziel ist intern oder nicht auflösbar (blockiert)": "Target is internal or unresolvable (blocked)", + "Ziel-Ticket #": "Target ticket #", + "Ziel-Ticket #{#}": "Target ticket #{}", + "Zielordner": "Target folder", + "Zielverzeichnis": "Target directory", + "Zu den Plugins": "To the plugins", + "Zu einem Zeitpunkt …": "At a point in time …", + "Zu viele Anfragen. Bitte in einer Minute erneut versuchen.": "Too many requests. Please try again in a minute.", + "Zu viele Anfragen. Bitte versuchen Sie es in einigen Minuten erneut.": "Too many requests. Please try again in a few minutes.", + "Zu viele Anfragen. Bitte versuchen Sie es später erneut.": "Too many requests. Please try again later.", + "Zu viele Anmeldeversuche für dieses Konto. Bitte warten Sie einige Minuten.": "Too many login attempts for this account. Please wait a few minutes.", + "Zu viele Anmeldeversuche. Bitte versuchen Sie es in einigen Minuten erneut.": "Too many login attempts. Please try again in a few minutes.", + "Zu viele Anmeldeversuche. Bitte versuchen Sie es später erneut.": "Too many login attempts. Please try again later.", + "Zu viele Chat-Anfragen. Bitte versuchen Sie es in ein paar Minuten erneut.": "Too many chat requests. Please try again in a few minutes.", + "Zu viele Nachrichten. Bitte kurz warten.": "Too many messages. Please wait a moment.", + "Zu viele Registrierungsversuche. Bitte warten Sie eine Stunde.": "Too many registration attempts. Please wait an hour.", + "Zu viele Versuche. Bitte versuchen Sie es in einigen Minuten erneut.": "Too many attempts. Please try again in a few minutes.", + "Zu viele Versuche. Bitte warten Sie einige Minuten.": "Too many attempts. Please wait a few minutes.", + "Zufriedenheitsabfrage": "Satisfaction survey", + "Zufriedenheitsabfrage jetzt manuell ausführen?": "Run the satisfaction survey manually now?", + "Zugang": "Access", + "Zugang zum Update-Server": "Access to the update server", + "Zugangstoken für den Update-Server entfernt": "Access token for the update server removed", + "Zugangstoken für den Update-Server gespeichert": "Access token for the update server saved", + "Zugangstoken gespeichert. Die Release-Liste wird jetzt damit geladen.": "Access token saved. The release list is now loaded with it.", + "Zugewiesen": "Assigned", + "Zugewiesen an": "Assigned to", + "Zugewiesen:": "Assigned:", + "Zugewiesene Tickets": "Assigned tickets", + "Zugriffstoken": "Access token", + "Zuletzt aktiv": "Last active", + "Zuletzt aktualisiert": "Last updated", + "Zuletzt genutzt": "Last used", + "Zum Beispiel eine Liste mit den Angaben, die Sie brauchen: Name, Startdatum, benötigte Geräte …": "For example a list with the details you need: name, start date, required devices …", + "Zum Ersetzen unten ein neues eintragen.": "To replace it, enter a new one below.", + "Zum Ticket": "To the ticket", + "Zum Update-Bereich →": "To the update area →", + "Zuordnung": "Assignment", + "Zur Anmeldung →": "To login →", + "Zur Bestätigung": "For confirmation", + "Zur Bestätigung bitte WIEDERHERSTELLEN eintippen. Es wurde nichts verändert.": "For confirmation, please type RESTORE. Nothing was changed.", + "Zur Wissensdatenbank": "To the knowledge base", + "Zurück zur Startseite": "Back to home", + "Zurücksetzen": "Reset", + "Zusammenführen": "Merge", + "Zusammengeführt mit Ticket #": "Merged with ticket #", + "Zusammengeführt mit Ticket #{#}": "Merged with ticket #{}", + "Zusatzfelder lassen sich nach dem Erstellen des Hilfethemas zuordnen.": "Additional fields can be assigned after the help topic has been created.", + "Zustand geändert.": "State changed.", + "Zustand jetzt:": "Current state:", + "Zusätzlich": "Additionally", + "Zusätzliche Angaben": "Additional information", + "Zusätzliche Antwort": "Additional reply", + "Zusätzliche Antworten": "Additional answers", + "Zuweisen": "Assign", + "Zuweisen an": "Assign to", + "Zuweisung": "Assignment", + "Zuweisung geändert (Mobile App)": "Assignment changed (mobile app)", + "Zuweisungen änderst du unter": "You change assignments under", + "absteigend": "descending", + "aktiv gerade eben": "active just now", + "aktive(s) Postfach/Postfächer eingerichtet": "active mailbox(es) set up", + "als Tickets angelegt.": "created as tickets.", + "an": "on", + "angegeben werden.": "must be specified.", + "auf": "to", + "auf Version": "to version", + "auf dem Server": "on the server", + "auf ein Prüfziel": "on a check target", + "aus (dann nutzt der Assistent nur die Antworten unten)": "off (the assistant then uses only the answers below)", + "ausfüllen: Serveradresse (oben), API-Schlüssel und Absender-E-Mail.": "fill in: server address (above), API key and sender email.", + "ausgeblendet, dann kommt es zurück.": "hidden, then it comes back.", + "ausgeschaltet": "switched off", + "ausstehende Datenbank-Änderung(en)": "pending database change(s)", + "ausstehende Änderung(en) – der Code ist neuer als die Datenbank.": "pending change(s) – the code is newer than the database.", + "bearbeitet – Sie sehen live mit, können hier aber nicht schreiben.": "is editing it – you see it live but cannot write here.", + "bearbeitet. Als Administrator kannst du es trotzdem lesen und bearbeiten.": "is editing it. As an administrator you can still read and edit it.", + "beginnt mit": "starts with", + "bereit, aber gerade nicht sichtbar": "ready, but not visible right now", + "bis": "until", + "bzw. das Supportcenter ist im Wartungsmodus": "or the support center is in maintenance mode", + "cURL-Fehler:": "cURL error:", + "cURL-Fehler: {}": "cURL error: {}", + "config/config.php ist für den Webserver beschreibbar": "config/config.php is writable by the web server", + "crontab beendete mit Fehlercode": "crontab exited with error code", + "crontab-Prozess konnte nicht gestartet werden.": "The crontab process could not be started.", + "deines Spigot-, Paper- oder BungeeCord-Servers legen.": "of your Spigot, Paper or BungeeCord server.", + "den Typ „Liste“ und verknüpfe diese Liste.": "the type “List” and link this list.", + "den Wert": "the value", + "die Werte übersetzen. Der Schlüssel ist der deutsche Text,": "translate the values. The key is the German text,", + "die unten festgelegten Felder. Die allgemeinen Ticket-Felder und die Felder der Hilfe-Themen werden dann nicht verwendet. Name und E-Mail-Adresse werden immer abgefragt, damit wir antworten können.": "the fields defined below. The general ticket fields and the help topic fields are then not used. Name and email address are always asked for so that we can reply.", + "display_errors ist aktiv. Fehlermeldungen können Pfade und Zugangsdaten verraten. In php.ini auf \"Off\" stellen.": "display_errors is active. Error messages can reveal paths and credentials. Set it to “Off” in php.ini.", + "ein Testticket anlegen. Bei einem Ausfall des Servers legt das Plugin selbst ein Ticket an.": "create a test ticket. If the server goes down, the plugin creates a ticket by itself.", + "ein Ticket eröffnen": "open a ticket", + "ein anderer Mitarbeiter": "another staff member", + "einem anderen Mitarbeiter": "another staff member", + "eingeschaltet": "switched on", + "endet mit": "ends with", + "enthalten. Zulässig sind CSS, PNG, JPG, GIF, WebP, WOFF und WOFF2; maximal 10 MB. Autor und Version können im CSS-Kopf mit": "contained. Allowed are CSS, PNG, JPG, GIF, WebP, WOFF and WOFF2; 10 MB at most. Author and version can be given in the CSS header with", + "enthält": "contains", + "enthält nicht": "does not contain", + "entsprechend weiter in die Zukunft rücken – eine 72-Std-Lösungsfrist kann bei 3 offenen Stunden/Tag mehrere Wochen dauern.": "move further into the future accordingly – a 72-hour resolution time can take several weeks with 3 open hours per day.", + "erfolgreich erstellt.": "created successfully.", + "erstellen Sie ein Ticket": "create a ticket", + "erwähnt": "mentioned", + "erwähnt.": "mentioned.", + "es gibt eine neue Antwort zu Ihrem Ticket": "there is a new reply to your ticket", + "externen Dienst(en) fehlt noch eine Prüf-URL.": "external service(s) still lack a check URL.", + "gekennzeichnet.": "marked.", + "gelöscht": "deleted", + "gelöscht.": "deleted.", + "genügt (in Gitea: Einstellungen → Anwendungen → Zugriffstoken erzeugen, Berechtigung „repository: Lesen“). Es wird verschlüsselt gespeichert.": "is enough (in Gitea: Settings → Applications → generate access token, permission “repository: Read”). It is stored encrypted.", + "geprüft.": "checked.", + "gesendet (über": "sent (via", + "gesendet, noch keine Antwort.": "sent, no reply yet.", + "geändert.": "changed.", + "hierher zusammengeführt": "merged here", + "hinzugefügt": "added", + "hinzugefügt,": "added,", + "ihn zugeordnet hat (Hilfethema vor Abteilung). Mit aktivierten": "assigned it (help topic before department). With enabled", + "im Reiter „Entferntes Postfach“ eingerichtet. Diese Seite zeigt nur noch ältere, nicht verknüpfte Postfächer.": "set up in the “Remote mailbox” tab. This page now only shows older, unlinked mailboxes.", + "in Ordnung": "OK", + "in der App wird im Hintergrund geprüft, ob einer der Jobs unten fällig ist, und automatisch ausgeführt. Solange regelmäßig jemand das Backend oder die App nutzt, laufen alle Jobs von selbst dauerhaft weiter – ganz ohne Einrichtung bei Strato oder einem externen Anbieter.": "in the app it is checked in the background whether one of the jobs below is due, and it is run automatically. As long as someone regularly uses the backend or the app, all jobs keep running by themselves – without any setup at Strato or an external provider.", + "in {#} Min": "in {} min", + "in {#} Std {#} Min": "in {1}h {2}m", + "ist NICHT wiederherstellbar:": "CANNOT be restored:", + "ist NICHT wiederherstellbar: {}": "CANNOT be restored: {}", + "ist abgeschlossen.": "is complete.", + "ist bei uns angekommen.": "has reached us.", + "ist ein schwerer Fehler aufgetreten. Die aufgerufene Seite konnte nicht angezeigt werden.": "a critical error occurred. The requested page could not be displayed.", + "ist erreichbar. Die Anmeldung wird beim Versenden der Test-Mail geprüft.": "is reachable. The login is checked when the test email is sent.", + "ist genau": "is exactly", + "ist nicht mehr als Spam markiert.": "is no longer marked as spam.", + "ist nicht wiederherstellbar:": "cannot be restored:", + "ist nicht wiederherstellbar: {}": "cannot be restored: {}", + "ist noch keine Version auf der Plugin-Website veröffentlicht.": "no version has been published on the plugin website yet.", + "ist. Gitea meldet dann beim Laden der Versionen „404“. Ein Token mit": "is. Gitea then reports “404” when loading the versions. A token with", + "keine Filter (alle Tickets)": "no filters (all tickets)", + "kunde@beispiel.de": "customer@example.com", + "lang gültig.": "valid for.", + "leer = von überall; sonst kommagetrennt": "empty = from anywhere; otherwise comma-separated", + "leer = wird automatisch erzeugt": "empty = generated automatically", + "löscht ihn.": "deletes it.", + "merkt sich die Texte aller besuchten Seiten (auch Kundenportal und Mitarbeiterbereich). Klicken Sie die Seiten durch, laden Sie danach die Vorlage. Bitte nach dem Sammeln wieder ausschalten, er verlangsamt die Seiten etwas.": "remembers the texts of all visited pages (including customer portal and staff area). Click through the pages, then load the template. Please switch it off again after collecting, it slows the pages down a little.", + "mind. 10 Zeichen, Groß-/Klein, Ziffer, Sonderzeichen": "min. 10 characters, upper/lower case, digit, special character", + "mit der Ticketnummer. Höchstens 60 Tickets pro Minute.": "with the ticket number. At most 60 tickets per minute.", + "muss angehakt werden.": "must be ticked.", + "nach Name/E-Mail": "after name/email", + "nach der Beschreibung": "after the description", + "nach der Themenauswahl": "after the topic selection", + "neues Ticket": "new ticket", + "nicht ausgeführt. Läuft der Cronjob (cron/fetch_emails.php)?": "not run. Is the cron job (cron/fetch_emails.php) running?", + "nicht geprüft": "not checked", + "nicht installierbar": "cannot be installed", + "nicht signiert": "not signed", + "nicht signiert,": "not signed,", + "nicht vom Herausgeber geprüft": "not verified by the publisher", + "nicht wiederherstellbar": "cannot be restored", + "noch keins": "none yet", + "noch nicht gelaufen": "has not run yet", + "noch nie": "never", + "oder": "or", + "oder Einstellung": "or setting", + "oder direkt": "or directly", + "oder neuer (installiert:": "or newer (installed:", + "oder neuer (installiert: {}": "or newer (installed: {}", + "ohne Antwort": "without reply", + "per Empfängeradresse ist dann optional und greift nur noch zusätzlich, falls ein einzelnes Postfach doch Mails für mehrere Abteilungen empfängt.": "by recipient address is then optional and only applies additionally if a single mailbox receives mail for several departments after all.", + "plugin.json fehlt oder ist ungültig – das Plugin kann nicht geladen werden.": "plugin.json is missing or invalid – the plugin cannot be loaded.", + "plugin.json ist kein gültiges JSON.": "plugin.json is not valid JSON.", + "plugin.json nicht im Paket gefunden.": "plugin.json not found in the package.", + "plugin.json: \"slug\" fehlt oder ist ungültig (a–z, 0–9, _ und -; 2–41 Zeichen).": "plugin.json: “slug” is missing or invalid (a–z, 0–9, _ and -; 2–41 characters).", + "plugin.json: ungültige Startdatei.": "plugin.json: invalid entry file.", + "plugin.json: ungültige Versionsnummer.": "plugin.json: invalid version number.", + "privat": "private", + "prüfen.": "check.", + "setzen und auf „Ansicht speichern\" klicken.": "and click “Save view”.", + "sieht so aus:": "looks like this:", + "sieht so aus: {}": "looks like this: {}", + "sofort erstellt.": "created immediately.", + "spam@beispiel.de oder spam-domain.de": "spam@example.com or spam-domain.com", + "steht der Text neben dem Kästchen, bei anderen Feldern unter dem Feld. Das Wort aus „Verlinkter Teil“ wird im Text zum Link auf die Adresse. Eine Checkbox als": "the text is next to the checkbox, for other fields below the field. The word from “Linked part” becomes a link to the address in the text. A checkbox as", + "steht für wechselnde Teile („Willkommen, {}“ → „Welcome, {}“).": "stands for changing parts (“Willkommen, {}” → “Welcome, {}”).", + "um alle Ihre Tickets im Überblick zu behalten.": "to keep all your tickets at a glance.", + "umstellen und MySQL-Zugangsdaten eintragen.": "switch over and enter the MySQL credentials.", + "unbekannter Fehler": "unknown error", + "unbekannter IMAP-Fehler": "unknown IMAP error", + "und": "and", + "und den Ticketdaten (Nummer, Betreff, Status, Priorität, Abteilung, Anfragender).": "and the ticket data (number, subject, status, priority, department, requester).", + "und ist genug Speicherplatz frei (aktuell": "and enough disk space is free (currently", + "und laufen mit allen Rechten des Systems, auch mit Zugriff auf die gesamte Datenbank. Installiert nur Code, den ihr selbst geschrieben oder geprüft habt.": "and run with all permissions of the system, including access to the entire database. Only install code that you wrote or reviewed yourself.", + "und sind von außen nicht zugänglich": "and are not accessible from outside", + "verschoben. Dieses Ticket ist jetzt schreibgeschützt.": "moved. This ticket is now read-only.", + "vielen Dank für Ihre Anfrage. Wir haben Ihr Ticket erhalten und kümmern uns so schnell wie möglich darum.": "thank you for your request. We have received your ticket and will take care of it as quickly as possible.", + "vielen Dank für Ihren Chat mit uns. Hier der vollständige Verlauf zu Ihrer Unterlage:": "thank you for chatting with us. Here is the complete history for your records:", + "vielen Dank für Ihren Chat mit uns. Hier der vollständige Verlauf zu Ihrer Unterlage: {}": "thank you for chatting with us. Here is the complete history for your records: {}", + "von": "from", + "von 5": "out of 5", + "von 5 Sternen": "out of 5 stars", + "von:": "from:", + "von: {}": "from: {}", + "vor Name/E-Mail": "before name/email", + "vor dem Betreff": "before the subject", + "vor der Themenauswahl": "before the topic selection", + "vor {#} Min (überfällig)": "{} min ago (overdue)", + "vor {#} Min.": "{} min. ago", + "vor {#} Std {#} Min (überfällig)": "{1}h {2}m ago (overdue)", + "wartet auf ersten Lauf": "waiting for first run", + "werden automatisch geprüft": "are checked automatically", + "werden niemals überschrieben": "are never overwritten", + "wiederkehrende Tickets": "recurring tickets", + "wurde erfolgreich mit #": "was successfully merged with #", + "wurde erfolgreich mit #{#}": "was successfully merged with #{}", + "wurde erstellt. Wir melden uns so schnell wie möglich.": "was created. We will get back to you as quickly as possible.", + "wurde gelöscht.": "was deleted.", + "wurde hierher zusammengeführt": "was merged here", + "wurde nicht gefunden.": "was not found.", + "z. B. E-Mail-Versand verzögert": "e.g. email delivery delayed", + "z. B. Gerätenummer": "e.g. device number", + "z. B. Ich habe die Nutzerbedingungen gelesen und akzeptiert.": "e.g. I have read and accept the terms of use.", + "z. B. Meine überfälligen": "e.g. My overdue", + "z. B. Mit freundlichen Grüßen Ihr Support-Team": "e.g. Kind regards, your support team", + "z. B. Mit freundlichen Grüßen Max Mustermann": "e.g. Kind regards, Max Mustermann", + "z. B. Monatsbericht Support": "e.g. Monthly support report", + "z. B. Neuer Mitarbeiter": "e.g. New employee", + "z. B. Nur-Antwort": "e.g. reply only", + "z. B. Nutzerbedingungen": "e.g. Terms of use", + "z. B. Passwort zurücksetzen, Rechnung, Versand …": "e.g. reset password, invoice, shipping …", + "z. B. Störungsmeldung Technik": "e.g. technical incident report", + "z. B. Vertragsnummer": "e.g. Contract number", + "z. B. Website-Kontaktformular": "e.g. Website contact form", + "z. B. Wie lange dauert der Versand?": "e.g. How long does delivery take?", + "z. B. Wie setze ich mein Passwort zurück?": "e.g. How do I reset my password?", + "z.B. Begrüßung": "e.g. Greeting", + "z.B. Hohe Priorität nach 8h unbeantwortet": "e.g. High priority after 8h unanswered", + "z.B. Import aus alter Sperrliste": "e.g. Import from old block list", + "z.B. Junk, Spam oder INBOX.Junk": "e.g. Junk, Spam or INBOX.Junk", + "z.B. Tag der Deutschen Einheit": "e.g. German Unity Day", + "z.B. Technik-Postfach": "e.g. Technical mailbox", + "z.B. wiederholter Spam": "e.g. repeated spam", + "zugewiesen werden.": "be assigned.", + "zurückgeholt": "retrieved", + "zusammengeführt.": "merged.", + "zwischen Betreff und Beschreibung": "between subject and description", + "zählen nur die dort eingetragenen Öffnungszeiten.": "only the opening hours entered there count.", + "zählen nur Öffnungszeiten.": "only opening hours count.", + "{#} Artikel": "{} article(s)", + "{#} Aufrufe": "{} views", + "{#} Ergebnis(se) für „{}“": "{} result(s) for “{}”", + "{#} Tag(e)": "{} day(s)", + "{#} Treffer": "{} hits", + "{} · erstellt am {}": "{1} · created {2}", + "· Abteilung:": "· Department:", + "· Abteilung: {}": "· Department: {}", + "· Handeln": "· Act", + "· Hinweis": "· Notice", + "· In Ordnung": "· OK", + "· Letzte automatische Prüfung:": "· Last automatic check:", + "· Letzte automatische Prüfung: Noch nie": "· Last automatic check: never", + "· Letzte automatische Prüfung: {}": "· Last automatic check: {}", + "· Letzter Abruf: Noch nie": "· Last fetch: never", + "· Priorität:": "· Priority:", + "· Priorität: {}": "· Priority: {}", + "· Prüfen": "· Check", + "· erstellt am": "· created on", + "· für Kunden": "· for customers", + "· nicht auf diesem Server": "· not on this server", + "· nur Mitarbeiter": "· staff only", + "· älter als": "· older than", + "· über den DeskHub-Push-Dienst, es ist nichts einzurichten": "· via the DeskHub push service, nothing to set up", + "Ähnliche gelöste Tickets": "Similar resolved tickets", + "Ältere Backups werden automatisch gelöscht wenn das Limit erreicht wird.": "Older backups are deleted automatically when the limit is reached.", + "Änderungen gespeichert.": "Changes saved.", + "Änderungen gespeichert. Sie gelten für neue Tickets und bei Prioritätsänderung.": "Changes saved. They apply to new tickets and on priority changes.", + "Änderungen speichern": "Save changes", + "Öffentlich": "Public", + "Öffentliche Antwort gesendet": "Public reply sent", + "Öffentliche Antwort gesendet (Mobile App)": "Public reply sent (mobile app)", + "Öffentliche Antwort senden": "Send public reply", + "Öffentliche Themen sehen auch Kunden im Portal; interne nur Mitarbeiter.": "Public topics are also visible to customers in the portal; internal ones only to staff.", + "Öffentliche Webhook-Adresse (zum Beispiel für Discord oder Telegram); das Plugin prüft die Echtheit der Anfragen selbst": "Public webhook address (for example for Discord or Telegram); the plugin verifies the authenticity of requests itself", + "Öffentlicher Herausgeber-Schlüssel (PEM)": "Public publisher key (PEM)", + "Öffnen Sie zuerst den persönlichen Ticket-Link aus der E-Mail in diesem Browser und versuchen Sie es danach erneut.": "Please first open the personal ticket link from the email in this browser and then try again.", + "Öffnen Sie zuerst den persönlichen Ticket-Link aus der Ticket-E-Mail in diesem Browser. Anschließend können Sie das Ticket hier Ihrem Konto hinzufügen, wenn die Ticket-E-Mail-Adresse mit Ihrer Konto-E-Mail-Adresse übereinstimmt.": "First open the personal ticket link from the ticket email in this browser. You can then add the ticket to your account here if the ticket email address matches your account email address.", + "Öffnungszeiten je Wochentag": "Opening hours per weekday", + "Ø Erste Antwort": "Ø First response", + "Ø Erstreaktion": "Ø First response", + "Ø Lösungszeit": "Ø Resolution time", + "ÜBERFÄLLIG": "OVERDUE", + "Über den Assistenten wurden bereits mehrere Tickets erstellt. Bitte versuchen Sie es später noch einmal oder antworten Sie auf die E-Mail zu Ihrem Ticket.": "Several tickets have already been created via the assistant. Please try again later or reply to the email about your ticket.", + "Überfällig": "Overdue", + "Übergeordnetes Thema": "Parent topic", + "Überschrift": "Heading", + "Überschrift (optional)": "Heading (optional)", + "Überschrift Abschnitt 1 (Themenauswahl)": "Heading section 1 (topic selection)", + "Überschrift Abschnitt „Betreff und Beschreibung“": "Heading section “Subject and description”", + "Überschrift Abschnitt „Kontaktdaten“": "Heading section “Contact details”", + "Übersetzungen": "Translations", + "Übersicht": "Overview", + "übersprungen": "skipped", + "übersprungen (Mobile App)": "skipped (mobile app)", + "übersprungen (keine Berechtigung zum Verschieben).": "skipped (no permission to move).", + "übersprungen (ungültig oder bereits vorhanden).": "skipped (invalid or already existing).", + "übersprungen.": "skipped.", + "– (kein Konto)": "– (no account)", + "– Abteilung wählen –": "– choose department –", + "– Alle Rechte vorbehalten.": "– All rights reserved.", + "– Das Serverzertifikat konnte nicht geprüft werden. Bitte das CA-Zertifikatspaket des Servers aktualisieren (php.ini: curl.cainfo). Die Prüfung wird aus Sicherheitsgründen nicht abgeschaltet.": "– The server certificate could not be verified. Please update the server’s CA certificate bundle (php.ini: curl.cainfo). For security reasons the check is not switched off.", + "– Hilfe-Thema wählen –": "– choose help topic –", + "– Interne Notizen, sichtbar für alle Administratoren": "– Internal notes, visible to all administrators", + "– Mitarbeiter wählen –": "– choose staff member –", + "– Priorität wählen –": "– choose priority –", + "– Sei offen, sie sind vertraulich": "– Be open, they are confidential", + "– Standard-Mitarbeiterrechte –": "– default staff permissions –", + "– Textbaustein wählen –": "– choose text snippet –", + "– Ticket #": "– Ticket #", + "– Ticket #{#}": "– Ticket #{}", + "– Version wählen –": "– Select version –", + "– Vorlage wählen –": "– choose template –", + "– auswählen –": "– select –", + "– bitte wählen –": "– please choose –", + "– das Repository ist vermutlich privat. Unten unter „Zugang zum Update-Server“ ein Lese-Token eintragen.": "– the repository is probably private. Enter a read token below under “Access to the update server”.", + "– das eingetragene Token wird nicht akzeptiert (falsch, abgelaufen oder ohne Leserecht).": "– the entered token is not accepted (wrong, expired or without read permission).", + "– kein Team –": "– no team –", + "– kein Thema –": "– no topic –", + "– kein bestimmter Dienst –": "– no specific service –", + "– keine Vertretung –": "– no substitute –", + "– keine Änderung –": "– no change –", + "– keine –": "– none –", + "– nicht vorgeben –": "– do not preset –", + "– nicht zugewiesen –": "– unassigned –", + "– nicht ändern –": "– do not change –", + "— Abteilung auswählen —": "— select department —", + "— Abteilung/Priorität bestimmt die Zeiten —": "— Department/priority determines the times —", + "— Automatisch (Standardadresse der Abteilung) —": "— Automatic (department default address) —", + "— Keine(r) —": "— None —", + "— Niemand —": "— Nobody —", + "— Standard —": "— Default —", + "— Standardabteilung (bzw. Abteilung des gewählten Themas) —": "— Default department (or department of the chosen topic) —", + "— Systemstandard —": "— System default —", + "— Zeiten der Priorität verwenden —": "— Use the priority's times —", + "•••••••• (gespeichert)": "•••••••• (saved)", + "ℹ️ Ausführung hochgeladener Dateien": "ℹ️ Execution of uploaded files", + "ℹ️ Erreichbarkeit interner Dateien": "ℹ️ Accessibility of internal files", + "ℹ️ Hinweise": "ℹ️ Notes", + "← Einstellungen": "← Settings", + "← Zum Kundenportal": "← To the customer portal", + "← Zur Anmeldung": "← Back to sign in", + "← Zur Ticket-Liste": "← To the ticket list", + "← Zurück": "← Back", + "← Zurück zum Login": "← Back to login", + "← Zurück zur Wissensdatenbank": "← Back to the knowledge base", + "↑ Priorität:": "↑ Priority:", + "↑ Priorität: {}": "↑ Priority: {}", + "→ bleiben erhalten": "→ are kept", + "↓ CSV exportieren": "↓ Export CSV", + "⏰ Automatischer Zeitplan": "⏰ Automatic schedule", + "⏱ Zeiterfassung": "⏱ Time tracking", + "⏱ Zeiterfassung läuft": "⏱ Time tracking running", + "○ Nicht installiert": "○ Not installed", + "○ Noch kein Postfach eingerichtet": "○ No mailbox set up yet", + "○ deaktiviert": "○ disabled", + "⚙ Einstellungen": "⚙ Settings", + "⚠️ Administratoren ohne Zwei-Faktor-Anmeldung": "⚠️ Administrators without two-factor authentication", + "⚠️ Datenbank: SQLite": "⚠️ Database: SQLite", + "⚠️ Noch kein geprüftes Backup": "⚠️ No verified backup yet", + "⛔ Absender sperren": "⛔ Block sender", + "⛔ Gesperrt": "⛔ Blocked", + "✂️ Ticket aufteilen": "✂️ Split ticket", + "✅ Backup erstellt und geprüft:": "✅ Backup created and checked:", + "✅ Backup erstellt und geprüft: {}": "✅ Backup created and checked: {}", + "✅ Dieser Server unterstützt eine automatische Installation (Shell-Zugriff erkannt). DeskHub trägt dafür einen klar markierten Block in die Crontab des Server-Benutzers ein – alle sonstigen vorhandenen Einträge bleiben unangetastet.": "✅ This server supports automatic installation (shell access detected). DeskHub adds a clearly marked block to the server user’s crontab – all other existing entries stay untouched.", + "✅ Neue Antwort auf mir zugewiesenes Ticket": "✅ New reply on a ticket assigned to me", + "✅ Neues Ticket in meiner Abteilung": "✅ New ticket in my department", + "✅ Update auf": "✅ Update to", + "✅ Verschlüsselungsschlüssel gesetzt": "✅ Encryption key set", + "✍ Signatur": "✍ Signature", + "✓ Berichte einsehen": "✓ View reports", + "✓ Die Datenbank ist aktuell": "✓ The database is up to date", + "✓ Interne Notizen schreiben": "✓ Write internal notes", + "✓ Push ist aktiv": "✓ Push is active", + "✓ Tickets beantworten": "✓ Reply to tickets", + "✓ Tickets im Namen von Kunden erstellen": "✓ Create tickets on behalf of customers", + "✓ Tickets schließen/lösen": "✓ Close/resolve tickets", + "✓ Tickets zuweisen (Mitarbeiter/Team)": "✓ Assign tickets (staff/team)", + "✓ Tickets übertragen (Abteilung ändern)": "✓ Transfer tickets (change department)", + "✓ Token aus config/config.php wird verwendet.": "✓ Token from config/config.php is used.", + "✓ Token gespeichert.": "✓ Token saved.", + "✓ gelöst": "✓ resolved", + "✔ Jedes Backup wird nach dem Erstellen automatisch auf Wiederherstellbarkeit geprüft; ältere werden regelmäßig erneut geprüft.": "✔ Every backup is checked for restorability automatically after creation; older ones are checked again regularly.", + "✔ Prüfen": "✔ Check", + "✔ geprüft": "✔ checked", + "✕ Abteilungen verwalten": "✕ Manage departments", + "✕ Admin-Protokoll einsehen": "✕ View admin log", + "✕ Digitalen Assistenten verwalten": "✕ Manage digital assistant", + "✕ E-Mail-Adressen verwalten": "✕ Manage email addresses", + "✕ E-Mail-Vorlagen verwalten": "✕ Manage email templates", + "✕ Eskalationsregeln verwalten": "✕ Manage escalation rules", + "✕ Filter zurücksetzen": "✕ Reset filters", + "✕ Geschäftszeiten verwalten": "✕ Manage business hours", + "✕ Hilfe-Themen verwalten": "✕ Manage help topics", + "✕ Mitarbeiter verwalten": "✕ Manage staff", + "✕ Organisationen verwalten": "✕ Manage organizations", + "✕ Prioritäten / SLA verwalten": "✕ Manage priorities / SLA", + "✕ Rollen verwalten": "✕ Manage roles", + "✕ Teams verwalten": "✕ Manage teams", + "✕ Textbausteine verwalten": "✕ Manage text snippets", + "✕ Tickets löschen": "✕ Delete tickets", + "✕ Wissensdatenbank verwalten": "✕ Manage knowledge base", + "✕ Zeiterfassung einsehen": "✕ View time tracking", + "❌ Auf diesem Server nicht möglich:": "❌ Not possible on this server:", + "❌ Auf diesem Server nicht möglich: {}": "❌ Not possible on this server: {}", + "❌ Installationsassistent ist nicht gesperrt": "❌ The installation wizard is not locked", + "❌ Website-URL nutzt kein HTTPS": "❌ Website URL does not use HTTPS", + "⬆️ Hochladen & installieren": "⬆️ Upload & install", + "🆕 Neues Ticket #": "🆕 New ticket #", + "🆕 Neues Ticket #{#}": "🆕 New ticket #{}", + "🌐 Web (im Namen)": "🌐 Web (on behalf)", + "👁 Ticket beobachten": "👁 Watch ticket", + "👋 Hallo! Wie können wir Ihnen helfen?": "👋 Hello! How can we help you?", + "👤 Konto": "👤 Account", + "💤 Wiedervorlage": "💤 Snooze", + "💬 Live-Chat": "💬 Live chat", + "💬 Neue Kundenantwort zu Ticket #": "💬 New customer reply to ticket #", + "💬 Neue Kundenantwort zu Ticket #{#}": "💬 New customer reply to ticket #{}", + "💾 Backup jetzt erstellen": "💾 Create backup now", + "📄 Impressum": "📄 Legal notice", + "📋 Alle Releases": "📋 All releases", + "📎 Anhänge:": "📎 Attachments:", + "📎 Anhänge: {}": "📎 Attachments: {}", + "📎 Datei": "📎 File", + "📞 Telefon": "📞 Phone", + "📡 FTP-Upload": "📡 FTP upload", + "📥 Zusammengeführte Tickets": "📥 Merged tickets", + "📥 osTicket Import": "📥 osTicket import", + "📧 Mitarbeiter": "📧 Staff", + "📱 Android-App: Push-Benachrichtigungen": "📱 Android app: push notifications", + "📱 Android-App: Welche Popups?": "📱 Android app: which popups?", + "🔄 Automatischer Hintergrund-Betrieb (ohne Server-Cronjob)": "🔄 Automatic background operation (without server cron job)", + "🔄 Erneut prüfen": "🔄 Check again", + "🔄 System-Update": "🔄 System update", + "🔒 Datenschutz": "🔒 Privacy", + "🔒 Datenschutzerklärung": "🔒 Privacy policy", + "🔒 Sicherheit": "🔒 Security", + "🔓 freigeben": "🔓 release", + "🔔 Meine Erwähnungen": "🔔 My mentions", + "🔔 Neue Erwähnungen": "🔔 New mentions", + "🔔 Testnachricht von DeskHub": "🔔 Test message from DeskHub", + "🔴 Überfällig": "🔴 Overdue", + "🖥 Vor Ort / Intern": "🖥 On site / internal", + "🖨 Drucken": "🖨 Print", + "🖨 Drucken / Als PDF speichern": "🖨 Print / Save as PDF", + "🖨️ Ticket drucken": "🖨️ Print ticket", + "🗄 Datenbank aktualisieren": "🗄 Update database", + "🗑 Ticket löschen": "🗑 Delete ticket", + "🚫 Sperren": "🚫 Block", + "🟡 Bald fällig (< 4 Std.)": "🟡 Due soon (< 4 hrs)", + "🟢 Im Zeitplan": "🟢 On schedule" } \ No newline at end of file diff --git a/Plugins/plugins/nas-backup/lib.php b/Plugins/plugins/nas-backup/lib.php index ddd008b6..b5a6aeee 100644 --- a/Plugins/plugins/nas-backup/lib.php +++ b/Plugins/plugins/nas-backup/lib.php @@ -7,6 +7,8 @@ */ const NASBK = 'nas-backup'; +/** Kleinste Teilgröße in Bytes (Tests überschreiben sie vorher mit define()). */ +if (!defined('NASBK_MIN_PART')) define('NASBK_MIN_PART', 10 * 1048576); /** Zeitpläne: Schlüssel => [Bezeichnung, Mindestabstand in Sekunden]. */ function nasbk_intervals(): array @@ -82,6 +84,10 @@ function nasbk_config(): array 'excludes' => array_values(array_filter(array_map('trim', preg_split('/\r?\n/', (string) plugin_setting(NASBK, 'excludes', '')) ?: []))), 'mode' => $files ? 'full' : 'database', 'verify_tls' => plugin_setting(NASBK, 'verify_tls', '1') !== '0', + // Große Backups in Teilen hochladen: automatisch (erst ganz, bei Fehler 413/Zeitüberschreitung in Teilen), immer oder nie + 'split' => in_array($splitMode = (string) plugin_setting(NASBK, 'split', 'auto'), ['auto', 'always', 'never'], true) ? $splitMode : 'auto', + 'part_mb' => max(10, min(4000, (int) plugin_setting(NASBK, 'part_mb', '200'))), + 'part_bytes' => max(10, min(4000, (int) plugin_setting(NASBK, 'part_mb', '200'))) * 1048576, ]; } /** Prüft die Adresse: https ist Pflicht, http nur für Geräte im eigenen Netz (private oder lokale Adresse). Gibt eine Fehlermeldung oder null zurück. */ @@ -151,12 +157,29 @@ function nasbk_request(array $cfg, string $method, string $url, array $opt = []) $set[CURLOPT_FILE] = $out; } if (isset($opt['file'])) { + clearstatcache(true, $opt['file']); // dieselbe Zwischendatei wird für mehrere Teile neu beschrieben: sonst gilt die alte Größe $fh = fopen($opt['file'], 'rb'); if ($fh === false) return ['code' => 0, 'body' => '', 'error' => 'Die Backup-Datei konnte nicht gelesen werden.']; $set[CURLOPT_UPLOAD] = true; $set[CURLOPT_INFILE] = $fh; $set[CURLOPT_INFILESIZE] = filesize($opt['file']); $headers[] = 'Expect:'; + } elseif (isset($opt['stream'])) { + // Ein Abschnitt einer großen Datei direkt hochladen, ohne ihn vorher in eine Zwischendatei zu kopieren (spart bei großen Backups viel Plattenzugriff) + $st = $opt['stream']; // ['handle' => Quelle, 'offset' => Beginn, 'length' => Länge, 'hash' => HashContext|null] + $remaining = (int) $st['length']; + fseek($st['handle'], (int) $st['offset']); + $set[CURLOPT_UPLOAD] = true; + $set[CURLOPT_INFILESIZE] = $remaining; + $set[CURLOPT_READFUNCTION] = function ($curl, $fd, $length) use ($st, &$remaining) { + if ($remaining <= 0) return ''; + $data = fread($st['handle'], min($length, $remaining, 1048576)); + if ($data === false || $data === '') return ''; + $remaining -= strlen($data); + if (!empty($st['hash'])) hash_update($st['hash'], $data); + return $data; + }; + $headers[] = 'Expect:'; } elseif (isset($opt['body'])) { $set[CURLOPT_POSTFIELDS] = $opt['body']; } @@ -187,6 +210,8 @@ function nasbk_explain(array $r, string $what): string $c === 404 => "{$what}: Pfad nicht gefunden (HTTP 404). Bei Synology lautet die Adresse https://:5006/.", $c === 405 => "{$what}: Der Server erlaubt diese Aktion nicht (HTTP 405).", $c === 507 => "{$what}: Auf der NAS ist kein Speicherplatz mehr frei (HTTP 507).", + $c === 413 => "{$what}: Die Datei ist größer, als der Server oder ein Proxy davor annimmt (HTTP 413). Häufige Ursachen: ein Reverse-Proxy (bei nginx „client_max_body_size“ erhöhen, bei der Synology unter Anmeldeportal → Erweitert → Reverse-Proxy den Header-/Größen-Grenzwert prüfen) oder Cloudflare (im Gratis-Tarif höchstens 100 MB je Upload; die NAS-Adresse dann ohne Cloudflare-Proxy, also „nur DNS“, erreichbar machen). Alternativ das Backup verkleinern: in den Einstellungen nur die Datenbank oder die „Wichtigsten Dateien“ sichern.", + in_array($c, [408, 502, 504, 524], true) => "{$what}: Zeitüberschreitung beim Server oder Proxy vor der NAS (HTTP {$c}). Bei großen Dateien muss dort das Zeitlimit höher sein (bei Cloudflare gilt für Uploads zusätzlich eine Grenze von 100 MB im Gratis-Tarif).", default => "{$what}: unerwartete Antwort des Servers (HTTP {$c}).", }; } @@ -212,34 +237,51 @@ function nasbk_ensure_folder(array $cfg): ?string } return $exists() ? null : 'Ordner anlegen: Der Zielordner „' . $cfg['folder'] . '“ existiert nicht und konnte nicht angelegt werden. Lege ihn auf der NAS an oder prüfe den Pfad (er beginnt mit dem Namen des freigegebenen Ordners).'; } -/** Liest die Dateien im Ordner. @return array{ok:bool,items:array,error:string} */ +/** + * Liest die Dateien im Ordner. Große Backups liegen in Teilen auf der NAS (name.zip.part001, .part002 … und zuletzt eine kleine Datei + * name.zip.parts, die den Satz als vollständig kennzeichnet). Diese Sätze erscheinen hier als EIN Backup mit der Gesamtgröße und `parts` = Anzahl. + * Teile ohne Abschlussdatei (ein Upload, der abgebrochen wurde) stehen unter `orphans`. + * + * @return array{ok:bool,items:array,orphans:array,error:string} + */ function nasbk_list(array $cfg, int $timeout = 30): array { $body = ''; $r = nasbk_request($cfg, 'PROPFIND', nasbk_remote_url($cfg) . '/', ['body' => $body, 'headers' => ['Depth: 1', 'Content-Type: application/xml'], 'timeout' => $timeout]); - if ($r['code'] === 404) return ['ok' => true, 'items' => [], 'error' => '']; - if ($r['code'] !== 207) return ['ok' => false, 'items' => [], 'error' => nasbk_explain($r, 'Liste der Sicherungen')]; + if ($r['code'] === 404) return ['ok' => true, 'items' => [], 'orphans' => [], 'error' => '']; + if ($r['code'] !== 207) return ['ok' => false, 'items' => [], 'orphans' => [], 'error' => nasbk_explain($r, 'Liste der Sicherungen')]; $prev = libxml_use_internal_errors(true); $xml = simplexml_load_string($r['body'], 'SimpleXMLElement', LIBXML_NONET); libxml_use_internal_errors($prev); - if ($xml === false) return ['ok' => false, 'items' => [], 'error' => 'Die Antwort der NAS ließ sich nicht lesen.']; + if ($xml === false) return ['ok' => false, 'items' => [], 'orphans' => [], 'error' => 'Die Antwort der NAS ließ sich nicht lesen.']; $xml->registerXPathNamespace('d', 'DAV:'); - $items = []; + $base = '(backup_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(?:_[a-z0-9]{3})?\.zip)'; + $singles = $parts = $markers = []; foreach ($xml->xpath('//d:response') ?: [] as $resp) { $resp->registerXPathNamespace('d', 'DAV:'); $href = (string) ($resp->xpath('d:href')[0] ?? ''); $name = basename(rawurldecode(rtrim($href, '/'))); - if ($name === '' || !preg_match(nasbk_name_pattern(), $name)) continue; - $items[] = [ - 'name' => $name, - 'size' => (int) ($resp->xpath('.//d:getcontentlength')[0] ?? 0), - 'modified' => (string) ($resp->xpath('.//d:getlastmodified')[0] ?? ''), - ]; + $size = (int) ($resp->xpath('.//d:getcontentlength')[0] ?? 0); + $mod = (string) ($resp->xpath('.//d:getlastmodified')[0] ?? ''); + if (preg_match("/^{$base}$/", $name)) $singles[$name] = ['name' => $name, 'size' => $size, 'modified' => $mod, 'parts' => 0]; + elseif (preg_match("/^{$base}\.part(\d{3})$/", $name, $m)) $parts[$m[1]][(int) $m[2]] = ['size' => $size, 'modified' => $mod, 'file' => $name]; + elseif (preg_match("/^{$base}\.parts$/", $name, $m)) $markers[$m[1]] = $mod; + } + $items = array_values($singles); + $orphans = []; + foreach ($parts as $logical => $set) { + ksort($set); + $complete = isset($markers[$logical]) && !isset($singles[$logical]) && array_keys($set) === range(1, count($set)); + if ($complete) { + $items[] = ['name' => $logical, 'size' => array_sum(array_column($set, 'size')), 'modified' => $markers[$logical], 'parts' => count($set)]; + } else { + foreach ($set as $p) $orphans[] = ['name' => $p['file'], 'modified' => $p['modified']]; + if (isset($markers[$logical])) $orphans[] = ['name' => $logical . '.parts', 'modified' => $markers[$logical]]; + } } usort($items, fn($a, $b) => strcmp($b['name'], $a['name'])); // Namen enthalten das Datum: neueste zuerst - return ['ok' => true, 'items' => $items, 'error' => '']; + return ['ok' => true, 'items' => $items, 'orphans' => $orphans, 'error' => '']; } - /** Nur Dateien, die dieses Plugin selbst anlegt, werden aufgelistet und bei der Aufbewahrung gelöscht. */ function nasbk_name_pattern(): string { @@ -256,44 +298,276 @@ function nasbk_remote_size(array $cfg, string $url): ?int return null; } -/** Lädt die Datei hoch und prüft die Größe. Gibt eine Fehlermeldung oder null zurück. */ +/** Name einer Teil-Datei auf der NAS: backup_….zip.part001 */ +function nasbk_part_name(string $name, int $n): string +{ + return sprintf('%s.part%03d', $name, $n); +} + +/** + * Lädt die Datei hoch und prüft die Größe. Gibt eine Fehlermeldung oder null zurück. + * + * Große Dateien scheitern oft an einer Größengrenze davor (Reverse-Proxy, Cloudflare: 100 MB). Deshalb gibt es zwei Wege: + * - ganz (eine Datei, bequem zum Herunterladen von Hand) und + * - in Teilen (je höchstens „Teilgröße“, danach eine kleine Abschlussdatei: erst damit gilt das Backup als vollständig). + * Einstellung „automatisch“: erst ganz; schlägt das mit 413/Zeitüberschreitung/Verbindungsabbruch fehl, geht es in Teilen weiter und + * die Größe wird gemerkt (ab dieser Größe gleich in Teilen, ohne die Datei noch einmal vergeblich zu senden). + */ function nasbk_upload(array $cfg, string $localPath, string $name): ?string +{ + $size = (int) filesize($localPath); + $partBytes = (int) ($cfg['part_bytes'] ?? 200 * 1048576); + $partLimit = (int) plugin_setting(NASBK, 'part_limit', '0'); // gemerkt: größere Teile lehnte der Server ab + if ($partLimit > 0) $partBytes = min($partBytes, $partLimit); + $mode = (string) ($cfg['split'] ?? 'auto'); + $learned = (int) plugin_setting(NASBK, 'single_limit', '0'); // gemerkt: ab dieser Größe scheiterte der Upload in einem Stück + $canSplit = $mode !== 'never' && ($size > $partBytes || ($mode === 'auto' && $learned > 0 && $size >= $learned)); + if ($canSplit && ($mode === 'always' || ($learned > 0 && $size >= $learned))) return nasbk_upload_big($cfg, $localPath, $name, min($partBytes, max(NASBK_MIN_PART, intdiv($size, 2)))); + $res = nasbk_upload_single($cfg, $localPath, $name); + if ($res['error'] === null) return null; + // Scheitert die ganze Datei an einer Größengrenze, geht es in Teilen weiter (auch wenn die Datei kleiner als die eingestellte Teilgröße ist) + if ($mode !== 'never' && $size > NASBK_MIN_PART && in_array($res['code'], [0, 408, 413, 502, 504, 524], true)) { + plugin_set_setting(NASBK, 'single_limit', (string) ($learned > 0 ? min($learned, $size) : $size)); + return nasbk_upload_big($cfg, $localPath, $name, min($partBytes, max(NASBK_MIN_PART, intdiv($size, 2)))); + } + return $res['error']; +} + +/** Eine Datei in einem Stück hochladen. @return array{error:?string,code:int} */ +function nasbk_upload_single(array $cfg, string $localPath, string $name): array { $url = nasbk_remote_url($cfg, $name); $size = (int) filesize($localPath); $timeout = max(300, (int) ceil($size / 1048576) * 20); // mindestens 5 Minuten, sonst rund 20 s je MB $r = nasbk_request($cfg, 'PUT', $url, ['file' => $localPath, 'timeout' => $timeout]); - if (!in_array($r['code'], [200, 201, 204], true)) return nasbk_explain($r, 'Hochladen'); + if (!in_array($r['code'], [200, 201, 204], true)) return ['error' => nasbk_explain($r, 'Hochladen (' . round($size / 1048576, 1) . ' MB)'), 'code' => $r['code']]; $remote = nasbk_remote_size($cfg, $url); if ($remote !== null && $remote !== $size) { nasbk_request($cfg, 'DELETE', $url, ['timeout' => 30]); - return "Hochladen: Die Datei auf der NAS ist unvollständig ({$remote} statt {$size} Bytes) und wurde wieder gelöscht."; + return ['error' => "Hochladen: Die Datei auf der NAS ist unvollständig ({$remote} statt {$size} Bytes) und wurde wieder gelöscht.", 'code' => 200]; } - return null; + return ['error' => null, 'code' => $r['code']]; } -/** Löscht Sicherungen nach den beiden Regeln „älter als X Tage“ und „mehr als Y Stück“ (0 = Regel aus). @return array{deleted:string[],error:string} */ +/** + * Große Datei in Stücken als EINE Datei hochladen (HTTP „Content-Range“: jedes Stück sagt, wohin es gehört; Synology DSM 7 kann das). + * Auf der NAS liegt danach direkt die fertige ZIP, ohne Teile und ohne Zusammensetzen. + * + * Nach jedem Stück wird die Größe auf der NAS geprüft. Ignoriert ein Server „Content-Range“ stillschweigend (er würde die Datei bei jedem + * Stück überschreiben und trotzdem „OK“ melden), fällt das auf und es wird als „nicht unterstützt“ gemeldet. Lehnt der Server ein Stück als + * zu groß ab (HTTP 413), wird die Stückgröße halbiert und von vorn begonnen. Pro Stück bis zu 4 Versuche mit wachsender Wartezeit (3, 6, 12 s). + * Bei einem Fehler wird die unvollständige Datei auf der NAS gelöscht. + * + * @return array{error:?string,code:int,unsupported:bool} + */ +function nasbk_upload_range(array $cfg, string $localPath, string $name, int $chunkBytes): array +{ + @set_time_limit(0); + $url = nasbk_remote_url($cfg, $name); + clearstatcache(true, $localPath); + $size = (int) filesize($localPath); + $src = @fopen($localPath, 'rb'); + if ($src === false) return ['error' => 'Hochladen in Stücken: Die Backup-Datei konnte nicht gelesen werden.', 'code' => 0, 'unsupported' => false]; + $drop = fn() => nasbk_request($cfg, 'DELETE', $url, ['timeout' => 60]); + $drop(); // Reste eines früheren Versuchs entfernen (sonst hängt die NAS „(2)“ an den Namen oder hängt Daten an) + $chunk = max(NASBK_MIN_PART, $chunkBytes); + while (true) { + $total = max(1, (int) ceil($size / $chunk)); + $halve = false; + for ($i = 0; $i < $total; $i++) { + $offset = $i * $chunk; + $len = min($chunk, $size - $offset); + $end = $offset + $len - 1; + $ok = false; + $last = null; + $lastCode = 0; + for ($try = 1; $try <= 4 && !$ok; $try++) { + $r = nasbk_request($cfg, 'PUT', $url, [ + 'stream' => ['handle' => $src, 'offset' => $offset, 'length' => $len, 'hash' => null], + 'headers' => ["Content-Range: bytes {$offset}-{$end}/{$size}", 'Content-Type: application/octet-stream'], + 'timeout' => max(300, (int) ceil($len / 1048576) * 20), + ]); + $lastCode = $r['code']; + if (in_array($r['code'], [200, 201, 204, 206], true)) { + $remote = nasbk_remote_size($cfg, $url); + if ($remote === null || $remote === $offset + $len) { $ok = true; break; } + // Die NAS hat „Content-Range“ nicht beachtet (Datei hat nicht die erwartete Größe) + fclose($src); + $drop(); + return ['error' => 'Hochladen in Stücken: Die NAS beachtet „Content-Range“ nicht.', 'code' => $r['code'], 'unsupported' => true]; + } + if ($i === 0 && in_array($r['code'], [400, 405, 416, 501], true)) { // Server kennt Stück-Uploads nicht + fclose($src); + $drop(); + return ['error' => nasbk_explain($r, 'Hochladen in Stücken'), 'code' => $r['code'], 'unsupported' => true]; + } + $last = nasbk_explain($r, "Hochladen von Stück " . ($i + 1) . " von {$total} (" . round($len / 1048576, 1) . ' MB)'); + if ($r['code'] === 413 || in_array($r['code'], [401, 403, 507], true)) break; // wiederholen hilft nicht + if ($try < 4) sleep(min(60, 3 * (2 ** ($try - 1)))); + } + if (!$ok) { + if ($lastCode === 413 && $chunk > NASBK_MIN_PART) { $halve = true; break; } + fclose($src); + $drop(); + return ['error' => (string) $last, 'code' => $lastCode, 'unsupported' => false]; + } + } + if ($halve) { + $chunk = max(NASBK_MIN_PART, intdiv($chunk, 2)); + plugin_set_setting(NASBK, 'part_limit', (string) $chunk); // künftig gleich mit dieser Größe beginnen + $drop(); + continue; + } + fclose($src); + return ['error' => null, 'code' => 201, 'unsupported' => false]; + } +} + +/** + * Große Datei hochladen, die nicht in einem Stück geht: zuerst als eine Datei in Stücken (Content-Range), sonst als Teile mit Abschlussdatei. + * Die Unterstützung der NAS wird gemerkt („range_support“: 1 = geht, 0 = geht nicht), damit nicht jedes Mal vergeblich probiert wird. + */ +function nasbk_upload_big(array $cfg, string $localPath, string $name, int $chunkBytes): ?string +{ + if ((string) plugin_setting(NASBK, 'range_support', '') !== '0') { + $r = nasbk_upload_range($cfg, $localPath, $name, $chunkBytes); + if ($r['error'] === null) { plugin_set_setting(NASBK, 'range_support', '1'); return null; } + if (!$r['unsupported']) return $r['error']; + plugin_set_setting(NASBK, 'range_support', '0'); + } + return nasbk_upload_parts($cfg, $localPath, $name, $chunkBytes); +} + +/** + * Lädt die Datei in Teilen hoch. Jedes Teil wird direkt aus der Backup-Datei gesendet (keine Zwischenkopie), danach auf der NAS auf die + * richtige Größe geprüft und bei Fehlern bis zu dreimal neu gesendet. Erst wenn alle Teile da sind, kommt die Abschlussdatei „name.zip.parts“ + * (Größe, Prüfsumme SHA-256, Liste der Teile). Bei einem Fehler werden die schon hochgeladenen Teile entfernt. + * + * Lehnt der Server ein Teil als zu groß ab (HTTP 413), wird die Teilgröße halbiert (nicht unter 10 MB) und von vorn begonnen; die + * funktionierende Größe wird gemerkt. So passt sich das Plugin einer unbekannten Grenze selbst an. + */ +function nasbk_upload_parts(array $cfg, string $localPath, string $name, int $partBytes): ?string +{ + @set_time_limit(0); + $min = NASBK_MIN_PART; + $partBytes = max($min, $partBytes); + while (true) { + $res = nasbk_upload_parts_try($cfg, $localPath, $name, $partBytes); + if ($res['error'] === null) return null; + if ($res['code'] === 413 && $partBytes > $min) { + $partBytes = max($min, intdiv($partBytes, 2)); + plugin_set_setting(NASBK, 'part_limit', (string) $partBytes); // künftig gleich mit dieser Größe beginnen + continue; + } + return $res['error']; + } +} + +/** Ein Durchgang mit fester Teilgröße. @return array{error:?string,code:int} */ +function nasbk_upload_parts_try(array $cfg, string $localPath, string $name, int $partBytes): array +{ + clearstatcache(true, $localPath); + $size = (int) filesize($localPath); + $count = max(1, (int) ceil($size / $partBytes)); + $src = @fopen($localPath, 'rb'); + if ($src === false) return ['error' => 'Hochladen in Teilen: Die Backup-Datei konnte nicht gelesen werden.', 'code' => 0]; + $hash = hash_init('sha256'); + $done = []; + $fail = function (string $msg, int $code) use (&$done, $cfg, $name, $src): array { + fclose($src); + foreach ($done as $n) nasbk_request($cfg, 'DELETE', nasbk_remote_url($cfg, nasbk_part_name($name, $n)), ['timeout' => 60]); + return ['error' => $msg, 'code' => $code]; + }; + $manifest = ['name' => $name, 'size' => $size, 'part_size' => $partBytes, 'parts' => []]; + for ($n = 1; $n <= $count; $n++) { + $offset = ($n - 1) * $partBytes; + $len = min($partBytes, $size - $offset); + $url = nasbk_remote_url($cfg, nasbk_part_name($name, $n)); + $ok = false; + $last = null; + $lastCode = 0; + for ($try = 1; $try <= 3 && !$ok; $try++) { + $ctx = hash_copy($hash); // Prüfsumme nur übernehmen, wenn dieser Versuch gelingt (ein Wiederholungsversuch liest das Teil neu) + $r = nasbk_request($cfg, 'PUT', $url, ['stream' => ['handle' => $src, 'offset' => $offset, 'length' => $len, 'hash' => $ctx], 'timeout' => max(300, (int) ceil($len / 1048576) * 20)]); + $lastCode = $r['code']; + if (in_array($r['code'], [200, 201, 204], true)) { + $remote = nasbk_remote_size($cfg, $url); + if ($remote === null || $remote === $len) { $ok = true; $hash = $ctx; } + else $last = "Teil {$n} ist unvollständig auf der NAS angekommen ({$remote} statt {$len} Bytes)."; + } else { + $last = nasbk_explain($r, "Hochladen von Teil {$n} von {$count} (" . round($len / 1048576, 1) . ' MB)'); + if (in_array($r['code'], [413, 401, 403, 507], true)) break; // wiederholen hilft nicht + } + if (!$ok && $try < 3) sleep(2 * $try); + } + if (!$ok) return $fail((string) $last, $lastCode); + $done[] = $n; + $manifest['parts'][] = ['n' => $n, 'file' => nasbk_part_name($name, $n), 'size' => $len]; + } + fclose($src); + $manifest['sha256'] = hash_final($hash); + $manifest['created'] = date('c'); + $tmp = tempnam(sys_get_temp_dir(), 'nasbkm'); + file_put_contents($tmp, json_encode($manifest, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); + $r = nasbk_request($cfg, 'PUT', nasbk_remote_url($cfg, $name . '.parts'), ['file' => $tmp, 'timeout' => 120]); + @unlink($tmp); + if (!in_array($r['code'], [200, 201, 204], true)) { + foreach ($done as $n) nasbk_request($cfg, 'DELETE', nasbk_remote_url($cfg, nasbk_part_name($name, $n)), ['timeout' => 60]); + return ['error' => nasbk_explain($r, 'Abschlussdatei schreiben'), 'code' => $r['code']]; + } + return ['error' => null, 'code' => 201]; +} + +/** Löscht eine Sicherung auf der NAS samt allen Teilen. $item stammt aus nasbk_list() (ohne Angabe wird die Liste geholt). */ +function nasbk_delete_remote(array $cfg, string $name, ?array $item = null): bool +{ + if ($item === null) { + $l = nasbk_list($cfg); + foreach ($l['items'] as $it) if ($it['name'] === $name) $item = $it; + } + $okCodes = [200, 204, 404]; + $ok = true; + if (!empty($item['parts'])) { + // Zuerst die Abschlussdatei: Ab dann gilt die Sicherung nicht mehr als vollständig + $r = nasbk_request($cfg, 'DELETE', nasbk_remote_url($cfg, $name . '.parts'), ['timeout' => 60]); + $ok = in_array($r['code'], $okCodes, true) && $ok; + for ($n = 1; $n <= (int) $item['parts']; $n++) { + $r = nasbk_request($cfg, 'DELETE', nasbk_remote_url($cfg, nasbk_part_name($name, $n)), ['timeout' => 60]); + $ok = in_array($r['code'], $okCodes, true) && $ok; + } + return $ok; + } + $r = nasbk_request($cfg, 'DELETE', nasbk_remote_url($cfg, $name), ['timeout' => 60]); + return in_array($r['code'], $okCodes, true); +} + +/** Löscht Sicherungen nach den beiden Regeln „älter als X Tage“ und „mehr als Y Stück“ (0 = Regel aus). Räumt außerdem abgebrochene Teil-Uploads auf. @return array{deleted:string[],error:string} */ function nasbk_rotate(array $cfg): array { - if ($cfg['keep'] <= 0 && $cfg['keep_days'] <= 0) return ['deleted' => [], 'error' => '']; $list = nasbk_list($cfg); if (!$list['ok']) return ['deleted' => [], 'error' => $list['error']]; + // Teile ohne Abschlussdatei, die älter als ein Tag sind (ein laufender Upload bleibt unberührt) + foreach ($list['orphans'] as $o) { + $t = strtotime($o['modified']) ?: 0; + if ($t > 0 && time() - $t > 86400) nasbk_request($cfg, 'DELETE', nasbk_remote_url($cfg, $o['name']), ['timeout' => 60]); + } + if ($cfg['keep'] <= 0 && $cfg['keep_days'] <= 0) return ['deleted' => [], 'error' => '']; $items = $list['items']; // neueste zuerst (Namen enthalten das Datum) $drop = []; if ($cfg['keep_days'] > 0) { $cutoff = strtotime("-{$cfg['keep_days']} days"); foreach ($items as $it) { - if (preg_match('/^backup_(\d{4}-\d{2}-\d{2})_(\d{2})-(\d{2})-(\d{2})/', $it['name'], $m) && strtotime("{$m[1]} {$m[2]}:{$m[3]}:{$m[4]}") < $cutoff) $drop[$it['name']] = true; + if (preg_match('/^backup_(\d{4}-\d{2}-\d{2})_(\d{2})-(\d{2})-(\d{2})/', $it['name'], $m) && strtotime("{$m[1]} {$m[2]}:{$m[3]}:{$m[4]}") < $cutoff) $drop[$it['name']] = $it; } } - if ($cfg['keep'] > 0) foreach (array_slice($items, $cfg['keep']) as $it) $drop[$it['name']] = true; + if ($cfg['keep'] > 0) foreach (array_slice($items, $cfg['keep']) as $it) $drop[$it['name']] = $it; $deleted = []; - foreach (array_keys($drop) as $name) { - $r = nasbk_request($cfg, 'DELETE', nasbk_remote_url($cfg, $name), ['timeout' => 60]); - if (in_array($r['code'], [200, 204, 404], true)) $deleted[] = $name; + foreach ($drop as $name => $it) { + if (nasbk_delete_remote($cfg, $name, $it)) $deleted[] = $name; } return ['deleted' => $deleted, 'error' => '']; } + /** Hauptordner von DeskHub (Ort der Datei, die get_db() enthält: includes/db.php). */ function nasbk_root(): string { @@ -330,13 +604,23 @@ function nasbk_make_archive(array $cfg): array $tmp = sys_get_temp_dir() . '/deskhub-nasbk-' . bin2hex(random_bytes(4)); if (!@mkdir($tmp . '/out', 0700, true)) return ['ok' => false, 'error' => 'Der Zwischenordner für das Backup konnte nicht angelegt werden.']; $options = ['with_database' => $cfg['with_database'], 'with_files' => $cfg['with_files'], 'exclude' => $cfg['excludes'], 'verify' => false]; // das Plugin prüft selbst (ohne Eintrag in die Prüfliste der Backup-Seite) + // Ältere DeskHub-Kerne (vor 1.0.45) schließen den Ordner backups/ bei einem anderen Zielordner nicht aus: dann steckten alle alten Backups + // noch einmal im neuen. Dort schließt das Plugin ihn selbst aus (ab 1.0.45 übernimmt das der Kern und behält die .htaccess). + if (!defined('DESKHUB_VERSION') || version_compare((string) DESKHUB_VERSION, '1.0.45', '<')) $options['exclude'] = array_values(array_unique(array_merge((array) $options['exclude'], ['backups']))); // „Wichtigste Dateien“: Daten, die sich nicht neu herunterladen lassen (Uploads, Plugins, Konfiguration, Logo/Branding) if ($cfg['with_files'] && $cfg['scope'] === 'important') $options['only'] = ['uploads', 'plugins', 'config', 'assets/branding', '.htaccess']; + // Nur ein Backup gleichzeitig (ab DeskHub 1.0.45): läuft gerade das automatische oder ein manuelles Backup, wird dieses hier später erneut versucht + $locked = true; + if (function_exists('backup_lock_acquire')) { + $locked = backup_lock_acquire(get_db()); + if (!$locked) { nasbk_rmtree($tmp); return ['ok' => false, 'error' => 'Es läuft gerade ein anderes Backup. Das NAS-Backup wird später erneut versucht.']; } + } $GLOBALS['nasbk_creating'] = true; // eigenes Backup des Plugins: nicht zusätzlich in die Warteschlange der Backup-Seite aufnehmen try { $res = create_backup($root, $tmp . '/out', null, $options); } finally { $GLOBALS['nasbk_creating'] = false; + if ($locked && function_exists('backup_lock_release')) backup_lock_release(get_db()); } if (empty($res['ok'])) { nasbk_rmtree($tmp); return ['ok' => false, 'error' => (string) ($res['error'] ?? 'Backup fehlgeschlagen.')]; } if ($cfg['with_database']) { @@ -380,13 +664,18 @@ function nasbk_run(PDO $pdo, bool $manual = false): array $cfg = nasbk_config(); if ($err = nasbk_config_error($cfg)) { nasbk_record(false, $err, $manual); return ['ok' => false, 'message' => $err]; } + $t0 = microtime(true); $arch = nasbk_make_archive($cfg); + $tArchive = microtime(true) - $t0; if (!$arch['ok']) { nasbk_record(false, $arch['error'], $manual); return ['ok' => false, 'message' => $arch['error']]; } try { if ($err = nasbk_ensure_folder($cfg)) { nasbk_record(false, $err, $manual); return ['ok' => false, 'message' => $err]; } + $t1 = microtime(true); if ($err = nasbk_upload($cfg, $arch['path'], $arch['filename'])) { nasbk_record(false, $err, $manual); return ['ok' => false, 'message' => $err]; } + $tUpload = microtime(true) - $t1; $rot = nasbk_rotate($cfg); $msg = $arch['filename'] . ' (' . $arch['size'] . ' MB, ' . ($cfg['mode'] === 'database' ? 'nur Datenbank' : 'komplett') . ') auf die NAS hochgeladen' + . ' – Backup erstellen: ' . nasbk_duration($tArchive) . ', Hochladen: ' . nasbk_speed((int) round($arch['size'] * 1048576), $tUpload) . ($rot['deleted'] ? '; ' . count($rot['deleted']) . ' alte Sicherung(en) gelöscht' : '') . ($rot['error'] !== '' ? '; Aufbewahrung nicht ausgeführt: ' . $rot['error'] : '') . '.'; nasbk_record(true, $msg, $manual); @@ -396,6 +685,21 @@ function nasbk_run(PDO $pdo, bool $manual = false): array } } +/** „2 Min 5 s“ bzw. „1 Std 3 Min“ für die Statusanzeige. */ +function nasbk_duration(float $sec): string +{ + $sec = (int) round($sec); + if ($sec < 60) return $sec . ' s'; + if ($sec < 3600) return intdiv($sec, 60) . ' Min ' . ($sec % 60) . ' s'; + return intdiv($sec, 3600) . ' Std ' . intdiv($sec % 3600, 60) . ' Min'; +} + +/** „4550 MB in 1 Std 2 Min (1,2 MB/s)“: zeigt, wohin die Zeit geht. */ +function nasbk_speed(int $bytes, float $sec): string +{ + $mb = $bytes / 1048576; + return round($mb) . ' MB in ' . nasbk_duration($sec) . ($sec > 0 ? ' (' . number_format($mb / $sec, 1, ',', '') . ' MB/s)' : ''); +} /** Läuft gerade ein manuell gestartetes Backup? (Markierung verfällt nach 2 Stunden, falls ein Lauf abgebrochen wurde) */ function nasbk_running(): bool { @@ -406,18 +710,39 @@ function nasbk_running(): bool /** Startet ein eigenes Backup nach dem Senden der Antwort (das Seitenladen wartet nicht auf das Backup). */ function nasbk_run_background(PDO $pdo): void { + nasbk_defer(fn() => nasbk_run($pdo, true), 'Backup'); +} + +/** + * Führt eine lange Aufgabe (Backup, Upload, Download) nach dem Senden der Antwort aus. Wichtig: Die Sitzungssperre wird vorher freigegeben, + * sonst wartet jede weitere Seite desselben Mitarbeiters, bis die Aufgabe fertig ist. Ohne fastcgi_finish_request wird die Ausgabe wenigstens + * vollständig geschickt. Das Ergebnis steht danach im Status der Plugin-Seite. + * + * @return array{ok:bool,message:string} Sofortige Antwort für die Seite + */ +function nasbk_defer(callable $job, string $what): array +{ + if (nasbk_running()) return ['ok' => false, 'message' => 'Es läuft bereits ein Vorgang (Backup, Upload oder Download). Bitte kurz warten.']; plugin_set_setting(NASBK, 'running_since', (string) time()); - register_shutdown_function(function () use ($pdo) { - if (function_exists('fastcgi_finish_request')) @fastcgi_finish_request(); + register_shutdown_function(function () use ($job, $what) { + if (function_exists('fastcgi_finish_request')) { + @fastcgi_finish_request(); + } else { + while (ob_get_level() > 0) { @ob_end_flush(); } + @flush(); + } + if (session_status() === PHP_SESSION_ACTIVE) @session_write_close(); @ignore_user_abort(true); + @set_time_limit(0); try { - nasbk_run($pdo, true); + $job(); } catch (Throwable $e) { - nasbk_record(false, 'Backup abgebrochen: ' . $e->getMessage(), true); + nasbk_record(false, $what . ' abgebrochen: ' . $e->getMessage(), true); } finally { plugin_set_setting(NASBK, 'running_since', '0'); } }); + return ['ok' => true, 'message' => $what . ' läuft jetzt im Hintergrund. Das Ergebnis steht oben im Status; die Seite lädt sich von selbst neu.']; } /** Prüft die Verbindung: Ordner anlegen, kleine Testdatei schreiben, Größe lesen, löschen. @return array{ok:bool,message:string} */ function nasbk_test(array $cfg): array @@ -484,10 +809,12 @@ function nasbk_push_file(array $cfg, string $path, string $name): array @set_time_limit(0); if ($err = nasbk_config_error($cfg)) return ['ok' => false, 'message' => $err]; if ($err = nasbk_ensure_folder($cfg)) return ['ok' => false, 'message' => $err]; + $t1 = microtime(true); if ($err = nasbk_upload($cfg, $path, $name)) return ['ok' => false, 'message' => $err]; + $took = microtime(true) - $t1; $rot = nasbk_rotate($cfg); nasbk_cache_clear(); - return ['ok' => true, 'message' => $name . ' auf die NAS kopiert' . ($rot['deleted'] ? ' (' . count($rot['deleted']) . ' alte Sicherung(en) dort gelöscht)' : '') . '.']; + return ['ok' => true, 'message' => $name . ' auf die NAS kopiert (' . nasbk_speed((int) filesize($path), $took) . ')' . ($rot['deleted'] ? ' (' . count($rot['deleted']) . ' alte Sicherung(en) dort gelöscht)' : '') . '.']; } /** Zwischenspeicher der NAS-Liste (damit die Backup-Seite nicht bei jedem Aufruf die NAS befragt). */ @@ -544,10 +871,52 @@ function nasbk_save_settings(array $post, array $staff = []): array plugin_set_setting(NASBK, 'time', preg_match('/^([01]\d|2[0-3]):[0-5]\d$/', $time) ? $time : '02:00'); plugin_set_setting(NASBK, 'keep_days', (string) max(0, min(3650, (int) ($post['keep_days'] ?? 0)))); plugin_set_setting(NASBK, 'keep', (string) max(0, min(365, (int) ($post['keep'] ?? 14)))); + plugin_set_setting(NASBK, 'split', in_array($post['split'] ?? 'auto', ['auto', 'always', 'never'], true) ? (string) $post['split'] : 'auto'); + plugin_set_setting(NASBK, 'part_mb', (string) max(10, min(4000, (int) ($post['part_mb'] ?? 200)))); + plugin_set_setting(NASBK, 'part_limit', '0'); + plugin_set_setting(NASBK, 'range_support', ''); // neu ausprobieren, ob die NAS Stück-Uploads kann + plugin_set_setting(NASBK, 'single_limit', '0'); // gemerkte Größengrenze zurücksetzen: nach einer Änderung (z. B. am Proxy) neu ausprobieren nasbk_cache_clear(); return ['ok' => true, 'message' => 'Einstellungen gespeichert.']; } +/** + * Lädt eine in Teilen abgelegte Sicherung herunter und setzt sie in $target zusammen. Geprüft werden Abschlussdatei, Größe jedes Teils, + * Gesamtgröße und SHA-256 des Ganzen. Gibt eine Fehlermeldung oder null zurück. + */ +function nasbk_download_parts(array $cfg, string $name, string $target): ?string +{ + @set_time_limit(0); + $m = nasbk_request($cfg, 'GET', nasbk_remote_url($cfg, $name . '.parts'), ['timeout' => 60]); + if ($m['code'] !== 200) return nasbk_explain($m, 'Abschlussdatei lesen'); + $man = json_decode($m['body'], true); + if (!is_array($man) || ($man['name'] ?? '') !== $name || empty($man['parts']) || !is_array($man['parts']) || !preg_match('/^[a-f0-9]{64}$/', (string) ($man['sha256'] ?? ''))) { + return 'Herunterladen: Die Abschlussdatei der Sicherung ist beschädigt.'; + } + $out = @fopen($target, 'wb'); + if ($out === false) return 'Herunterladen: Die Zieldatei konnte nicht angelegt werden.'; + $piece = $target . '.teil'; + $total = 0; + foreach ($man['parts'] as $p) { + $n = (int) ($p['n'] ?? 0); + $want = (int) ($p['size'] ?? -1); + $pn = nasbk_part_name($name, $n); + $r = nasbk_request($cfg, 'GET', nasbk_remote_url($cfg, $pn), ['save_to' => $piece, 'timeout' => 3600]); + if ($r['code'] !== 200) { fclose($out); @unlink($piece); return nasbk_explain($r, "Herunterladen von Teil {$n}"); } + if ($want < 0 || filesize($piece) !== $want) { fclose($out); @unlink($piece); return "Herunterladen: Teil {$n} ist unvollständig angekommen. Bitte erneut versuchen."; } + $in = fopen($piece, 'rb'); + stream_copy_to_stream($in, $out); + fclose($in); + @unlink($piece); + $total += $want; + } + fclose($out); + clearstatcache(true, $target); + if ($total !== (int) ($man['size'] ?? -1) || filesize($target) !== $total) return 'Herunterladen: Die zusammengesetzte Datei hat nicht die erwartete Größe.'; + if (!hash_equals((string) $man['sha256'], (string) hash_file('sha256', $target))) return 'Herunterladen: Die Prüfsumme der zusammengesetzten Datei stimmt nicht. Bitte erneut versuchen.'; + return null; +} + /** Holt eine Sicherung von der NAS in den Backup-Ordner und prüft sie. @return array{ok:bool,message:string} */ function nasbk_fetch(array $cfg, string $name): array { @@ -559,10 +928,19 @@ function nasbk_fetch(array $cfg, string $name): array $target = $dir . '/' . $name; if (is_file($target)) return ['ok' => false, 'message' => 'Diese Sicherung liegt schon auf dem Server.']; $tmp = $dir . '/.nas-' . bin2hex(random_bytes(4)) . '.part'; - $r = nasbk_request($cfg, 'GET', nasbk_remote_url($cfg, $name), ['save_to' => $tmp, 'timeout' => 3600]); - if ($r['code'] !== 200) { @unlink($tmp); return ['ok' => false, 'message' => nasbk_explain($r, 'Herunterladen')]; } - $expected = nasbk_remote_size($cfg, nasbk_remote_url($cfg, $name)); - if ($expected !== null && filesize($tmp) !== $expected) { @unlink($tmp); return ['ok' => false, 'message' => 'Herunterladen: Die Datei ist unvollständig angekommen. Bitte erneut versuchen.']; } + // Liegt die Sicherung in Teilen auf der NAS? Dann werden die Teile nacheinander geholt und zusammengesetzt. + $item = null; + $l = nasbk_list($cfg, 30); + if ($l['ok']) foreach ($l['items'] as $it) if ($it['name'] === $name) $item = $it; + if ($item && !empty($item['parts'])) { + $err = nasbk_download_parts($cfg, $name, $tmp); + if ($err !== null) { @unlink($tmp); return ['ok' => false, 'message' => $err]; } + } else { + $r = nasbk_request($cfg, 'GET', nasbk_remote_url($cfg, $name), ['save_to' => $tmp, 'timeout' => 3600]); + if ($r['code'] !== 200) { @unlink($tmp); return ['ok' => false, 'message' => nasbk_explain($r, 'Herunterladen')]; } + $expected = nasbk_remote_size($cfg, nasbk_remote_url($cfg, $name)); + if ($expected !== null && filesize($tmp) !== $expected) { @unlink($tmp); return ['ok' => false, 'message' => 'Herunterladen: Die Datei ist unvollständig angekommen. Bitte erneut versuchen.']; } + } if (!function_exists('backup_verify')) require_once nasbk_root() . '/includes/backup_restore.php'; $check = backup_verify($tmp); if (empty($check['ok'])) { @unlink($tmp); return ['ok' => false, 'message' => 'Die Sicherung von der NAS ist nicht in Ordnung: ' . implode(' ', (array) ($check['errors'] ?? []))]; } @@ -662,26 +1040,31 @@ function nasbk_page_action(string $do, array $post, array $staff = []): array case 'test': return nasbk_test($cfg); case 'run': - if (nasbk_running()) return ['ok' => false, 'message' => 'Es läuft bereits ein Backup. Bitte kurz warten.']; - nasbk_run_background(get_db()); - return ['ok' => true, 'message' => 'Das eigene Backup läuft jetzt im Hintergrund. Das Ergebnis steht oben im Status; die Seite lädt sich von selbst neu.']; + return nasbk_defer(fn() => nasbk_run(get_db(), true), 'Das eigene Backup'); case 'sync': - nasbk_cache_clear(); - $r = nasbk_sync_local(get_db(), true); - return ['ok' => $r['ok'], 'message' => $r['message']]; + return nasbk_defer(function () { + nasbk_cache_clear(); + $r = nasbk_sync_local(get_db(), true); + if ($r['ok'] && $r['done'] === 0) nasbk_record(true, $r['message'] !== '' ? $r['message'] : 'Es gab nichts zu kopieren.', true); + }, 'Das Kopieren der Backups'); case 'upload': $path = nasbk_local_path($name); if ($path === null) return ['ok' => false, 'message' => 'Backup nicht gefunden.']; - $r = nasbk_push_file($cfg, $path, $name); - nasbk_record($r['ok'], $r['message'], true); - return $r; + return nasbk_defer(function () use ($cfg, $path, $name) { + $r = nasbk_push_file($cfg, $path, $name); + nasbk_record($r['ok'], $r['message'], true); + }, 'Das Hochladen von ' . $name); case 'fetch': - return nasbk_fetch($cfg, $name); + if (!nasbk_valid_name($name)) return ['ok' => false, 'message' => 'Ungültiger Dateiname.']; + return nasbk_defer(function () use ($cfg, $name) { + $r = nasbk_fetch($cfg, $name); + nasbk_record($r['ok'], $r['message'], true); + }, 'Das Herunterladen von ' . $name); case 'delete_remote': if (!nasbk_valid_name($name) || nasbk_config_error($cfg)) return ['ok' => false, 'message' => 'Ungültige Anfrage.']; - $r = nasbk_request($cfg, 'DELETE', nasbk_remote_url($cfg, $name), ['timeout' => 60]); + $gone = nasbk_delete_remote($cfg, $name); nasbk_cache_clear(); - return in_array($r['code'], [200, 204], true) ? ['ok' => true, 'message' => $name . ' von der NAS gelöscht.'] : ['ok' => false, 'message' => nasbk_explain($r, 'Löschen')]; + return $gone ? ['ok' => true, 'message' => $name . ' von der NAS gelöscht.'] : ['ok' => false, 'message' => 'Löschen: Die Sicherung (oder einzelne Teile) ließ sich auf der NAS nicht löschen. Prüfe, ob der Benutzer dort Löschrechte hat.']; } return ['ok' => false, 'message' => 'Unbekannte Aktion.']; } diff --git a/Plugins/plugins/nas-backup/pages/einstellungen.php b/Plugins/plugins/nas-backup/pages/einstellungen.php index ad3426c6..c368f6e5 100644 --- a/Plugins/plugins/nas-backup/pages/einstellungen.php +++ b/Plugins/plugins/nas-backup/pages/einstellungen.php @@ -7,7 +7,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $do = (string) ($_POST['do'] ?? ''); $r = nasbk_page_action($do, $_POST, $staff); audit_log($staff['id'], 'Synology NAS Backup: ' . $do . ' (' . ($r['ok'] ? 'erfolgreich' : 'fehlgeschlagen') . ')'); - if ($r['ok']) $message = $r['message']; else $error = $r['message']; + // Post/Redirect/Get: Nach einem Klick auf die Seite selbst weiterleiten. Sonst schickt das automatische Neuladen (alle 10 Sekunden, solange ein + // Vorgang läuft) oder F5 den Klick noch einmal ab: „läuft bereits“ oder, sobald der erste fertig ist, ein ZWEITES Backup bzw. ein zweiter Upload. + // Plugin-Seiten werden erst nach der Kopfzeile des Layouts ausgegeben, eine Weiterleitung per Header ist dann nicht mehr möglich: + // die Seite ersetzt sich deshalb selbst durch die normale (GET-)Adresse. Die Meldung zeigt der Kern oben auf der nächsten Seite. + flash($r['ok'] ? 'success' : 'error', $r['message']); + $to = nasbk_page_url(); + echo '

Einen Moment …

'; + return; } $cfg = nasbk_config(); $hasPassword = $cfg['password'] !== ''; @@ -177,6 +184,21 @@ $checkMap = is_array($checkMap) ? $checkMap : [];
+
+

📦 Große Backups in Stücken hochladen

+

Manche Server oder Proxys vor der NAS nehmen nur Dateien bis zu einer Größe an (zum Beispiel Cloudflare: 100 MB, Fehler „HTTP 413“). Dann wird das Backup in Stücken hochgeladen. Bevorzugt als eine einzige Datei: Jedes Stück sagt der NAS per Content-Range, wohin es gehört (kann z. B. Synology DSM 7), und auf der NAS liegt am Ende direkt die fertige .zip. Nach jedem Stück wird die Größe geprüft. Kann die NAS das nicht, lädt das Plugin ersatzweise Teile (backup_….zip.part001 …) hoch und legt erst danach eine kleine Abschlussdatei an; beim Zurückholen setzt es sie wieder zusammen und prüft die Prüfsumme.

+
+
+

„Automatisch“ lässt kleine und mittlere Backups als normale .zip auf der NAS. Scheitert der Upload an einer Größengrenze, lädt das Plugin die Datei in Stücken hoch und merkt sich die Größe, damit solche Backups künftig gleich in Stücken gehen.

+
+
MB +

Größe eines Stücks, zwischen 10 und 4000 MB (Standard 200 MB). Die Stücke werden direkt aus dem Backup gesendet (keine Zwischenkopie). Die Gesamtdauer hängt vor allem von der Upload-Geschwindigkeit ab; größere Stücke sparen nur wenige Anfragen, kleinere verlieren bei einem Verbindungsabbruch weniger. Lehnt der Server ein Stück als zu groß ab (HTTP 413), halbiert das Plugin die Größe selbst, bis es klappt, und merkt sich den Wert. Hinter Cloudflare (Gratis-Tarif) sind höchstens 100 MB je Stück möglich, dort 50 MB einstellen.

+
+
diff --git a/Plugins/plugins/nas-backup/plugin.json b/Plugins/plugins/nas-backup/plugin.json index 64b1b8a0..bce3b183 100644 --- a/Plugins/plugins/nas-backup/plugin.json +++ b/Plugins/plugins/nas-backup/plugin.json @@ -1,8 +1,8 @@ { "slug": "nas-backup", "name": "Synology NAS Backup", - "version": "2.2.0", - "description": "Kopiert die Backups des Servers (Zeitplan und Knopf der Seite Backup) automatisch per WebDAV auf eine Synology NAS oder einen anderen WebDAV-Server. Mit eigener Seite im Adminportal: Verbindung, Backup-Liste (auf dem Server / auf der NAS), Aufbewahrung nach Alter und Anzahl, optional eigener Zeitplan mit Inhalt und Ausschlüssen, Verbindungstest und Fehlermeldung per E-Mail.", + "version": "2.6.3", + "description": "Kopiert die Backups des Servers (Zeitplan und Knopf der Seite Backup) automatisch per WebDAV auf eine Synology NAS oder einen anderen WebDAV-Server. Große Backups gehen in Stücken als eine einzige Datei (Content-Range), ersatzweise als Teile. Mit eigener Seite im Adminportal: Verbindung, Backup-Liste (auf dem Server / auf der NAS), Aufbewahrung nach Alter und Anzahl, optional eigener Zeitplan mit Inhalt und Ausschlüssen, Verbindungstest und Fehlermeldung per E-Mail.", "author": "DeskHub", "requires": "1.0.0", "permissions": ["hooks.cron", "ui.menu"]