const UI_TEXT_DE = { appName: 'Twitch VOD Manager', static: { navVods: 'Twitch VODs', navClips: 'Twitch Clips', navCutter: 'Video schneiden', navMerge: 'Videos zusammenfügen', navSettings: 'Einstellungen', queueTitle: 'Warteschlange', retryFailed: 'Wiederholen', retryFailedHint: 'Nur fehlgeschlagene Downloads erneut starten', healthUnknown: 'System: Unbekannt', healthGood: 'System: Stabil', healthWarn: 'System: Warnung', healthBad: 'System: Problem', systemStatus: 'Systemstatus', openSettings: 'Einstellungen öffnen', refreshVods: 'VODs aktualisieren', downloadClip: 'Clip herunterladen', mainNavigationAria: 'Hauptnavigation', workspaceContextAria: 'Arbeitsbereichskontext', vodWorkspaceAria: 'VOD-Arbeitsbereich', clipSectionsAria: 'Clip-Bereiche', cutterSectionsAria: 'Videoschnitt-Bereiche', mergeSectionsAria: 'Zusammenfügen-Bereiche', statisticsSectionsAria: 'Statistik-Bereiche', archiveSectionsAria: 'Archiv-Bereiche', settingsSectionsAria: 'Einstellungsbereiche', cutVideoAction: 'Video schneiden', mergeVideosAction: 'Videos zusammenfügen', errorPrefix: 'Fehler', settingsSearchPlaceholder: 'Einstellungen durchsuchen…', clearQueue: 'Leeren', refresh: 'Aktualisieren', streamerPlaceholder: 'Streamer hinzufügen…', clipsHeading: 'Twitch Clip-Download', clipsInfoTitle: 'Info', clipsInfoText: 'Unterstutzte Formate:\n- https://clips.twitch.tv/ClipName\n- https://www.twitch.tv/streamer/clip/ClipName\n\nClips werden im Download-Ordner unter "Clips/StreamerName/" gespeichert.', cutterSelectTitle: 'Video auswählen', cutterPreviewPlaceholder: 'Video auswählen, um eine Vorschau zu sehen', cutterBrowse: 'Durchsuchen', commandPaletteTitle: 'Befehlspalette', commandPaletteAria: 'Befehlspalette', commandPaletteResultsAria: 'Befehlsergebnisse', commandPaletteOpenHint: 'Öffnen', commandPaletteStreamerHint: 'Streamer', commandPaletteCommands: { vods: { label: 'VODs', keywords: 'vod videos streams' }, clips: { label: 'Clips', keywords: 'clips clip-download' }, cutter: { label: 'Videoschnitt', keywords: 'videoschnitt schneiden cutter' }, merge: { label: 'Videos zusammenfügen', keywords: 'zusammenfügen videos merge' }, stats: { label: 'Statistiken', keywords: 'statistiken stats dashboard' }, archive: { label: 'Archiv', keywords: 'archiv archive' }, settings: { label: 'Einstellungen', keywords: 'einstellungen settings config' } }, commandPaletteSearchPlaceholder: 'Befehl suchen...', commandPaletteHint: 'Auf/Ab zum Navigieren, Enter zum Ausführen, Esc zum Schließen', mergeTitle: 'Videos zusammenfügen', mergeDesc: 'Wähle mehrere Videos aus, um sie zu einem Video zusammenzufügen. Die Reihenfolge kann geändert werden.', mergeAdd: '+ Videos hinzufügen', designTitle: 'Design', themeLabel: 'Theme', themeLight: 'Hell', themeDark: 'Dunkel', themeSystem: 'System', languageLabel: 'Sprache', languageDe: 'Deutsch', languageEn: 'English', apiTitle: 'Twitch API', clientIdLabel: 'Client ID', clientSecretLabel: 'Client Secret', saveSettings: 'Speichern & Verbinden', downloadSettingsTitle: 'Download-Einstellungen', downloadBasicsTitle: 'Download und Qualität', queueAutomationTitle: 'Queue und Automatisierung', recordingMetadataTitle: 'Aufnahmen und Metadaten', storageLabel: 'Speicherort', selectFolder: 'Ordner', openFolder: 'Offnen', modeLabel: 'Download-Modus', modeFull: 'Ganzes VOD', modeParts: 'In Teile splitten', partMinutesLabel: 'Teil-Lange (Minuten)', parallelDownloadsLabel: 'Parallele Downloads', parallelDownloads1: '1 (Standard)', parallelDownloads2: '2 (Parallel)', performanceModeLabel: 'Performance-Profil', performanceModeStability: 'Max Stabilitat', performanceModeBalanced: 'Ausgewogen', performanceModeSpeed: 'Max Geschwindigkeit', smartSchedulerLabel: 'Smart Queue Scheduler aktivieren', smartSchedulerHint: 'Bevorzugt kürzere VODs und ältere Queue-Einträge zuerst, damit der Durchsatz gleichmäßig bleibt. Deaktivieren = strikte Einfügereihenfolge.', sidebarSplitViewLabel: 'Streamer und Queue gleichzeitig anzeigen', sidebarSplitViewHint: 'Teilt die linke Seitenleiste gleichmäßig auf. Deaktiviert erscheinen wieder die Umschaltflächen.', streamerInvalid: 'Twitch-Username ungültig (4-25 Zeichen, Buchstaben/Zahlen/Unterstrich).', apiHelpIntro: 'Du brauchst eine Client-ID und ein Client-Secret von Twitch.', apiHelpLinkText: 'dev.twitch.tv/console/apps', openDebugLogFile: 'Log-Datei öffnen', storageCardTitle: 'Speicher', storageCardIntro: 'Disk-Verbrauch pro Streamer im aktuellen Download-Ordner. Live-Aufnahmen werden separat ausgewiesen.', storageRefresh: 'Aktualisieren', storageEmpty: 'Download-Ordner ist leer oder nicht lesbar.', storageScanning: 'Scanne...', storageSummary: 'Gesamt: {files} Dateien, {size} — Freier Speicher: {free}', storageColumnFolder: 'Ordner', storageColumnFiles: 'Dateien', storageColumnTotal: 'Gesamt', storageColumnLive: 'Live', storageColumnChat: 'Chat', storageColumnActionsAria: 'Aktionen', storageOpen: 'Öffnen', storageOtherFolders: 'Andere Ordner im Download-Pfad', cleanupTitle: 'Auto-Cleanup', cleanupIntro: 'Aufnahmen älter als X Tage in einen Archiv-Ordner verschieben oder löschen. Sidecar-Chat-Dateien (.chat.json/.chat.jsonl) werden mit der Aufnahme bewegt.', cleanupEnabledLabel: 'Auto-Cleanup aktivieren', cleanupDaysLabel: 'Tage-Schwelle', cleanupTargetLabel: 'Bereich', cleanupTargetLive: 'Nur Live-Aufnahmen', cleanupTargetAll: 'Alle Aufnahmen', cleanupActionLabel: 'Aktion', cleanupActionArchive: 'In Archiv verschieben', cleanupActionDelete: 'Löschen', cleanupDryRun: 'Vorschau', cleanupRunNow: 'Jetzt ausführen', cleanupReportPreview: 'Würde {count} Dateien betreffen (~{size}). Es wurden keine Dateien verschoben oder gelöscht.', cleanupReportDone: '{count} Dateien verarbeitet, ~{size} frei.{failed}', cleanupReportFailedSuffix: ' {failed} fehlgeschlagen.', cleanupReportEmpty: 'Keine Aufnahmen älter als {days} Tage gefunden.', discordCardTitle: 'Discord-Webhook', discordCardIntro: 'Sende Benachrichtigungen an einen Discord-Channel via Webhook - nützlich für Multi-Device-Setups oder eine dedizierte Archiv-Maschine.', discordWebhookUrlLabel: 'Webhook-URL', discordNotifyLiveStartLabel: 'Bei Live-Aufnahme-Start benachrichtigen', discordNotifyLiveEndLabel: 'Bei Live-Aufnahme-Ende benachrichtigen', discordNotifyVodAutoQueuedLabel: 'Bei automatisch eingereihten VODs benachrichtigen', autoResumeLiveRecordingLabel: 'Live-Aufnahme automatisch fortsetzen wenn Streamlink abbricht (max. 5 Versuche)', autoMergeResumedPartsLabel: 'Fortgesetzte Aufnahme-Parts automatisch zu einer Datei zusammenfügen (ffmpeg concat, kein Re-Encode)', deletePartsAfterMergeLabel: 'Einzelne Parts nach erfolgreichem Merge löschen', autoVodCardTitle: 'Auto-VOD-Download', autoVodCardIntro: 'Streamer mit aktiviertem VOD-Toggle werden in dem hier festgelegten Intervall auf neue Twitch-VODs geprüft. Neue VODs innerhalb des Altersfensters werden automatisch zur Download-Queue hinzugefügt.', autoVodPollMinutesLabel: 'Poll-Intervall (Minuten)', autoVodMaxAgeHoursLabel: 'Max. Alter (Stunden)', autoVodScanNow: 'Jetzt scannen', autoRecordScanNow: 'Live-Status prüfen', statsTitle: 'Archiv-Statistik', statsIntro: 'Aggregiert über den Download-Ordner. Live-Aufnahmen liegen unter {streamer}/live/, VOD-Downloads direkt unter {streamer}/. Lade-Zeit skaliert mit der Anzahl Dateien.', statsRefresh: 'Aktualisieren', statsScanning: 'Scanne...', statsScannedAt: 'Letzter Scan', statsSummaryTitle: 'Übersicht', statsTopStreamersTitle: 'Top Streamer (nach Größe)', statsActivityTitle: 'Aktivität (letzte 30 Tage)', statsSizeBucketsTitle: 'Aufnahme-Größen-Verteilung', statsTotalRecordings: 'Aufnahmen gesamt', statsLiveRecordings: 'Live-Aufnahmen', statsVodRecordings: 'VOD-Downloads', statsStreamers: 'Streamer', statsAvgSize: 'Durchschn. Größe', statsChatFiles: 'Chat-Dateien', statsFiles: 'Dateien', statsActivityEmpty: 'Keine Aufnahmen in den letzten 30 Tagen.', statsActivitySummary: '{count} Aufnahmen - {size} in den letzten 30 Tagen', statsEmpty: 'Keine Daten.', statsNoRoot: 'Download-Ordner nicht gefunden. Setze zuerst einen Download-Pfad in den Einstellungen.', navStats: 'Statistik', navArchive: 'Archiv', archiveTitle: 'Archiv durchsuchen', archiveIntro: 'Suche nach Dateinamen, Streamern oder Datumsangaben. Treffer zeigen Aufnahmen (Live + VOD); zugehörige Chat- und Event-Dateien werden als zusätzliche Schaltflächen angeboten.', archiveAllTypes: 'Alle Typen', archiveTypeLive: 'Live-Aufnahmen', archiveTypeVod: 'VOD-Downloads', archiveAllStreamers: 'Alle Streamer', archiveSortDateDesc: 'Neueste zuerst', archiveSortDateAsc: 'Älteste zuerst', archiveSortSizeDesc: 'Größte zuerst', archiveSortSizeAsc: 'Kleinste zuerst', archiveSortNameAsc: 'Name (A-Z)', archiveSearchBtn: 'Suchen', archiveSearching: 'Scanne...', archiveSummary: '{matchCount} Treffer (gescannt: {scanned} Dateien)', archiveSummaryTruncated: '{matchCount} Treffer (gescannt: {scanned} Dateien, gezeigt: {shown} - verfeinere die Suche für mehr)', archiveNoMatches: 'Keine Treffer.', archiveNoRoot: 'Download-Ordner nicht gefunden. Setze zuerst einen Download-Pfad in den Einstellungen.', archiveSearchPlaceholder: 'Suche…', archiveSearchAria: 'Archiv durchsuchen', archiveResults: 'Ergebnisse', archiveOpen: 'Öffnen', archiveShowInFolder: 'Ordner', archiveViewChat: 'Chat', archiveViewEvents: 'Events', discordNotifyVodCompleteLabel: 'Bei abgeschlossenem VOD-Download benachrichtigen', backupCardTitle: 'Sicherung & Wartung', backupCardIntro: 'Konfiguration sichern, auf einem anderen Gerät wiederherstellen oder die Liste der bereits heruntergeladenen VODs zurücksetzen.', exportConfig: 'Konfiguration exportieren', importConfig: 'Konfiguration importieren', resetDownloadedIds: 'Downloaded-VODs zurücksetzen', configExported: 'Konfiguration exportiert.', configExportFailed: 'Export der Konfiguration fehlgeschlagen.', configImported: 'Konfiguration importiert. Einige Aenderungen erfordern evtl. einen Neustart.', configImportFailed: 'Import der Konfiguration fehlgeschlagen.', resetDownloadedConfirm: 'Liste der heruntergeladenen VODs zurücksetzen? Karten verlieren das grüne Häkchen, es werden aber keine Dateien gelöscht.', resetDownloadedDone: '{count} Einträge aus der Downloaded-Liste entfernt.', duplicatePreventionLabel: 'Duplikate in Queue verhindern', persistQueueLabel: 'Queue zwischen App-Starts speichern', autoResumeQueueLabel: 'Queue beim Start automatisch fortsetzen', autoResumeQueueHint: 'Wenn aktiv und die gespeicherte Queue noch ausstehende Einträge hat, starten Downloads ~5 Sekunden nach dem Fensteröffnen. Deaktivieren = Start-Klick nötig.', notifyEachCompletionLabel: 'Benachrichtigung bei jedem fertigen Download', notifyEachCompletionHint: 'Standardmäßig aus — bei langen Queues würde das System-Notifications-Panel sonst zugespammt. Die Queue-End-Zusammenfassung erscheint trotzdem.', streamlinkDisableAdsLabel: 'Twitch-Ads beim Download überspringen', streamlinkDisableAdsHint: 'Gibt --twitch-disable-ads an streamlink weiter, damit Mid-Roll-Ads nicht ins VOD eingebettet werden. Empfohlen aktiv lassen.', downloadChatReplayLabel: 'Chat-Replay parallel zum VOD speichern (.chat.json)', downloadChatReplayHint: 'Nach erfolgreichem VOD-Download wird der öffentliche Chat-Replay via Twitch GQL geholt und als JSON neben dem Video gespeichert. Twitch behält Chat-Replays nur solange wie das VOD selbst.', captureLiveChatLabel: 'Live-Chat während der Aufnahme mitschneiden (.chat.jsonl)', captureLiveChatHint: 'Oeffnet während einer Live-Aufnahme eine anonyme IRC-Verbindung zum Twitch-Chat und schreibt jede Nachricht in eine .chat.jsonl-Datei neben dem Video (JSON Lines, eine Nachricht pro Zeile, damit ein Mid-Stream-Abbruch früheren Inhalt nicht korrumpiert).', logStreamEventsLabel: 'Stream-Events bei Live-Aufnahmen mitloggen (.events.jsonl)', logStreamEventsHint: 'Pollt den Streamer einmal pro Minute und schreibt Title-/Game-Wechsel in eine .events.jsonl-Datei neben dem Video. Hilfreich beim Suchen in langen archivierten Streams ("wann hat er auf CS:GO gewechselt?"). Sehr günstig — ein zusätzlicher Helix/GQL-Call pro Minute pro aktiver Aufnahme.', streamlinkQualityLabel: 'Stream-Qualität', streamlinkQualityHint: 'Streamlink versucht erst diese Qualität; falls das VOD sie nicht anbietet, fällt es auf "best" zurück.', streamlinkQualityBest: 'Best (Standard)', streamlinkQualitySource: 'Source (Original)', streamlinkQualityAudio: 'Nur Audio', downloadPathNotWritable: 'Download-Ordner ist nicht beschreibbar. Wähle einen anderen Ordner oder prüfe die Schreibrechte.', streamerSectionTitle: 'Streamer', streamerListFilterPlaceholder: 'Filtern...', streamerListFilterAria: 'Streamer-Liste filtern', streamerAddAriaLabel: 'Streamer hinzufügen', streamerBulkRemoveTitle: 'Alle entfernen (oder gefilterte)', streamerBulkRemoveAll: 'Alle {count} Streamer aus der Liste entfernen?', streamerBulkRemoveFiltered: 'Die {count} passenden Streamer aus der Liste entfernen?', metadataCacheMinutesLabel: 'Metadata-Cache (Minuten)', filenameTemplatesTitle: 'Dateinamen-Templates', vodTemplateLabel: 'VOD-Template', partsTemplateLabel: 'VOD-Teile-Template', defaultClipTemplateLabel: 'Clip-Template', filenameTemplateHint: 'Platzhalter: {title} {id} {channel} {date} {part} {part_padded} {trim_start} {trim_end} {trim_length} {date_custom="yyyy-MM-dd"}', vodTemplatePlaceholder: '{title}.mp4', partsTemplatePlaceholder: '{date}_Part{part_padded}.mp4', defaultClipTemplatePlaceholder: '{date}_{part}.mp4', templateLintOk: 'Template-Check: OK', templateLintWarn: 'Unbekannte Platzhalter', templateGuideButton: 'Template Guide', templateGuideTitle: 'Dateinamen-Template Guide', templateGuideIntro: 'Nutze Platzhalter für Dateinamen und teste dein Muster mit einer Live-Vorschau.', templateGuideTemplateLabel: 'Template', templateGuideOutputLabel: 'Live-Vorschau', templateGuideVarsTitle: 'Verfügbare Platzhalter', templateGuideVarCol: 'Platzhalter', templateGuideDescCol: 'Beschreibung', templateGuideExampleCol: 'Beispiel', templateGuideUseVod: 'VOD-Template nutzen', templateGuideUseParts: 'Teile-Template nutzen', templateGuideUseClip: 'Clip-Template nutzen', templateGuideClose: 'Schließen', templateGuideContextVod: 'Kontext: Beispiel für kompletten VOD-Download', templateGuideContextParts: 'Kontext: Beispiel für VOD-Teil', templateGuideContextClip: 'Kontext: Beispiel für Clip-Zuschnitt', templateGuideContextClipLive: 'Kontext: Aktuelle Auswahl im Clip-Dialog', runtimeMetricsTitle: 'Runtime Metrics', runtimeMetricsRefresh: 'Aktualisieren', runtimeMetricsExport: 'Export JSON', runtimeMetricsAutoRefresh: 'Auto-Refresh', runtimeMetricsLoading: 'Metriken werden geladen...', runtimeMetricsError: 'Runtime-Metriken konnten nicht geladen werden.', runtimeMetricsExportDone: 'Runtime-Metriken wurden exportiert.', runtimeMetricsExportCancelled: 'Export der Runtime-Metriken abgebrochen.', runtimeMetricsExportFailed: 'Export der Runtime-Metriken fehlgeschlagen.', runtimeMetricQueue: 'Queue', runtimeMetricMode: 'Modus', runtimeMetricRetries: 'Retries', runtimeMetricIntegrity: 'Integritatsfehler', runtimeMetricCache: 'Cache', runtimeMetricBandwidth: 'Bandbreite', runtimeMetricDownloads: 'Downloads', runtimeMetricActive: 'Aktiver Job', runtimeMetricLastError: 'Letzte Fehlerklasse', runtimeMetricUpdated: 'Aktualisiert', updateTitle: 'Updates', checkUpdates: 'Nach Updates suchen', preflightTitle: 'System-Check', preflightRun: 'Check ausfuhren', preflightFix: 'Auto-Fix Tools', preflightEmpty: 'Noch kein Check ausgefuhrt.', preflightChecking: 'Prüfe...', preflightFixing: 'Fixe...', preflightReady: 'Alles bereit.', preflightInternet: 'Internet', preflightStreamlink: 'Streamlink', preflightFfmpeg: 'FFmpeg', preflightFfprobe: 'FFprobe', preflightPath: 'Download-Pfad', debugLogTitle: 'Live Debug-Log', refreshLog: 'Aktualisieren', autoRefresh: 'Auto-Refresh', notConnected: 'Nicht verbunden' }, status: { noLogin: 'Public-Modus · öffentliche VODs verfügbar', publicHint: 'Ohne Twitch-API-Verbindung funktionieren öffentliche VODs und Downloads. Mit API-Verbindung stehen vollständigere Metadaten, mehr Verlauf und zuverlässigere Abfragen bereit.', connecting: 'Verbinde...', connected: 'Twitch-API verbunden', connectedHint: 'Die Twitch-API ist verbunden. Vollständige Metadaten und der erweiterte VOD-Verlauf sind verfügbar.', connectFailedPublic: 'API nicht erreichbar · Public-Modus aktiv' }, tabs: { vods: 'VODs', clips: 'Clips', cutter: 'Video schneiden', merge: 'Videos zusammenfügen', stats: 'Statistik', archive: 'Archiv', settings: 'Einstellungen' }, queue: { empty: 'Keine Downloads in der Warteschlange', detailStreamer: 'Streamer:', detailDuration: 'Dauer:', detailDate: 'Datum:', start: 'Start', stop: 'Pausieren', resume: 'Fortsetzen', statusDone: 'Abgeschlossen', statusFailed: 'Fehlgeschlagen', statusRunning: 'Läuft', statusPaused: 'Pausiert', statusWaiting: 'Wartet', progressError: 'Fehler', progressReady: 'Bereit', progressLoading: 'Lade...', readyToDownload: 'Bereit zum Download', started: 'Download wird gestartet …', done: 'Fertig', failed: 'Download fehlgeschlagen', speed: 'Geschwindigkeit', eta: 'Restzeit', part: 'Teil', emptyAlert: 'Die Warteschlange ist leer. Füge zuerst ein VOD oder einen Clip hinzu.', duplicateSkipped: 'Dieser Eintrag ist bereits aktiv in der Warteschlange.', openFile: 'Datei öffnen', showInFolder: 'Im Ordner zeigen', openFileFailed: 'Datei konnte nicht geöffnet werden (evtl. verschoben oder gelöscht).', outputFilesLabel: '{count} Ausgabedateien', retryItem: 'Diesen Eintrag erneut versuchen', viewChat: 'Chat ansehen', viewChatLoading: 'Lade Chat...', viewChatFailed: 'Chat-Datei konnte nicht gelesen werden', chatViewerFilterPlaceholder: 'Chat filtern...', chatViewerFilterAria: 'Chatnachrichten filtern', viewChatCount: '{count} Nachrichten', viewChatTruncatedSuffix: ' (gekürzt)', viewEvents: 'Events ansehen', viewEventsCount: '{count} Events', viewEventsEmpty: 'Keine Events aufgezeichnet.', eventStartedAs: 'Gestartet als', eventEndedAfter: 'Beendet nach', eventTitleFromTo: 'Titel: {from} -> {to}', eventGameFromTo: 'Game: {from} -> {to}', statusBarSummary: '{downloading} aktiv, {pending} wartet', ctxMoveTop: 'Nach oben verschieben', ctxMoveBottom: 'Nach unten verschieben', ctxSelectForMerge: 'Für Zusammenfügen auswählen', ctxRemoveFromMerge: 'Aus Zusammenfügen-Auswahl entfernen', mergeSelectionPosition: 'Zusammenfügen: Position {position}', ctxCopyUrl: 'URL kopieren', ctxOpenOnTwitch: 'Auf Twitch öffnen', ctxRemove: 'Aus Queue entfernen', ctxCopiedUrl: 'URL in Zwischenablage kopiert.', liveRecordingTitle: 'Live-Aufnahme - läuft bis der Stream endet', recordingHealth: { ok: 'Gesund - Bytes fließen', stale: 'Stillstand - keine Bytes mehr (Netz-Hickser oder Stream endet)', unknown: 'Warte auf ersten Segment' }, eventRecordingResume: 'Aufnahme fortgesetzt - Part {part} startet' }, profile: { liveBadge: 'LIVE', partner: 'Partner', affiliate: 'Affiliate', followers: 'Follower', vods: 'VODs', vodsTooltip: 'Über die Twitch-API sichtbare VODs dieses Kanals', lastStream: 'Letzter Stream', openTwitch: 'Auf Twitch öffnen', openTwitchTooltip: 'Diesen Kanal auf twitch.tv öffnen', liveCardTooltip: 'Klick um sofort eine Live-Aufnahme zu starten', liveThumbAlt: 'Live-Vorschau', recordNow: 'Jetzt aufnehmen', refresh: 'Aktualisieren', agoMinutes: 'vor {n} Min', agoHours: 'vor {n} h', agoDay: 'vor 1 Tag', agoDays: 'vor {n} Tagen', agoMonth: 'vor 1 Monat', agoMonths: 'vor {n} Monaten', agoYear: 'vor 1 Jahr', agoYears: 'vor {n} Jahren' }, streamers: { recordLiveTitle: 'Diesen Streamer live aufnehmen (läuft bis der Stream endet)', liveRecordingStarted: 'Live-Aufnahme für {streamer} gestartet.', liveRecordingOffline: '{streamer} ist gerade offline.', liveRecordingAlreadyActive: 'Aufnahme von {streamer} läuft bereits.', liveRecordingFailed: 'Live-Aufnahme konnte nicht gestartet werden', autoRecordTitle: 'Auto-Aufnahme: wenn dieser Streamer live geht, nimmt die App automatisch auf', autoRecordEnabled: 'Auto-Aufnahme aktiviert für {streamer}. Live-Status wird geprüft...', autoRecordDisabled: 'Auto-Aufnahme für {streamer} deaktiviert.', autoVodTitle: 'Neue VODs (kürzlich veröffentlicht) automatisch herunterladen', autoVodEnabled: 'Auto-VOD aktiviert für {streamer}. Neue VODs werden automatisch geladen.', autoVodDisabled: 'Auto-VOD für {streamer} deaktiviert.', autoVodScanQueued: '{count} neue VOD(s) automatisch eingereiht.', autoVodScanEmpty: 'Keine neuen VODs gefunden.', autoRecordScanTriggered: 'Manueller Scan: {count} Live-Aufnahme(n) gestartet.', autoRecordScanEmpty: 'Manueller Scan: kein Streamer ist gerade live.', liveNowTooltip: 'Aktuell live auf Twitch', modalCloseAria: 'Dialog schließen', sidebarEmpty: 'Noch keine Streamer. Füge oben rechts einen hinzu.', removeAria: 'Entfernen', cutProgressAria: 'Schnitt-Fortschritt', mergeProgressAria: 'Merge-Fortschritt', updateProgressAria: 'Update-Download-Fortschritt' }, vods: { selectAriaLabel: 'VOD für Bulk-Aktion auswählen', noneTitle: 'Keine VODs', noneText: 'Wähle einen Streamer aus der Liste.', loading: 'Lade VODs...', notFound: 'Streamer nicht gefunden', noResultsTitle: 'Keine VODs gefunden', noResultsText: 'Dieser Streamer hat keine VODs.', untitled: 'Unbenanntes VOD', views: 'Aufrufe', addQueue: '+ Warteschlange', trimButton: 'VOD zuschneiden', filterPlaceholder: 'Nach Titel filtern... (Strg+F)', filterAria: 'VOD-Titel filtern', filterClearTitle: 'Filter löschen (Esc)', filterNoMatchTitle: 'Keine Treffer', filterNoMatchText: 'Keine VODs entsprechen dem aktuellen Filter.', filterMatchCount: '{shown} von {total} VODs', sortLabel: 'Sortierung:', sortDateDesc: 'Neueste zuerst', sortDateAsc: 'Älteste zuerst', sortViewsDesc: 'Meiste Aufrufe', sortDurationDesc: 'Längste zuerst', sortDurationAsc: 'Kürzeste zuerst', bulkSelectedCount: '{count} ausgewählt', bulkAddToQueue: '+ Warteschlange', bulkAdding: 'Füge hinzu...', bulkClear: 'Löschen', bulkAddedToQueue: '{count} VODs zur Warteschlange hinzugefügt.', bulkAddSkipped: 'Keine VODs hinzugefügt (bereits in Queue oder ungültig).', bulkMarkDownloaded: 'Als heruntergeladen markieren', bulkUnmark: 'Markierung entfernen', bulkMarkedDownloaded: '{count} VODs als heruntergeladen markiert.', bulkUnmarkedDownloaded: 'Markierung von {count} VODs entfernt.', alreadyDownloaded: 'Bereits heruntergeladen', hideDownloaded: 'Bereits geladene ausblenden', hideDownloadedTitle: 'VODs ausblenden, die als bereits heruntergeladen markiert sind', openOnTwitch: 'Auf Twitch öffnen', ctxOpenOnTwitch: 'Auf Twitch öffnen', ctxCopyUrl: 'VOD-URL kopieren', ctxCopiedUrl: 'URL in Zwischenablage kopiert.', ctxMarkDownloaded: 'Als heruntergeladen markieren', ctxUnmarkDownloaded: 'Markierung entfernen' }, clips: { dialogTitle: 'VOD zuschneiden', dialogStart: 'Start:', dialogStartTime: 'Startzeit (HH:MM:SS):', dialogEnd: 'Ende:', dialogEndTime: 'Endzeit (HH:MM:SS):', dialogDuration: 'Dauer: ', dialogPartLabel: 'Start Part-Nummer (optional, für Fortsetzung):', dialogPartHint: 'Leer lassen = Teil 1', dialogFormatLabel: 'Dateinamen-Format:', dialogConfirm: 'Zur Queue hinzufügen', invalidDuration: 'Ungultig!', invalidTime: 'Ungültige Zeitangaben', endBeforeStart: 'Endzeit muss größer als Startzeit sein!', outOfRange: 'Zeit außerhalb des VOD-Bereichs!', enterUrl: 'Bitte URL eingeben', loadingButton: 'Lade...', loadingStatus: 'Download läuft...', downloadButton: 'Clip herunterladen', success: 'Download erfolgreich!', errorPrefix: 'Fehler: ', unknownError: 'Unbekannter Fehler', formatSimple: '(Standard)', formatTimestamp: '(mit Zeitstempel)', formatParts: '(Parts-Format)', formatTemplate: '(benutzerdefiniert)', templateEmpty: 'Das Template darf im benutzerdefinierten Modus nicht leer sein.', templatePlaceholder: '{date}_{part}.mp4', templateHelp: 'Platzhalter: {title} {id} {channel} {date} {part} {part_padded} {trim_start} {trim_end} {trim_length} {date_custom="yyyy-MM-dd"}', urlPlaceholder: 'https://clips.twitch.tv/... oder https://www.twitch.tv/.../clip/...', startPartPlaceholder: 'z.B. 42' }, cutter: { videoInfoFailed: 'Konnte Video-Informationen nicht lesen. FFprobe installiert?', previewLoading: 'Lade Vorschau...', previewUnavailable: 'Vorschau nicht verfügbar', previewAlt: 'Vorschau', cutting: 'Schneidet...', cut: 'Schneiden', cutSuccess: 'Video erfolgreich geschnitten!', cutFailed: 'Fehler beim Schneiden des Videos.', infoDuration: 'Dauer', infoResolution: 'Auflösung', infoFps: 'FPS', infoSelection: 'Auswahl', startLabel: 'Start:', endLabel: 'Ende:', filePathPlaceholder: 'Keine Datei ausgewählt…' }, merge: { empty: 'Keine Videos ausgewahlt', merging: 'Zusammenfügen...', merge: 'Zusammenfügen', success: 'Videos erfolgreich zusammengefugt!', failed: 'Fehler beim Zusammenfügen der Videos.', moveUpAria: 'Nach oben verschieben', moveDownAria: 'Nach unten verschieben', removeAria: 'Aus Liste entfernen' }, mergeGroup: { btn: 'Zusammenfügen & Splitten', phaseDownloading: 'VOD wird heruntergeladen', phaseMerging: 'Zusammenfügen...', phaseSplitting: 'Part wird erstellt', phaseCleanup: 'Aufraumen...', needMinTwo: 'Mindestens 2 VODs auswählen', titleTwo: 'Merge: {title1} + {title2}', titleMany: 'Merge: {title1} + {count} weitere', metaLabel: '{count} VODs', }, updates: { bannerDefault: 'Neue Version verfügbar!', latest: 'Du hast die neueste Version!', checking: 'Suche nach Updates...', checkInProgress: 'Update-Prufung lauft bereits.', readyToInstall: 'Update ist bereit zur Installation.', checkFailed: 'Update-Prufung fehlgeschlagen.', downloading: 'Wird heruntergeladen...', downloadInProgress: 'Update-Download lauft bereits.', downloadFailed: 'Update-Download fehlgeschlagen.', available: 'verfügbar!', downloadNow: 'Jetzt herunterladen', downloadLabel: 'Download', ready: 'bereit zur Installation!', installNow: 'Jetzt installieren & neu starten', modalAvailableTitle: 'Update verfügbar', modalAvailableMessage: 'Version {version} ist verfügbar. Jetzt herunterladen?', modalReadyTitle: 'Update bereit', modalReadyMessage: 'Version {version} wurde heruntergeladen. Jetzt installieren und neu starten?', modalDismiss: 'Nein', later: 'Später', dismissAria: 'Schließen', modalDownloadConfirm: 'Ja, herunterladen', modalInstallConfirm: 'Ja, installieren', modalSkipVersion: 'Diese Version überspringen', changelogLabel: 'Changelog', showChangelog: 'Changelog anzeigen', hideChangelog: 'Changelog ausblenden', noChangelog: 'Kein Changelog verfügbar.', releasedLabel: 'Release' } } as const;