(function (root, factory) { const api = factory(); if (typeof module === 'object' && module.exports) module.exports = api; if (root) root.I18n = api; })(typeof window !== 'undefined' ? window : globalThis, function () { const pairs = [ ['Alternative', 'Alternate'], ['Arbeitsbereich', 'Workspace'], ['Accounts verwalten', 'Manage accounts'], ['Archiv', 'Archive'], ['(aktivieren zum Erzeugen)', '(enable to generate)'], ['-Tab direkt beim jeweiligen Hoster.', ' tab for the relevant host.'], ['127.0.0.1 oder Tunnel-/Tailscale-Adresse', '127.0.0.1 or tunnel/Tailscale address'], ['API-Token', 'API token'], ['Account-Status', 'Account status'], ['Allowlist (IP/CIDR, eine pro Zeile)', 'Allowlist (one IP/CIDR per line)'], ['Aufbewahrung', 'Retention'], ['Ausgabe-Format der kopierten Links', 'Output format for copied links'], ['Auto-Check vor Upload', 'Auto-check before upload'], ['Automatischer Check vor dem Upload', 'Automatic check before upload'], ['Wiederholungen', 'Retries'], ['Maximale Geschwindigkeit (MB/s)', 'Maximum speed (MB/s)'], ['Neustart unter (kB/s)', 'Restart below (kB/s)'], ['Maximale Größe (MB)', 'Maximum size (MB)'], ['Bildschirm und Eingabesteuerung bleiben gesperrt.', 'Screen and input control remain locked.'], ['Bindet nur an', 'Binds only to'], ['Bindet an', 'Binds to'], ['. Nur IPs/CIDRs aus der Allowlist dürfen verbinden (Loopback immer) — zusätzlich zum Token. Über Tailscale: trage deinen Tailnet-Bereich ein (z.B.', '. Only IPs/CIDRs from the allowlist may connect (loopback is always allowed), in addition to the token. For Tailscale, enter your tailnet range, e.g.'], [') und die Tailscale-IP/MagicDNS oben als Code-Adresse. Transport ist plaintext über den Tunnel — Tailscale/WireGuard verschlüsselt.', ') and enter the Tailscale IP or MagicDNS name above as the code address. Transport is plaintext through the tunnel; Tailscale/WireGuard provides encryption.'], ['Datum', 'Date'], ['Einstellungskategorien', 'Settings categories'], ['Erlaubt', 'Allowed'], ['Erneut versuchen', 'Retry'], ['Exportieren', 'Export'], ['Fehlgeschlagene erneut', 'Retry failed uploads'], ['Fensterverhalten, Drop-Target und Programmupdates.', 'Window behavior, drop target, and application updates.'], ['Gesamt:', 'Total:'], ['Globales Speed-Limit', 'Global speed limit'], ['Hauptbereiche', 'Main sections'], ['Hinweis', 'Notice'], ['Hoster-Limits automatisch hochskalieren', 'Automatically scale host limits'], ['Hoster', 'Host'], ['Import-Vorabprüfung', 'Import preflight'], ['Kandidaten', 'Candidates'], ['Bereits vorhanden / dupliziert', 'Already present / duplicated'], ['Fehlend / unlesbar / leer', 'Missing / unreadable / empty'], ['Akzeptierte Dateien', 'Accepted files'], ['Ausgewählte Ziele', 'Selected destinations'], ['Entstehende Jobs', 'Resulting jobs'], ['Durch konfigurierte Größenlimits entfallene Jobs', 'Jobs omitted by configured size limits'], ['Vorabprüfung abgeschlossen. Wähle jetzt die Hoster für den Upload.', 'Preflight complete. Choose upload destinations.'], ['Vorabprüfung fehlgeschlagen.', 'Preflight failed.'], ['Importieren', 'Import'], ['In Zwischenablage', 'To clipboard'], ['In diesem Lauf hochgeladen:', 'Uploaded during this run:'], ['Input erlauben', 'Allow input'], ['Installierte Version', 'Installed version'], ['Laufzeit:', 'Runtime:'], ['Letzte 100 Uploads', 'Last 100 uploads'], ['Letzte 1000 Uploads', 'Last 1,000 uploads'], ['Letzte 7 Tage', 'Last 7 days'], ['Letzte 30 Tage', 'Last 30 days'], ['Letzte 90 Tage', 'Last 90 days'], ['Max. parallele Uploads', 'Max. parallel uploads'], ['Maximale parallele Uploads', 'Maximum parallel uploads'], ['Neustart', 'Restart'], ['Noch keine Accounts', 'No accounts yet'], ['Nur lokal (127.0.0.1) — Tunnel/VPN', 'Local only (127.0.0.1) — tunnel/VPN'], ['Parallele Uploads verringern', 'Decrease parallel uploads'], ['Priorität ändern. Alt und Pfeil nach oben oder unten verwenden', 'Change priority. Use Alt and the up or down arrow key'], ['Ziehen oder Alt und Pfeiltasten zum Sortieren', 'Drag or use Alt and arrow keys to sort'], ['Restzeit:', 'Time remaining:'], ['Rest', 'Remaining'], ['Schnell finden', 'Quick find'], ['Schnelleinstellungen', 'Quick settings'], ['Sicherung', 'Backup'], ['Sichtbarkeit', 'Visibility'], ['Sitzung', 'Session'], ['Speicherstatus', 'Save status'], ['Statistik', 'Statistics'], ['Upload-Statistik', 'Upload statistics'], ['Aktuelle Upload-Geschwindigkeit', 'Current upload speed'], ['Gesamt', 'Total'], ['Verbindungen', 'Connections'], ['Verbleibende Größe', 'Remaining size'], ['Verbleibend', 'Remaining'], ['Läuft', 'Running'], ['Suche Aktualisierungen', 'Check for updates'], ['Verbleibend:', 'Remaining:'], ['Zuletzt erzeugte Upload-Links', 'Recently generated upload links'], ['User-ID, role:ROLLEN-ID, @here oder @everyone', 'User ID, role:ROLE-ID, @here, or @everyone'], ['https://discord.com/api/webhooks/… oder eigene URL', 'https://discord.com/api/webhooks/… or custom URL'], ['nur lesenden', 'read-only'], ['z. B. Hauptaccount, Premium, Kunde XY', 'e.g. primary account, premium, customer XY'], ['Datei', 'File'], ['Dateien', 'Files'], ['Dateien hinzufügen', 'Add files'], ['Dateien oder Ordner hinzufügen', 'Add files or folders'], ['Ordner hinzufügen', 'Add folder'], ['Online-Schlüssel erstellen', 'Create online key'], ['Online-Schlüssel importieren', 'Import online key'], ['Einstellungen öffnen', 'Open settings'], ['Geschwindigkeitslimit', 'Speed limit'], ['Hilfe', 'Help'], ['Log-Ordner öffnen', 'Open log folder'], ['Diagnose-Paket exportieren', 'Export diagnostics package'], ['Eine neue Version ist verfügbar!', 'A new version is available!'], ['Bereit zum Download', 'Ready to download'], ['Abbrechen', 'Cancel'], ['Filter zurücksetzen', 'Reset filters'], ['Filter', 'Filters'], ['Jetzt installieren', 'Install now'], ['Jetzt updaten', 'Install now'], ['Alle Dateien', 'All files'], ['Aktiv', 'Active'], ['Alle Hoster', 'All hosts'], ['Alle Status', 'Any status'], ['Dateiname suchen', 'Search file name'], ['Nach Hoster filtern', 'Filter by host'], ['Nach Status filtern', 'Filter by status'], ['Nur Fehler', 'Errors only'], ['Sitzungsbericht', 'Session report'], ['Sitzungsbericht exportieren', 'Export session report'], ['Welches Format möchtest du speichern?', 'Which format would you like to save?'], ['Für diese Sitzung liegt noch kein abgeschlossener Upload vor', 'There is no completed upload for this session yet'], ['Wartend', 'Waiting'], ['Warteschlange filtern', 'Filter queue'], ['Warteschlange', 'Queue'], ['Fertig', 'Completed'], ['Fehler', 'Failed'], ['geprüft', 'checked'], ['Fehlerdetails kopieren', 'Copy failure details'], ['Fehlerdetails kopiert', 'Failure details copied'], ['Versuch', 'Attempt'], ['HTTP-Status', 'HTTP status'], ['Inhaltstyp', 'Content type'], ['Antwortauszug', 'Response excerpt'], ['Verfügbarkeit', 'Availability'], ['Bereite Accounts', 'Ready accounts'], ['Primär', 'Primary'], ['Nicht geprüft', 'Not checked'], ['Nicht aktiv', 'Inactive'], ['Prüfen', 'Check'], ['Bearbeiten', 'Edit'], ['Keine Upload-Ziele ausgewählt', 'No upload destinations selected'], ['Dateien ablegen, Ziele wählen und Uploads zentral steuern.', 'Drop files, choose destinations, and manage uploads in one place.'], ['Upload-Aufträge', 'Upload jobs'], ['Dateien hinzufügen, Ziele auswählen und Fortschritt verfolgen', 'Add files, choose destinations, and track progress'], ['+ Dateien', '+ Files'], ['+ Ordner', '+ Folder'], ['Dateien hierher ziehen oder klicken', 'Drop files here or click to browse'], ['Dateien und Ordner werden vor dem Upload geprüft.', 'Files and folders are checked before upload.'], ['Dateiname', 'File name'], ['Hoster / Account', 'Host / Account'], ['Hochgeladen / Größe', 'Uploaded / Size'], ['Geschwindigkeit', 'Speed'], ['Fortschritt', 'Progress'], ['Status', 'Status'], ['Aktionen', 'Actions'], ['Alle Links kopieren', 'Copy all links'], ['Alle entfernen', 'Remove all'], ['Entfernen', 'Remove'], ['Dateien in der Warteschlange', 'Files in queue'], ['Läuft:', 'Running:'], ['Fehler:', 'Failed:'], ['Dateigröße in der Warteschlange', 'Queued file size'], ['Upload-Geschwindigkeit:', 'Upload speed:'], ['Zugänge', 'Accounts'], ['Alle Accounts', 'All accounts'], ['Bereit', 'Ready'], ['Aktion nötig', 'Action required'], ['Zugänge prüfen, priorisieren und für Uploads bereitstellen.', 'Check, prioritize, and prepare accounts for uploads.'], ['Hoster-Zugangsdaten verwalten und prüfen', 'Manage and verify host account credentials'], ['Accounts prüfen', 'Check accounts'], ['Account hinzufügen', 'Add account'], ['Noch keine Hoster', 'No hosts yet'], ['Füge deinen ersten Hoster-Account hinzu. Die Zugangsdaten werden vor dem Speichern geprüft.', 'Add your first host account. Credentials are verified before saving.'], ['Alle ausklappen', 'Expand all'], ['Alle einklappen', 'Collapse all'], ['Wähle einen Hoster und gib deine Zugangsdaten ein.', 'Choose a host and enter your credentials.'], ['Wähle einen Hoster und gib deine Zugangsdaten ein. Der Account wird vor dem Anlegen geprüft.', 'Choose a host and enter your credentials. The account is checked before it is added.'], ['Prüfen und anlegen', 'Verify and add'], ['Prüfen und speichern', 'Verify and save'], ['Keine Einträge.', 'No entries.'], ['Schließen', 'Close'], ['Account löschen?', 'Delete account?'], ['Account wirklich löschen?', 'Are you sure you want to delete this account?'], ['Löschen', 'Delete'], ['Alle Optionen nach Aufgaben sortiert. Änderungen werden mit dem Speichern-Button übernommen.', 'All options are grouped by task. Changes are applied with the Save button.'], ['Speichern', 'Save'], ['Einstellungen', 'Settings'], ['Allgemein', 'General'], ['Uploads', 'Uploads'], ['Automatik', 'Automation'], ['Benachrichtigungen', 'Notifications'], ['Logs & Support', 'Logs & Support'], ['Fernsteuerung', 'Remote control'], ['Diagnose-Zugriff', 'Diagnostics access'], ['Backup & Übertragen', 'Backup & Transfer'], ['Keine passende Einstellung gefunden.', 'No matching setting found.'], ['Keine ungespeicherten Änderungen', 'No unsaved changes'], ['Oberfläche', 'Interface'], ['Sprache', 'Language'], ['Englisch', 'English'], ['Deutsch', 'German'], ['Immer im Vordergrund', 'Always on top'], ['Drop-Target anzeigen', 'Show drop target'], ['Programmupdate', 'Application update'], ['Nach neuer Version suchen', 'Check for a newer version'], ['Verfügbare Updates werden zusammen mit dem Changelog angezeigt.', 'Available updates are shown together with the changelog.'], ['Neue Version suchen', 'Check for a new version'], ['Nach Updates suchen', 'Check for updates'], ['Upload-Verhalten', 'Upload behavior'], ['Globale Leistung, Warteschlange und Verhalten nach einem erfolgreichen Upload.', 'Global performance, queue, and behavior after a successful upload.'], ['Leistung', 'Performance'], ['Globale parallele Uploads', 'Global parallel uploads'], ['0 = nur die Einstellung des jeweiligen Hosters verwenden', '0 = use the setting of each host'], ['Verteilt die globale Parallelität auf vorhandene Accounts eines Hosters.', 'Distributes global parallelism across the available accounts of a host.'], ['Nach Abschluss', 'After completion'], ['Nach Abschluss aus der Liste entfernen', 'Remove from the list after completion'], ['Erfolgreich hochgeladene Dateien verschwinden automatisch aus der Upload-Liste.', 'Successfully uploaded files are automatically removed from the upload list.'], ['Warteschlange beim Start wiederherstellen', 'Restore queue on startup'], ['Wiederhergestellte Warteschlange automatisch starten', 'Start restored queue automatically'], ['Startet wartende Uploads nach einem sichtbaren, abbrechbaren Countdown. Fehler und übersprungene Einträge bleiben unangetastet.', 'Starts waiting uploads after a visible, cancelable countdown. Failed and skipped entries remain untouched.'], ['Warte auf Account-Prüfung…', 'Waiting for account check…'], ['Noch nicht abgeschlossene Uploads werden beim nächsten Programmstart erneut angezeigt.', 'Incomplete uploads are shown again the next time the application starts.'], ['Quelldateien', 'Source files'], ['Nach erfolgreichem Upload löschen', 'Delete after successful upload'], ['Suchergebnisse', 'Search results'], ['Suchergebnisse:', 'Search results:'], ['Quelldatei nach vollständigem Upload dauerhaft löschen', 'Permanently delete source file after complete upload'], ['Löscht die Originaldatei endgültig, sobald alle dafür ausgewählten Hoster erfolgreich abgeschlossen sind. Der Papierkorb wird nicht verwendet.', 'Permanently deletes the original file after all selected hosts have completed successfully. The Recycle Bin is not used.'], ['Quelldateien dauerhaft löschen?', 'Permanently delete source files?'], ['Auswahl ist bereits in den Upload-Aufträgen.', 'The selection is already in the upload jobs.'], ['Nach einem vollständigen Upload zu allen ausgewählten Hostern wird die Originaldatei ohne Papierkorb endgültig von diesem PC gelöscht.', 'After a complete upload to all selected hosts, the original file is permanently deleted from this PC without using the Recycle Bin.'], ['Dauerhaftes Löschen aktivieren', 'Enable permanent deletion'], ['Hoster-Einstellungen', 'Host settings'], ['Upload-Einstellungen', 'Upload settings'], ['Erfolgreiche Links in fileuploader.log.', 'Successful links in fileuploader.log.'], ['Verteilt die Dateien reihum auf alle aktiven Accounts dieses Hosters (Datei 1 → Account 1, Datei 2 → Account 2 …). Hält z. B. byse-Accounts aktiv. Nur ein Account = kein Effekt.', 'Distributes files across all active accounts for this host in round-robin order (file 1 → account 1, file 2 → account 2, and so on). Keeps accounts such as byse active. Has no effect with only one account.'], ['Größen-Limit merken', 'Remember size limit'], ['Überspringt nach zwei verdächtigen Ablehnungen auf einem Account größere Dateien dort vorab ("Bekanntes Größen-Limit"). Abschalten = jede Datei wird immer wirklich versucht.', 'After two suspicious rejections on an account, larger files are skipped there in advance ("Known size limit"). When disabled, every file is always attempted.'], ['Einstellungen einzelner Hoster', 'Settings for individual hosts'], ['wie Wiederholungen, Geschwindigkeit, Parallelität, Dateigröße und Logging findest du im', 'such as retries, speed, parallelism, file size, and logging are available in'], ['Accounts-Tab.', 'the Accounts tab.'], ['Wiederholungen und überwachte Ordner für unbeaufsichtigte Uploads.', 'Retries and watched folders for unattended uploads.'], ['Unbeaufsichtigter Betrieb', 'Unattended operation'], ['Automatische Wiederholungsrunden', 'Automatic retry rounds'], ['0 = aus. Nach Batch-Ende werden transiente Fehler (Netzwerk, Hoster-Flake) automatisch bis zu N Runden neu versucht.', '0 = off. After a batch ends, transient errors (network or host issues) are retried automatically for up to N rounds.'], ['Wartezeit zwischen Runden', 'Delay between rounds'], ['Minuten · jede weitere Runde wartet entsprechend länger', 'Minutes · each additional round waits proportionally longer'], ['Ordnerüberwachung', 'Folder monitoring'], ['Ordnerüberwachung testen', 'Test folder monitoring'], ['Test der Ordnerüberwachung', 'Folder monitoring test'], ['Ordner wird geprüft…', 'Scanning folder…'], ['Der Test verändert weder Queue noch Einstellungen.', 'The test does not change the queue or settings.'], ['Prüft den aktuellen Ordner schreibgeschützt mit denselben Regeln.', 'Checks the current folder read-only with the same rules.'], ['Ordnerüberwachung konnte nicht getestet werden.', 'Folder monitoring could not be tested.'], ['Maximale automatische Queue-Größe', 'Maximum automatic queue size'], ['Abgleichintervall', 'Reconciliation interval'], ['Abschließen und pausieren', 'Finish and pause'], ['Fortsetzen', 'Resume'], ['Pausiert', 'Paused'], ['Queue-Limit erreicht', 'Queue limit reached'], ['Ordner getrennt', 'Folder disconnected'], ['Überwachung läuft seit', 'Monitoring since'], ['Ordner erreichbar', 'Folder reachable'], ['Letzte erkannte Datei', 'Last detected file'], ['Heute erkannt', 'Detected today'], ['Heute eingereiht', 'Queued today'], ['Heute übersprungen', 'Skipped today'], ['Wegen Queue-Limit zurückgestellt', 'Deferred by queue limit'], ['Aktuelle Queue-Auslastung', 'Current queue usage'], ['Letzter Abgleich', 'Last reconciliation'], ['Nächster Abgleich', 'Next reconciliation'], ['Letzter Fehler', 'Last error'], ['Nie', 'Never'], ['Ja', 'Yes'], ['Nein', 'No'], ['Keine Datei erkannt', 'No file detected'], ['Gefundene Dateien', 'Files found'], ['Passend zum Dateifilter', 'Matching file filter'], ['Bereits verarbeitet', 'Already processed'], ['Fehlend, leer oder nicht lesbar', 'Missing, empty, or unreadable'], ['Durch Größenlimits ausgeschlossen', 'Excluded by size limits'], ['Entstehende Upload-Jobs', 'Resulting upload jobs'], ['Verfügbare Jobs bis zum Queue-Limit', 'Available jobs before queue limit'], ['Aktuell zurückzustellende Dateien', 'Files currently deferred'], ['0 = unbegrenzt', '0 = unlimited'], ['Unbegrenzt', 'Unlimited'], ['1 Minute', '1 minute'], ['5 Minuten', '5 minutes'], ['15 Minuten', '15 minutes'], ['30 Minuten', '30 minutes'], ['60 Minuten', '60 minutes'], ['Automatik konnte nicht pausiert werden.', 'Automation could not be paused.'], ['Automatik konnte nicht fortgesetzt werden.', 'Automation could not be resumed.'], ['Ordnerüberwachung konnte nicht pausiert werden', 'Folder monitoring could not be paused'], ['Automatik ist pausiert', 'Automation is paused'], ['Telemetrie konnte nicht gespeichert werden.', 'Telemetry could not be saved.'], ['Automatik konnte nicht fortgesetzt werden', 'Automation could not be resumed'], ['Upload konnte nicht gestartet werden.', 'Upload could not be started.'], ['Upload wurde nicht bestätigt.', 'Upload was not confirmed.'], ['Upload-Wiederherstellung konnte nicht vorbereitet werden', 'Upload recovery could not be prepared'], ['Upload-Start wurde verworfen', 'Upload start was discarded'], ['Ordnerüberwachung fehlgeschlagen', 'Folder monitoring failed'], ['Ordner nicht erreichbar', 'Folder unavailable'], ['Ordnerscan fehlgeschlagen', 'Folder scan failed'], ['Keine Ordnerkonfiguration vorhanden', 'No folder configuration is available'], ['Jobs konnten nicht eindeutig bestätigt werden.', 'Jobs could not be confirmed unambiguously.'], ['Jobs konnten nicht hinzugefügt werden.', 'Jobs could not be added.'], ['Automatische Aufnahme konnte nicht abgeschlossen werden.', 'Automatic admission could not be completed.'], ['Upload läuft bereits.', 'An upload is already running.'], ['Keine startbaren Jobs vorhanden.', 'No startable jobs are available.'], ['Inaktiv', 'Inactive'], ['Ordnerpfad', 'Folder path'], ['Wählen', 'Choose'], ['Dateierweiterungen', 'File extensions'], ['Nur diese', 'Only these'], ['Alle außer', 'All except'], ['Verzögerung (Sekunden)', 'Delay (seconds)'], ['Warten bis Datei fertig geschrieben', 'Wait until the file has finished writing'], ['Verhalten', 'Behavior'], ['Aktiviert', 'Enabled'], ['Unterordner einbeziehen', 'Include subfolders'], ['Vorhandene Dateien einmalig einlesen', 'Import existing files once'], ['Duplikate überspringen', 'Skip duplicates'], ['Auto-Upload starten', 'Start uploads automatically'], ['Hoster-Vorauswahl', 'Host preselection'], ['Startet die Überwachung nach dem Speichern, wenn ein Ordner ausgewählt ist.', 'Starts monitoring after saving when a folder is selected.'], ['Überwacht zusätzlich alle Unterordner des ausgewählten Ordners.', 'Also monitors every subfolder inside the selected folder.'], ['Fügt beim nächsten Start der Überwachung alle bereits vorhandenen passenden Dateien hinzu. Die Option wird danach automatisch deaktiviert.', 'Adds all matching files already present when monitoring starts next. The option is then disabled automatically.'], ['Ignoriert wiederholte Erkennungen desselben Dateipfads während der aktuellen Überwachung.', 'Ignores repeated detections of the same file path during the current monitoring session.'], ['Startet neu erkannte Dateien automatisch. Ohne diese Option werden sie nur zur Warteschlange hinzugefügt.', 'Starts newly detected files automatically. Without this option, they are only added to the queue.'], ['Legt die Upload-Ziele für Dateien aus der Ordnerüberwachung fest. Ohne Auswahl ist eine manuelle Bestätigung erforderlich.', 'Sets the upload destinations for files from folder monitoring. Without a selection, manual confirmation is required.'], ['Erst Accounts anlegen, dann hier auswählen.', 'Add accounts first, then select them here.'], ['Keine Vorauswahl = manuelle Hoster-Auswahl für neu erkannte Dateien.', 'No preselection means manually choosing hosts for newly detected files.'], ['Meldungen nach einem abgeschlossenen Upload-Batch versenden.', 'Send notifications after a completed upload batch.'], ['Webhook-Adresse', 'Webhook URL'], ['Test senden', 'Send test'], ['Nach Batch-Ende wird eine Zusammenfassung versendet. Discord wird automatisch erkannt, andere Ziele erhalten JSON.', 'A summary is sent after the batch ends. Discord is detected automatically; other destinations receive JSON.'], ['Discord-Erwähnung', 'Discord mention'], ['Optional · leer lassen, wenn die Nachricht ohne Ping gesendet werden soll', 'Optional · leave blank to send the message without a ping'], ['Protokollierung verwalten, Log-Dateien öffnen und ein bereinigtes Support-Paket erstellen.', 'Manage logging, open log files, and create a sanitized support package.'], ['Ordner wählen', 'Choose folder'], ['Öffnen', 'Open'], ['Log-Datei-Modus', 'Log file mode'], ['Eine Datei', 'Single file'], ['Pro Tag', 'Per day'], ['Pro Session', 'Per session'], ['Pro Session = neue Datei bei jedem App-Start; nach komplettem Schließen + erneutem Öffnen beginnt eine neue Session.', 'Per session = a new file on every application start; a new session begins after fully closing and reopening the application.'], ['DEBUG-Einträge in debug.log schreiben (Performance ↓, Diagnostik ↑)', 'Write DEBUG entries to debug.log (performance ↓, diagnostics ↑)'], ['Diagnose', 'Diagnostics'], ['Log-Dateien', 'Log files'], ['Wird geladen…', 'Loading…'], ['Zeigen', 'Show'], ['Im Explorer zeigen', 'Show in File Explorer'], ['Support-Paket', 'Support package'], ['Eine .txt mit Logs + sanitierter Config; Passwörter/API-Keys werden vor dem Speichern maskiert.', 'A .txt containing logs and sanitized configuration; passwords and API keys are masked before saving.'], ['Upload-Funktionen über einen verbundenen Client steuern.', 'Control upload features through a connected client.'], ['Server', 'Server'], ['Eingaben erlauben', 'Allow input'], ['Kopieren', 'Copy'], ['Neu', 'New'], ['Prüfe...', 'Checking...'], ['Prüfe…', 'Checking…'], ['Zeitlich kontrollierter Lesezugriff für Fehleranalyse und Support.', 'Time-limited read access for troubleshooting and support.'], ['Diagnose-Zugriff (nur lesen)', 'Diagnostics access (read-only)'], ['Zugriff auf Logs, Queue-Status und bereinigte Einstellungen. Passwörter, API-Keys und Tokens werden maskiert.', 'Access to logs, queue status, and sanitized settings. Passwords, API keys, and tokens are masked.'], ['Der Verbindungs-Code ist ein Zugangsschlüssel — nur mit vertrauenswürdigen Stellen teilen; bei Verdacht „Neu" klicken. Standard-Bindung ist', 'The connection code is an access key. Share it only with trusted parties and click “New” if you suspect misuse. The default binding is'], ['und damit nur über einen SSH- oder VPN-Tunnel erreichbar.', 'and is therefore reachable only through an SSH or VPN tunnel.'], ['Im Netzwerk (0.0.0.0) — Allowlist nötig', 'On the network (0.0.0.0) — allowlist required'], ['Adresse für den Code', 'Address for the code'], ['Verbindungs-Code', 'Connection code'], ['. Fernzugriff nur über einen Tunnel (z.B. Tailscale/SSH) — die sicherste Variante.', '. Remote access is available only through a tunnel such as Tailscale or SSH, which is the safest option.'], ['Accounts und Einstellungen sichern oder auf ein anderes Gerät übernehmen.', 'Back up accounts and settings or transfer them to another device.'], ['Der Upload-Verlauf wird nicht übertragen und bleibt auf diesem Gerät.', 'Upload history is not transferred and remains on this device.'], ['Verschlüsseltes Online-Backup', 'Encrypted online backup'], ['Die Verschlüsselung findet ausschließlich auf diesem Gerät statt. Der Server speichert nur verschlüsselte Daten.', 'Encryption takes place only on this device. The server stores encrypted data only.'], ['Neuen Schlüssel erzeugen', 'Generate new key'], ['Auf diesem Gerät erstellt', 'Created on this device'], ['Noch keine Schlüssel auf diesem Gerät erstellt.', 'No keys have been created on this device yet.'], ['Schlüssel kopieren', 'Copy key'], ['Online-Backup löschen', 'Delete online backup'], ['Online-Backup', 'Online backup'], ['Online-Backups verwalten', 'Manage online backups'], ['Dieses verschlüsselte Online-Backup wird dauerhaft vom Server gelöscht.', 'This encrypted online backup will be permanently deleted from the server.'], ['Schlüssel gelöscht', 'Key deleted'], ['Erneut laden', 'Reload'], ['Jeder Export erzeugt einen neuen Schlüssel. Ältere Schlüssel bleiben gültig.', 'Each export creates a new key. Older keys remain valid.'], ['Dein neuer Schlüssel', 'Your new key'], ['Neuer Schlüssel', 'Your new key'], ['Vorhandenen Schlüssel importieren', 'Import existing key'], ['Schlüssel importieren', 'Import existing key'], ['Online importieren', 'Import online'], ['Behandle den Schlüssel wie ein Passwort. Wer ihn besitzt, kann die verschlüsselten Einstellungen entschlüsseln.', 'Treat the key like a password. Anyone who has it can decrypt the encrypted settings.'], ['Lokales Datei-Backup', 'Local file backup'], ['Mit eigenem Passwort schützen', 'Protect with your own password'], ['Ohne dieses Passwort kann das Backup nicht importiert werden.', 'The backup cannot be imported without this password.'], ['Passwort (mindestens 8 Zeichen)', 'Password (at least 8 characters)'], ['Passwort wiederholen', 'Repeat password'], ['Das Backup-Passwort muss mindestens 8 Zeichen lang sein.', 'The backup password must be at least 8 characters long.'], ['Die beiden Backup-Passwörter stimmen nicht überein.', 'The two backup passwords do not match.'], ['Passwort prüfen', 'Check password'], ['Datei exportieren', 'Export file'], ['Datei importieren', 'Import file'], ['Alle Uploads', 'All uploads'], ['Erfolgreich', 'Successful'], ['Ergebnis', 'Result'], ['Aktive Regel', 'Active rule'], ['Alles behalten', 'Keep everything'], ['Links wiederfinden, kopieren oder als Datei exportieren.', 'Find links, copy them, or export them as a file.'], ['Upload-Verlauf', 'Upload history'], ['Verlauf exportieren', 'Export history'], ['Verlauf löschen', 'Delete history'], ['Verlauf löschen?', 'Delete history?'], ['Alle Verlaufseinträge werden dauerhaft gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.', 'All history entries will be permanently deleted. This action cannot be undone.'], ['Ausgewählte starten', 'Start selected'], ['Upload-Ziele auswählen', 'Choose upload destinations'], ['Dateien wurden hinzugefügt. Wähle jetzt die Hoster für den Upload.', 'Files were added. Now choose the hosts for the upload.'], ['Alle', 'All'], ['Keine', 'None'], ['Keine Hoster mit Zugangsdaten vorhanden. Bitte zuerst in den Accounts einen Login oder API-Key hinterlegen.', 'No hosts with credentials are available. Add a login or API key under Accounts first.'], ['Keine Hoster mit Zugangsdaten für einen Check.', 'No hosts with credentials are available for a check.'], ['Die Auswahl wird für neue Queue-Einträge verwendet.', 'The selection is used for new queue entries.'], ['Nach Aktualisierungen suchen', 'Check for updates'], ['Anwendungsmenüs', 'Application menus'], ['Parallele Uploads erhöhen', 'Increase parallel uploads'], ['Geschwindigkeitslimit aktivieren', 'Enable speed limit'], ['Geschwindigkeitslimit in Megabyte pro Sekunde', 'Speed limit in megabytes per second'], ['Geschwindigkeitslimit erhöhen', 'Increase speed limit'], ['Geschwindigkeitslimit verringern', 'Decrease speed limit'], ['Hilfe und Support', 'Help and support'], ['Update-Fortschritt', 'Update progress'], ['Alle Dateien anzeigen', 'Show all files'], ['Aktive Uploads anzeigen', 'Show active uploads'], ['Wartende Uploads anzeigen', 'Show queued uploads'], ['Fertige Uploads anzeigen', 'Show completed uploads'], ['Fehlgeschlagene Uploads anzeigen', 'Show failed uploads'], ['Übersprungene Uploads anzeigen', 'Show skipped uploads'], ['Alle Uploads starten', 'Start all uploads'], ['Ausgewählte Uploads starten', 'Start selected uploads'], ['Ausgewählte Datei erneut hochladen', 'Upload selected file again'], ['Ausgewählten Upload abbrechen', 'Cancel selected upload'], ['Aktive Uploads beenden und stoppen', 'Stop active uploads'], ['Alle Uploads abbrechen', 'Cancel all uploads'], ['Nach oben', 'Move up'], ['Nach unten', 'Move down'], ['Alle Zeilen als Datei exportieren (Zeit, Hoster, Link, Dateiname)', 'Export all rows as a file (time, host, link, file name)'], ['Alle Links aus diesem Panel entfernen', 'Remove all links from this panel'], ['Alle Accounts anzeigen', 'Show all accounts'], ['Bereite Accounts anzeigen', 'Show ready accounts'], ['Fehlerhafte Accounts anzeigen', 'Show accounts with errors'], ['Einstellungen durchsuchen', 'Search settings'], ['Ordner wählen...', 'Choose folder...'], ['Standardpfad verwenden', 'Use default path'], ['Log-Ordner im Explorer öffnen', 'Open log folder in File Explorer'], ['Sammelt alle Logs + sanitierte Config (Credentials maskiert) + App-Versionen in eine einzelne .txt-Datei zum Teilen.', 'Collects all logs, sanitized configuration with masked credentials, and application versions in a single shareable .txt file.'], ['Neu generieren', 'Generate new'], ['Neu generieren (macht alte Codes ungültig)', 'Generate new (invalidates old codes)'], ['Nach dem Export erscheint hier der 75-stellige Schlüssel', 'The 75-character key appears here after export'], ['Verlaufsübersicht', 'History overview'], ['Verlaufsstatus', 'History status'], ['Gesamten Verlauf anzeigen', 'Show all history'], ['Erfolgreiche Uploads anzeigen', 'Show successful uploads'], ['Fehlgeschlagene Uploads anzeigen', 'Show failed uploads'], ['Gespeichert!', 'Saved!'], ['Speichert…', 'Saving…'], ['Changelog', 'Changelog'], ['— bitte Diagnose-Paket exportieren oder Programm neu starten.', '— please export a diagnostics package or restart the application.'], ['• Bereit', '• Ready'], ['• Fehler', '• Failed'], ['', ''], ['Noch keine Uploads.', 'No uploads yet.'], ['Pfade nicht verfügbar.', 'Paths unavailable.'], ['Noch keine Uploads in dieser Session.', 'No uploads in this session yet.'], ['Account bearbeiten', 'Edit account'], ['Account nicht mehr in der Config — wurde extern gelöscht. Modal schließen und neu anlegen.', 'The account is no longer in the configuration because it was deleted externally. Close the dialog and add it again.'], ['Account wurde erfolgreich geprüft und gespeichert.', 'Account verified and saved successfully.'], ['Account wurde mit Warnung geprüft und gespeichert.', 'Account verified and saved with a warning.'], ['Account-Check läuft bereits.', 'An account check is already running.'], ['Account-Löschung konnte nicht persistiert werden — bitte erneut versuchen.', 'The account deletion could not be saved. Please try again.'], ['Account-Übersicht', 'Account overview'], ['Account wurde diese Session als fehlerhaft markiert. Klick = Wieder als aktiv markieren.', 'The account was marked as failed for this session. Click to reactivate it.'], ['Pausiert (Session)', 'Paused (session)'], ['Pausiert – noch', 'Paused –'], ['Pausiert – Aktion nötig', 'Paused – action required'], ['Account automatisch wieder aktiv', 'Account automatically active again'], ['Account wieder aktiv – nächste Batch verwendet ihn', 'Account active again – the next batch will use it'], ['Wieder aktivieren', 'Reactivate'], ['Accounts mit Handlungsbedarf anzeigen', 'Show accounts requiring action'], ['Alle Accounts und Einstellungen wurden übernommen.', 'All accounts and settings were applied.'], ['Anwendung neu starten?', 'Restart application?'], ['API-Key anzeigen', 'Show API key'], ['Automatisch gespeichert', 'Saved automatically'], ['Beenden', 'Quit'], ['Bekanntes Größen-Limit', 'Known size limit'], ['Backup nicht entschlüsselbar', 'Backup could not be decrypted'], ['Bitte mindestens einen Hoster auswählen.', 'Select at least one host.'], ['CSRF token nicht gefunden', 'CSRF token not found'], ['Deaktiviert', 'Disabled'], ['Der Schlüssel muss exakt 75 Zeichen lang sein.', 'The key must be exactly 75 characters long.'], ['Der Schlüssel muss mit MHU2- beginnen und exakt 75 Zeichen lang sein.', 'The key must start with MHU2- and be exactly 75 characters long.'], ['Diagnose-Paket wird erstellt…', 'Creating diagnostics package…'], ['Die Anwendung konnte nach dem fehlgeschlagenen Speichern nicht entsperrt werden', 'The application could not be unlocked after saving failed'], ['Die Anwendung wird gerade beendet', 'The application is shutting down'], ['Download wird geprüft…', 'Verifying download…'], ['Download wird vorbereitet…', 'Preparing download…'], ['Ein Einstellungsimport läuft bereits', 'A settings import is already running'], ['Einstellungen konnten vor dem Beenden nicht gespeichert werden', 'Settings could not be saved before quitting'], ['Einstellungen werden gerade importiert', 'Settings are being imported'], ['Einstellungen werden gespeichert…', 'Saving settings…'], ['Einstellungen wurden durch einen Import ersetzt', 'Settings were replaced by an import'], ['Ganz nach oben', 'Move to top'], ['Ganz nach unten', 'Move to bottom'], ['Hoster entfernen ▸', 'Remove host ▸'], ['Kein gültiger Account', 'No valid account'], ['Kein Update verfügbar', 'No update available'], ['Kein Upload aktiv', 'No active upload'], ['Kein Verlauf zum Exportieren vorhanden.', 'There is no history to export.'], ['Keine Antwort vom Hoster erhalten', 'No response received from the host'], ['Keine Einträge im Log gefunden', 'No log entries found'], ['Keine Einträge zum Exportieren.', 'No entries to export.'], ['Keine Jobs hinzugefuegt', 'No jobs added'], ['Keine Log-Einträge für diesen Job (entweder noch nichts passiert oder aus vorherigem Batch und schon geräumt).', 'No log entries for this job. Nothing has happened yet, or entries from a previous batch were already cleared.'], ['Keine passenden Jobs für Retry gefunden.', 'No matching jobs found for retry.'], ['Keine startbaren Jobs ausgewählt (alle laufen schon oder sind fertig).', 'No startable jobs selected because all are already running or completed.'], ['Keine transienten Fehler', 'No transient errors'], ['Keine URL eingetragen.', 'No URL entered.'], ['Keine Zugangsdaten', 'No credentials'], ['Lade und entschlüssele Einstellungen…', 'Loading and decrypting settings…'], ['Link kopieren', 'Copy link'], ['Links kopieren', 'Copy links'], ['Log anzeigen', 'Show log'], ['Log importieren', 'Import log'], ['Log importieren — bereits hochgeladene aus Queue entfernen', 'Import log — remove already uploaded jobs from queue'], ['Log-Datei', 'Log file'], ['MB/s · 0 = unbegrenzt', 'MB/s · 0 = unlimited'], ['Log-Pfad automatisch auf funktionierenden Ordner gesetzt', 'Log path automatically changed to a writable folder'], ['Neuer Schlüssel erstellt.', 'New key created.'], ['Nicht alle Einstellungen konnten gespeichert werden', 'Not all settings could be saved'], ['Online-Schlüssel kopiert', 'Online key copied'], ['Online-Sicherung konnte nicht erstellt werden', 'Online backup could not be created'], ['Online-Sicherungen konnten nicht geladen werden', 'Online backups could not be loaded'], ['Online-Sicherung konnte nicht kopiert werden', 'Online backup could not be copied'], ['Online-Sicherung konnte nicht importiert werden', 'Online backup could not be imported'], ['OTP wird geprüft…', 'Checking OTP…'], ['OTP-Prüfung fehlgeschlagen', 'OTP check failed'], ['Passwort anzeigen', 'Show password'], ['Prüfe Zugangsdaten…', 'Checking credentials…'], ['Prüfen…', 'Checking…'], ['Prüfung fehlgeschlagen', 'Check failed'], ['Prüfung oder Speichern fehlgeschlagen', 'Check or save failed'], ['Einstellungen konnten vor dem Update nicht gespeichert werden', 'Settings could not be saved before the update'], ['Das Update wurde nicht gestartet, weil die Einstellungen vor dem Beenden nicht gespeichert werden konnten', 'The update was not started because the settings could not be saved before quitting'], ['Login ok, Upload-Seite bereit', 'Login successful, upload page ready'], ['Login oder API Key fehlt', 'Login or API key is missing'], ['Account-Check lieferte kein gültiges JSON', 'Account check did not return valid JSON'], ['Account-Check fehlgeschlagen', 'Account check failed'], ['Upload-Server-Check lieferte kein gültiges JSON', 'Upload server check did not return valid JSON'], ['API Key gültig, Upload-Server verfügbar', 'API key is valid, upload server available'], ['API Key gültig, aktuell kein Server von API (Uploader nutzt Fallback)', 'API key is valid, but the API currently provides no server (the uploader uses a fallback)'], ['API Key gültig, Upload-Server aktuell nicht geliefert', 'API key is valid, but the API currently provides no upload server'], ['Username oder Passwort fehlt', 'Username or password is missing'], ['Upload-URL wurde nicht erkannt', 'Upload URL was not recognized'], ['API Key gültig, aktuell kein Server verfügbar', 'API key is valid, but no server is currently available'], ['API Key ungültig oder Server nicht erreichbar', 'API key is invalid or the server is unreachable'], ['Login ok, aber Upload-Seite liefert kein CSRF-Token', 'Login successful, but the upload page did not provide a CSRF token'], ['API Key fehlt', 'API key is missing'], ['API lieferte kein gültiges JSON', 'API did not return valid JSON'], ['API Key gültig', 'API key is valid'], ['Clouddrop Auth fehlgeschlagen', 'Clouddrop authentication failed'], ['Account-ID fehlt im Check-Payload', 'Account ID is missing from the check payload'], ['Kein Health-Check für diesen Hoster', 'No health check is available for this host'], ['Health-Check fehlgeschlagen', 'Health check failed'], ['Hoster fehlt', 'Host is missing'], ['Validierung fehlgeschlagen', 'Validation failed'], ['Ein Upload wird bereits ausgeführt oder abgeschlossen', 'An upload is already running or completed'], ['Kein gültiger Account für diesen Hoster', 'No valid account is available for this host'], ['Keine gültigen Zugangsdaten für die gewählten Hoster.', 'No valid credentials are available for the selected hosts.'], ['Unbekannter Fehler', 'Unknown error'], ['Kein Log-Pfad gefunden', 'No log path was found'], ['Ungültige URL (muss mit http(s):// beginnen)', 'Invalid URL (must start with http(s)://)'], ['Backup-Datei ist zu groß oder ungültig', 'The backup file is too large or invalid'], ['Ungültiges Backup-Format', 'Invalid backup format'], ['Keine gültige .mhu Backup-Datei', 'Not a valid .mhu backup file'], ['Falsches Passwort oder beschädigte Datei', 'Incorrect password or damaged file'], ['Dieses Backup wurde mit einem Passwort verschlüsselt', 'This backup was encrypted with a password'], ['Das Backup-Passwort darf nicht leer sein', 'The backup password must not be empty'], ['Das Backup-Passwort muss zwischen 8 und 1024 Zeichen lang sein', 'The backup password must be between 8 and 1024 characters long'], ['Passwortgeschützte Backups müssen als .mhu gespeichert werden', 'Password-protected backups must be saved as .mhu files'], ['Sicherer Zugangsdaten-Speicher ist nicht verfügbar', 'Secure credential storage is unavailable'], ['Zugangsdaten konnten nicht sicher verschlüsselt werden', 'Credentials could not be encrypted securely'], ['Gespeicherte Zugangsdaten konnten nicht entschlüsselt werden', 'Stored credentials could not be decrypted'], ['Zugangsdaten gesperrt', 'Credentials locked'], ['Die Verlaufsdatei ist beschädigt und wurde nicht verändert', 'The history file is damaged and was not changed'], ['Verlauf und Aufbewahrung konnten nicht konsistent gespeichert werden', 'History and retention could not be saved consistently'], ['Kein Ordnerpfad angegeben', 'No folder path was provided'], ['Clouddrop: Datei ist leer', 'Clouddrop: The file is empty'], ['Clouddrop: Keine fileId in Upload-Antwort', 'Clouddrop: No fileId in the upload response'], ['Clouddrop: Keine sessionId von /upload/init', 'Clouddrop: No sessionId from /upload/init'], ['Doodstream: sess_id nicht gefunden nach Login', 'Doodstream: sess_id was not found after login'], ['Kein Upload-Server erhalten. API-Key prüfen.', 'No upload server was returned. Check the API key.'], ['Online-Sicherung enthält keine gültigen Einstellungen', 'The online backup does not contain valid settings'], ['Online-Sicherungen benötigen eine sichere HTTPS-Verbindung', 'Online backups require a secure HTTPS connection'], ['Online-Sicherungsdienst antwortet nicht', 'The online backup service is not responding'], ['Online-Sicherungsdienst ist nicht erreichbar', 'The online backup service is unavailable'], ['Antwort des Online-Sicherungsdienstes ist zu groß', 'The response from the online backup service is too large'], ['Online-Sicherungsschlüssel ist beschädigt', 'The online backup key is damaged'], ['Einstellungen sind für eine Online-Sicherung zu groß', 'The settings are too large for an online backup'], ['Online-Sicherung ist beschädigt', 'The online backup is damaged'], ['Online-Sicherung konnte nicht entschlüsselt werden oder ist beschädigt', 'The online backup could not be decrypted or is damaged'], ['Online-Sicherung konnte nicht gespeichert werden', 'Online backup could not be saved'], ['Online-Sicherung wurde nicht gefunden', 'Online backup was not found'], ['Online-Sicherung konnte nicht geladen werden', 'Online backup could not be loaded'], ['Online-Sicherungsdienst hat ungültige Daten geliefert', 'The online backup service returned invalid data'], ['Online-Sicherung konnte nicht gelöscht werden', 'Online backup could not be deleted'], ['Online-Sicherungsanfrage wurde abgewiesen', 'Online backup request was rejected'], ['Online-Sicherungs-ID ist ungültig', 'Online backup ID is invalid'], ['Ungültiger Erstellungszeitpunkt', 'Invalid creation timestamp'], ['Gespeicherter Online-Schlüsselbund ist ungültig', 'Stored online keyring is invalid'], ['Gespeicherter Online-Schlüsselbund ist beschädigt', 'Stored online keyring is damaged'], ['Sichere Schlüsselspeicherung ist nicht verfügbar', 'Secure key storage is unavailable'], ['Gespeicherter Online-Sicherungsschlüssel konnte nicht entschlüsselt werden', 'Stored online backup key could not be decrypted'], ['Gespeicherte Online-Sicherungskennung stimmt nicht mit dem Schlüssel überein', 'Stored online backup ID does not match its key'], ['Gespeicherte Online-Sicherungskennung ist mehrdeutig', 'Stored online backup ID is ambiguous'], ['Online-Schlüsselbund wurde aus einer Wiederherstellungsdatei geladen', 'Online keyring was loaded from a recovery file'], ['Online-Sicherung konnte lokal nicht eindeutig entfernt werden', 'Online backup could not be removed from this device unambiguously'], ['Online-Sicherungsschlüssel konnte nicht sicher vorbereitet werden', 'Online backup key could not be prepared securely'], ['Geschützter Schlüssel', 'Protected key'], ['Backup hat eine ungültige Struktur', 'The backup has an invalid structure'], ['Einstellungen werden bereits importiert', 'Settings are already being imported'], ['Während laufender Uploads können keine Einstellungen importiert werden', 'Settings cannot be imported while uploads are running'], ['Online-Sicherungsschlüssel ist ungültig', 'The online backup key is invalid'], ['Ein Update wird bereits vorbereitet', 'An update is already being prepared'], ['Die Anwendung ist noch nicht bereit, das Update sicher zu installieren', 'The application is not yet ready to install the update safely'], ['Update abgebrochen', 'Update canceled'], ['Download abbrechen', 'Cancel download'], ['Abbrechen…', 'Cancelling…'], ['Download abgebrochen', 'Download canceled'], ['Wiederholen', 'Retry'], ['Update konnte nicht abgebrochen werden', 'The update could not be canceled'], ['Update-Asset unvollständig (URL oder Name fehlt)', 'The update asset is incomplete (URL or name is missing)'], ['Heruntergeladene Datei ist keine gültige EXE', 'The downloaded file is not a valid EXE'], ['SHA-512 Prüfung fehlgeschlagen', 'SHA-512 verification failed'], ['Vorbereitetes Update ist unvollständig', 'The prepared update is incomplete'], ['Kein Setup-Asset im Release gefunden', 'No setup asset was found in the release'], ['Prüfsummen-Metadaten fehlen', 'Checksum metadata is missing'], ['Prüfsummen-Metadaten sind unvollständig', 'Checksum metadata is incomplete'], ['Prüfsummen-Metadaten enthalten keine gültige SHA-512-Prüfsumme', 'Checksum metadata does not contain a valid SHA-512 checksum'], ['Prüfsummen-Metadaten gehören zu einer anderen Version', 'Checksum metadata belongs to a different version'], ['Prüfsummen-Metadaten gehören nicht zum ausgewählten Installer', 'Checksum metadata does not belong to the selected installer'], ['Prüfsummen-Metadaten enthalten eine abweichende Dateigröße', 'Checksum metadata contains a different file size'], ['Heruntergeladene Datei hat eine abweichende Größe', 'The downloaded file has a different size'], ['Die installierte Anwendung ist nicht gültig digital signiert', 'The installed application is not validly digitally signed'], ['Download hängt — seit 45 s keine Daten (Netzwerk/Server überlastet). Bitte laufende Uploads stoppen und erneut versuchen.', 'The download stalled because no data was received for 45 seconds. Stop active uploads and try again.'], ['Datei nicht gefunden', 'File not found'], ['Netzwerkfehler', 'Network error'], ['Warteschlange angehalten', 'Queue paused'], ['Bekanntes Größen-Limit auf diesem Account (frühere verdächtige Ablehnung)', 'Known size limit on this account (previous suspicious rejection)'], ['Ablehnung verdächtig - Versuch auf anderem Account', 'Suspicious rejection - trying another account'], ['Vidmoly: /api/upload/config lieferte kein JSON — evtl. nicht eingeloggt?', 'Vidmoly: /api/upload/config did not return JSON — you may not be signed in'], ['Vidmoly: /api/upload/config unvollständig (sess_id/upload_url fehlt)', 'Vidmoly: /api/upload/config is incomplete (sess_id/upload_url is missing)'], ['Vidmoly VM API lieferte kein JSON', 'The Vidmoly VM API did not return JSON'], ['VOE Login: CSRF-Token nicht gefunden', 'VOE login: CSRF token not found'], ['VOE Upload: CSRF-Token nicht gefunden. Bist du eingeloggt?', 'VOE upload: CSRF token not found. Are you signed in?'], ['VOE: Kein Upload-Server erhalten von delivery-node', 'VOE: No upload server was returned by delivery-node'], ['VOE Upload: Kein file_code in der Antwort gefunden', 'VOE upload: No file_code was found in the response'], ['Nicht gespeicherte laufende Aktionen werden beendet.', 'Unsaved running actions will be stopped.'], ['Ausgewählte Einträge entfernen?', 'Remove selected entries?'], ['Export fehlgeschlagen', 'Export failed'], ['Backup exportiert', 'Backup exported'], ['Online-Backup importiert', 'Online backup imported'], ['Passwort', 'Password'], ['Backup importiert', 'Backup imported'], ['Import fehlgeschlagen', 'Import failed'], ['Upload-Start fehlgeschlagen', 'Failed to start upload'], ['erneut versuchbar', 'retryable'], ['manuell', 'manual'], ['Abgebrochen.', 'Canceled.'], ['API-Token neu erzeugen?', 'Generate a new API token?'], ['Der bisherige Token wird sofort ungültig. Verbundene Clients müssen den neuen Token verwenden.', 'The current token will become invalid immediately. Connected clients must use the new token.'], ['Neu erzeugen', 'Generate new'], ['Verbindungs-Code neu erzeugen?', 'Generate a new connection code?'], ['Der bisherige Diagnose-Code wird sofort ungültig.', 'The current diagnostics code will become invalid immediately.'], ['Aktivieren', 'Enable'], ['Bitte den OTP-Code eingeben.', 'Enter the OTP code.'], ['Login fehlgeschlagen', 'Login failed'], ['Aufbewahrung ändern?', 'Change retention?'], ['Update fehlgeschlagen', 'Update failed'], ['Speichere aktuelle Einstellungen…', 'Saving current settings…'], ['Speichern vor dem Beenden hat zu lange gedauert', 'Saving before quitting took too long'], ['Stoppt nach aktiven Uploads...', 'Stopping after active uploads...'], ['Suche nach Aktualisierungen…', 'Checking for updates…'], ['System wird heruntergefahren in', 'System will shut down in'], ['Übernehmen', 'Apply'], ['Übersprungen', 'Skipped'], ['Ungespeicherte Änderungen', 'Unsaved changes'], ['Update installiert. Die Anwendung startet neu…', 'Update installed. The application is restarting…'], ['Update konnte nicht gestartet werden', 'Update could not be started'], ['Update verfügbar', 'Update available'], ['Update ist bereit. Einstellungen werden gespeichert…', 'The update is ready. Saving settings…'], ['Update wird installiert. Die Anwendung startet neu…', 'Installing update. The application is restarting…'], ['Updateprüfung fehlgeschlagen', 'Update check failed'], ['Upload läuft...', 'Uploading...'], ['Upload-Log', 'Upload log'], ['Automatik-Abschlussnachweis konnte nicht gespeichert werden', 'Automation completion evidence could not be saved'], ['Lokale Speicherung', 'Local persistence'], ['Automatik-Abschlussdatei ist ungültig', 'Automation completion file is invalid'], ['Automatik-Abschlussdatei enthält zu viele Einträge', 'Automation completion file contains too many entries'], ['Automatik-Abschlussnachweise sind ungültig', 'Automation completion evidence is invalid'], ['Abschlussnachweise konnten nicht gespeichert werden.', 'Completion evidence could not be saved.'], ['Abschlussnachweise konnten nicht vollständig ermittelt werden.', 'Completion evidence could not be determined completely.'], ['Automatische Wiederaufnahme wurde wegen nicht verfügbarer Abschlussnachweise blockiert.', 'Automatic resume was blocked because completion evidence is unavailable.'], ['Upload-Log-Verzeichnis enthält zu viele Einträge', 'Upload log directory contains too many entries'], ['Zu viele verwaltete Upload-Logs', 'Too many managed upload logs'], ['Upload-Logs überschreiten das Leselimit', 'Upload logs exceed the read limit'], ['Upload-Log überschreitet das Leselimit', 'Upload log exceeds the read limit'], ['Upload-Log enthält zu viele eindeutige Einträge', 'Upload log contains too many unique entries'], ['Upload-Log-Stream ist nicht verfügbar', 'Upload log stream is unavailable'], ['Upload-Log-Zeile ist zu lang', 'Upload log line is too long'], ['Upload-Status', 'Upload status'], ['Upload-Übersicht', 'Upload overview'], ['Verlauf als CSV exportieren?\n\nOK = CSV\nAbbrechen = JSON', 'Export history as CSV?\n\nOK = CSV\nCancel = JSON'], ['Verlauf wirklich löschen?', 'Are you sure you want to delete the history?'], ['Verschlüssele und speichere Einstellungen…', 'Encrypting and saving settings…'], ['Zeit', 'Time'], ['Wenn das Backup mit der alten Passwort-Option (vor v3.0) erstellt wurde, hier eingeben.', 'If the backup was created with the legacy password option before v3.0, enter it here.'], ['Wartet', 'Waiting'], ['Abgebrochen', 'Canceled'], ['Fehlgeschlagen', 'Failed'], ['Fehlgeschlagen: Verbindung verloren', 'Failed: Connection lost'], ['Retry 2/3 · Primär nicht verfügbar', 'Retry 2/3 · Primary unavailable'], ['Link kopiert', 'Link copied'], ['Kopiert!', 'Copied!'], ['Sende…', 'Sending…'], ['Lade…', 'Loading…'], ['Upload-Statistiken', 'Upload statistics'], ['Keine Uploads entsprechen diesem Filter.', 'No uploads match this filter.'], ['Keine Accounts entsprechen diesem Filter.', 'No accounts match this filter.'], ['Keine Verlaufseinträge entsprechen diesem Filter.', 'No history entries match this filter.'], ['Verlauf konnte nicht geladen werden.', 'History could not be loaded.'], ['Wähle das Dateiformat für den Export.', 'Choose the file format for the export.'], ['CSV exportieren', 'Export CSV'], ['JSON exportieren', 'Export JSON'], ['Bestätigen', 'Confirm'], ['Alle Links entfernen?', 'Remove all links?'], ['Uploads entfernen?', 'Remove uploads?'], ['Alle Uploads entfernen?', 'Remove all uploads?'], ['Alle Uploads abbrechen?', 'Cancel all uploads?'], ['Alle laufenden Uploads werden abgebrochen und in die Warteschlange zurückgesetzt.', 'All running uploads will be canceled and returned to the queue.'], ['Alle abbrechen', 'Cancel all'], ['Hoster entfernen?', 'Remove host?'], ['Unbekannt', 'Unknown'], ['Verlauf', 'History'] ]; const deToEn = new Map(pairs); const enToDe = new Map(pairs.map(([de, en]) => [en, de])); function normalizeLanguage(value) { return value === 'de' ? 'de' : 'en'; } function translateText(value, language) { const text = String(value ?? ''); const target = normalizeLanguage(language); const leading = text.match(/^\s*/)?.[0] || ''; const trailing = text.match(/\s*$/)?.[0] || ''; const core = text.slice(leading.length, text.length - trailing.length); const exact = target === 'en' ? deToEn.get(core) : enToDe.get(core); if (exact) return `${leading}${exact}${trailing}`; const patterns = target === 'en' ? [ [/^Update v(.+) verfügbar$/, 'Update v$1 available'], [/^Wiederhergestellte Warteschlange startet in (.+) s \((.+) Jobs\)\.$/, 'Restored queue starts in $1 s ($2 jobs).'], [/^Login ok, Upload-Form bereit \(Dateifeld: (.+)\)$/, 'Login successful, upload form ready (file field: $1)'], [/^Klartext-Backup ist kein gültiges JSON: (.+)$/, 'Plain JSON backup is not valid JSON: $1'], [/^Export fehlgeschlagen: (.+)$/, 'Export failed: $1'], [/^Import fehlgeschlagen: (.+)$/, 'Import failed: $1'], [/^Initialisierung fehlgeschlagen: (.+)$/, 'Initialization failed: $1'], [/^Quelldatei-Schutz konnte nicht vorbereitet werden: (.+)$/, 'Source file protection could not be prepared: $1'], [/^Clouddrop: API-Antwort war kein JSON (.+)$/, 'Clouddrop: API response was not JSON $1'], [/^Clouddrop: Datei nicht lesbar: (.+)$/, 'Clouddrop: File cannot be read: $1'], [/^Doodstream: konnte Upload-Server nicht ermitteln \(Endpoint geändert\?\)\. (.+)$/, 'Doodstream: Could not determine the upload server (endpoint changed?). $1'], [/^Doodstream Upload fehlgeschlagen: (.+)$/, 'Doodstream upload failed: $1'], [/^Doodstream Upload: kein Filecode — Server gab leeren Link zurück (.+)$/, 'Doodstream upload: No file code — the server returned an empty link $1'], [/^Doodstream lehnt Datei ab \(Server-Status: (.+)\)\. CDN=(.+)$/, 'Doodstream rejected the file (server status: $1). CDN=$2'], [/^Doodstream Upload: Redirect-Antwort ungültig \((.+)\)$/, 'Doodstream upload: Invalid redirect response ($1)'], [/^Doodstream Upload: Keine gültige Antwort \(Body: (.+)\)$/, 'Doodstream upload: No valid response (body: $1)'], [/^Upload zu (.+) wurde vom Server abgelehnt\.$/, 'The upload to $1 was rejected by the server.'], [/^Upload zu (.+) lieferte keine file_code-Antwort \(Payload: (.+)\)$/, 'The upload to $1 returned no file_code response (payload: $2)'], [/^Byse lehnte Datei ab: (.+)$/, 'Byse rejected the file: $1'], [/^API-Antwort war kein JSON (.+)$/, 'The API response was not JSON $1'], [/^Kein Upload-Server erhalten: (.+)$/, 'No upload server was returned: $1'], [/^Upload-Antwort von (.+) war kein JSON (.+)$/, 'The upload response from $1 was not JSON $2'], [/^Vidmoly Login fehlgeschlagen: (.+)$/, 'Vidmoly login failed: $1'], [/^Vidmoly Upload abgelehnt: (.+)$/, 'Vidmoly upload rejected: $1'], [/^Vidmoly Upload-Ergebnis: (.+)$/, 'Vidmoly upload result: $1'], [/^VOE Login fehlgeschlagen: (.+)$/, 'VOE login failed: $1'], [/^VOE Upload-Fehler: (.+)$/, 'VOE upload error: $1'], [/^VOE: Upload-Server Antwort war kein JSON: (.+)$/, 'VOE: The upload server response was not JSON: $1'], [/^Download fehlgeschlagen: (.+)$/, 'Download failed: $1'], [/^Prüfsummen-Metadaten konnten nicht geladen werden: (.+)$/, 'Checksum metadata could not be loaded: $1'], [/^Upload zu (.+) wurde nicht bestätigt$/, 'The upload to $1 was not confirmed'], [/^Update-Server Antwort war kein JSON (.+)$/, 'Update server response was not JSON $1'], [/^(\d+) Links kopiert$/, '$1 links copied'], [/^(\d+) Link kopiert$/, '$1 link copied'], [/^Wirklich alle (\d+) Links aus diesem Panel entfernen\?$/, 'Remove all $1 links from this panel?'], [/^Ein ausgewählter Eintrag wird aus diesem Panel entfernt\.$/, 'One selected entry will be removed from this panel.'], [/^(\d+) ausgewählte Einträge werden aus diesem Panel entfernt\.$/, '$1 selected entries will be removed from this panel.'], [/^Ein ausgewählter Upload wird aus der Liste entfernt\.$/, 'One selected upload will be removed from the list.'], [/^(\d+) ausgewählte Uploads werden aus der Liste entfernt\.$/, '$1 selected uploads will be removed from the list.'], [/^(\d+) Upload wird aus der Liste entfernt\.$/, '$1 upload will be removed from the list.'], [/^(\d+) Uploads werden aus der Liste entfernt\.$/, '$1 uploads will be removed from the list.'], [/^(\d+) Upload wird für (.+) entfernt\.$/, '$1 upload for $2 will be removed.'], [/^(\d+) Uploads werden für (.+) entfernt\.$/, '$1 uploads for $2 will be removed.'], [/^Ruhezustand in (\d+)s\.\.\.$/, 'Sleep in $1s...'], [/^Herunterfahren in (\d+)s\.\.\.$/, 'Shut down in $1s...'], [/^Neustart in (\d+)s\.\.\.$/, 'Restart in $1s...'], [/^(\d+) Job zum erneuten Upload zurückgesetzt$/, '$1 job reset for upload'], [/^(\d+) Jobs zum erneuten Upload zurückgesetzt$/, '$1 jobs reset for upload'], [/^(\d+) Verlaufseintrag wird dauerhaft entfernt\.$/, '$1 history entry will be permanently removed.'], [/^(\d+) Verlaufseinträge werden dauerhaft entfernt\.$/, '$1 history entries will be permanently removed.'], [/^Aktives Ziel: (.+)$/, 'Active destination: $1'], [/^Erfolgsrate aus den letzten (\d+) Uploads dieses Hosters$/, 'Success rate across this host\'s last $1 uploads'], [/^(\d+) Fehler$/, '$1 errors'], [/^Gesamt (\d+)$/, 'Total $1'], [/^Verbindungen (\d+)$/, 'Connections $1'], [/^Verbleibend (\d+)$/, 'Remaining $1'], [/^(\d+) deaktiviert$/, '$1 disabled'], [/^(.+) verbergen$/, 'Hide $1'], [/^(.+) anzeigen$/, 'Show $1'], [/^(.+) Account wieder aktiv — nächste Batch verwendet ihn$/, '$1 account reactivated — the next batch will use it'], [/^(.+): Alle Accounts ausgeschöpft$/, '$1: all accounts exhausted'], [/^(.+): Keine weiteren Fallback-Accounts verfügbar$/, '$1: no additional fallback accounts available'], [/^(\d+) Ziele aktiv: (.+)$/, '$1 destinations active: $2'], [/^(\d+) Job\(s\) zum erneuten Upload zurückgesetzt$/, '$1 job(s) reset for upload'], [/^(\d+) bereits hochgeladene Jobs aus Queue entfernt \((\d+) Log-Einträge gelesen\)$/, '$1 already uploaded jobs removed from the queue ($2 log entries read)'], [/^(\d+) Einträge exportiert$/, '$1 entries exported'], [/^(\d+) Verlaufseinträge werden dauerhaft entfernt\.\n\nFortfahren\?$/, '$1 history entries will be permanently removed.\n\nContinue?'], [/^Account "(.+)" wirklich löschen\?$/, 'Are you sure you want to delete account "$1"?'], [/^Aktiv auf (.+) \((.+)\) — (\d+) Client\(s\) — Letzter Zugriff: (.+)$/, 'Active at $1 ($2) — $3 client(s) — Last access: $4'], [/^Aktiv auf Port (\d+) — (\d+) Client\(s\) verbunden$/, 'Active on port $1 — $2 client(s) connected'], [/^Aktiv auf Port (\d+) — 1 Client verbunden$/, 'Active on port $1 — 1 client connected'], [/^Aktiv auf Port (\d+) — (\d+) Clients verbunden$/, 'Active on port $1 — $2 clients connected'], [/^Alle Fehler erneut versuchen \((\d+)\)$/, 'Retry all failed uploads ($1)'], [/^API: (.+)$/, 'API: $1'], [/^Ausgewählte starten \((\d+)\)$/, 'Start selected ($1)'], [/^Auto-Retry Runde (\d+)\/(\d+): (\d+) transiente Fehler werden in (.+) min neu versucht\.$/, 'Auto-retry round $1/$2: $3 transient errors will be retried in $4 min.'], [/^Backup importiert\. Bitte prüfen: (.+)\.$/, 'Backup imported. Please review: $1.'], [/^Code erstellt: (.+)$/, 'Code created: $1'], [/^Diagnose-Paket gespeichert \((.+) KB\)$/, 'Diagnostics package saved ($1 KB)'], [/^Einstellungen übernommen\. Bitte prüfen: (.+)\.$/, 'Settings applied. Please review: $1.'], [/^Entfernen \((\d+)\)$/, 'Remove ($1)'], [/^Fehler (\d+)$/, 'Failed $1'], [/^Fehler: (.+)$/, 'Error: $1'], [/^Fertig (\d+)$/, 'Completed $1'], [/^Fertig:$/, 'Completed:'], [/^Gespeichert: (.+) \((.+) KB\)$/, 'Saved: $1 ($2 KB)'], [/^Import übernommen\. Warteschlange konnte nicht vollständig gespeichert werden: (.+)$/, 'Import applied. The queue could not be saved completely: $1'], [/^Jobs konnten nicht hinzugefügt werden: (.+)$/, 'Jobs could not be added: $1'], [/^Links kopieren \((\d+)\)$/, 'Copy links ($1)'], [/^Log-Pfad nicht beschreibbar — schreibe nach: (.+)$/, 'Log path is not writable — writing to: $1'], [/^Login: (.+)$/, 'Login: $1'], [/^Speichern fehlgeschlagen: (.+)$/, 'Saving failed: $1'], [/^Test erfolgreich gesendet \(HTTP (\d+)\)\.$/, 'Test sent successfully (HTTP $1).'], [/^Übersprungen: (.+)$/, 'Skipped: $1'], [/^Update fehlgeschlagen: (.+)$/, 'Update failed: $1'], [/^Update wird heruntergeladen… (\d+)%$/, 'Downloading update… $1%'], [/^Verlauf exportiert \((\d+) Zeilen\)$/, 'History exported ($1 rows)'], [/^Verlauf gekürzt: (\d+) entfernt$/, 'History trimmed: $1 removed'], [/^Zeige neueste (.+) von (.+) Einträgen\. Der vollständige Verlauf bleibt gespeichert und ist über „Verlauf exportieren“ verfügbar\.$/, 'Showing the newest $1 of $2 entries. The complete history remains saved and is available through “Export history”.'], [/^Wirklich alle (\d+) Links aus diesem Panel entfernen\?$/, 'Remove all $1 links from this panel?'], [/^Zugangsdaten für (.+) bearbeiten und prüfen\.$/, 'Edit and verify credentials for $1.'], [/^Läuft (\d+)$/, 'Running $1'], [/^Fehler (\d+)$/, 'Failed $1'], [/^Update v(.+) verfügbar\. Klicken zum Installieren\.$/, 'Update v$1 available. Click to install.'] ] : [ [/^Update v(.+) available$/, 'Update v$1 verfügbar'], [/^Sleep in (\d+)s\.\.\.$/, 'Ruhezustand in $1s...'], [/^Shut down in (\d+)s\.\.\.$/, 'Herunterfahren in $1s...'], [/^Restart in (\d+)s\.\.\.$/, 'Neustart in $1s...'], [/^(\d+) job reset for upload$/, '$1 Job zum erneuten Upload zurückgesetzt'], [/^(\d+) jobs reset for upload$/, '$1 Jobs zum erneuten Upload zurückgesetzt'], [/^(\d+) history entry will be permanently removed\.$/, '$1 Verlaufseintrag wird dauerhaft entfernt.'], [/^(\d+) history entries will be permanently removed\.$/, '$1 Verlaufseinträge werden dauerhaft entfernt.'], [/^Active on port (\d+) — 1 client connected$/, 'Aktiv auf Port $1 — 1 Client verbunden'], [/^Active on port (\d+) — (\d+) clients connected$/, 'Aktiv auf Port $1 — $2 Clients verbunden'], [/^Active destination: (.+)$/, 'Aktives Ziel: $1'], [/^Success rate across this host's last (\d+) uploads$/, 'Erfolgsrate aus den letzten $1 Uploads dieses Hosters'], [/^Running (\d+)$/, 'Läuft $1'], [/^Failed (\d+)$/, 'Fehler $1'], [/^Update v(.+) available\. Click to install\.$/, 'Update v$1 verfügbar. Klicken zum Installieren.'] ]; for (const [pattern, replacement] of patterns) { if (pattern.test(core)) return `${leading}${core.replace(pattern, replacement)}${trailing}`; } return text; } function createDomLocalizer(documentRef) { const textSources = new WeakMap(); const textRendered = new WeakMap(); const attributeSources = new WeakMap(); const attributes = ['aria-label', 'placeholder', 'title', 'data-tooltip', 'data-empty-label']; let language = 'en'; let observer = null; function renderTextNode(node) { const current = node.nodeValue || ''; if (!textSources.has(node) || current !== textRendered.get(node)) textSources.set(node, current); const source = textSources.get(node); const rendered = language === 'de' ? source : translateText(source, language); textRendered.set(node, rendered); if (current !== rendered) node.nodeValue = rendered; } function renderAttributes(element) { let sources = attributeSources.get(element); if (!sources) { sources = new Map(); attributeSources.set(element, sources); } for (const name of attributes) { if (!element.hasAttribute(name)) continue; const current = element.getAttribute(name) || ''; const known = sources.get(name); if (!known || current !== known.rendered) sources.set(name, { source: current, rendered: current }); const entry = sources.get(name); const rendered = language === 'de' ? entry.source : translateText(entry.source, language); entry.rendered = rendered; if (current !== rendered) element.setAttribute(name, rendered); } } function renderNode(node) { if (!node) return; if (node.nodeType === 3) { renderTextNode(node); return; } if (node.nodeType !== 1 && node.nodeType !== 9 && node.nodeType !== 11) return; if (node.nodeType === 1) renderAttributes(node); const walker = documentRef.createTreeWalker(node, 5); let current = walker.nextNode(); while (current) { if (current.nodeType === 3) renderTextNode(current); else renderAttributes(current); current = walker.nextNode(); } } function setLanguage(value) { language = normalizeLanguage(value); documentRef.documentElement.lang = language; renderNode(documentRef.body || documentRef.documentElement); return language; } function start(value = 'en') { setLanguage(value); if (!observer && documentRef.defaultView?.MutationObserver) { observer = new documentRef.defaultView.MutationObserver(records => { for (const record of records) { if (record.type === 'characterData') renderTextNode(record.target); else if (record.type === 'attributes') renderAttributes(record.target); else record.addedNodes.forEach(renderNode); } }); observer.observe(documentRef.documentElement, { subtree: true, childList: true, characterData: true, attributes: true, attributeFilter: attributes }); } return language; } return { start, setLanguage, translate: renderNode, getLanguage: () => language }; } return { normalizeLanguage, translateText, createDomLocalizer }; });