Twitch retains chat replay on the same VOD-lifetime clock — when the VOD vanishes after 7-60 days, the chat goes with it. Anyone archiving the video usually wants the chat too. Added an opt-in setting that saves a paginated GQL pull of the chat as a JSON file next to the .mp4 download. Server: - new fetchVodChatReplay(videoId, onProgress, cancelCheck) — uses the existing fetchPublicTwitchGql helper (so the retry-on-transient logic from cycle 4 applies here too) with the standard video.comments(contentOffsetSeconds, cursor) query, paginated via edge cursors. Each message is normalised to a small flat shape: id, offset (seconds-into-VOD), createdAt, user (display name), login, color, text (assembled from fragments). Hard-capped at 500 pages (~50k messages) so a single runaway stream can't fill memory; hitting the cap sets truncated:true in the result. Honours a cancelCheck() callback so removing the queue item also cancels the in-flight chat fetch. - new chatReplayPathFor() helper produces sibling .chat.json path. - processOneQueueItem fires the chat fetch after a successful, non- live, non-merge VOD download whose URL parses to a VOD id. Progress shows up in the queue item via existing download-progress IPC: "Fetching chat replay..." then "Chat messages fetched: N". Output file is added to item.outputFiles so the existing Open file / Show in folder UI lists the chat right next to the video. A failed chat fetch is logged but does NOT mark the queue item as failed — the video itself is fine, the chat is a bonus. - Atomic write via writeFileAtomicSync so a crash mid-fetch can't leave a half-written .chat.json next to the video. Renderer: - new download_chat_replay: boolean in Config (default false because long streams can take a few minutes of chat-page pulls and we don't want to surprise users on upgrade). Settings -> Download card gets the toggle with hint tooltip explaining the trade-off. - AppConfig type, settings autosave fingerprint, syncSettingsForm, applyLanguageToStaticUI all updated. - DE + EN labels and the two new backend status strings (statusFetchingChatReplay, statusChatMessagesFetched). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
349 lines
18 KiB
TypeScript
349 lines
18 KiB
TypeScript
const UI_TEXT_DE = {
|
|
appName: 'Twitch VOD Manager',
|
|
static: {
|
|
navVods: 'Twitch VODs',
|
|
navClips: 'Twitch Clips',
|
|
navCutter: 'Video schneiden',
|
|
navMerge: 'Videos zusammenfugen',
|
|
navSettings: 'Einstellungen',
|
|
queueTitle: 'Warteschlange',
|
|
retryFailed: 'Wiederholen',
|
|
retryFailedHint: 'Nur fehlgeschlagene Downloads erneut starten',
|
|
healthUnknown: 'System: Unbekannt',
|
|
healthGood: 'System: Stabil',
|
|
healthWarn: 'System: Warnung',
|
|
healthBad: 'System: Problem',
|
|
clearQueue: 'Leeren',
|
|
refresh: 'Aktualisieren',
|
|
streamerPlaceholder: 'Streamer hinzufugen...',
|
|
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 auswahlen',
|
|
cutterBrowse: 'Durchsuchen',
|
|
mergeTitle: 'Videos zusammenfugen',
|
|
mergeDesc: 'Wahle mehrere Videos aus, um sie zu einem Video zusammenzufugen. Die Reihenfolge kann geandert werden.',
|
|
mergeAdd: '+ Videos hinzufugen',
|
|
designTitle: 'Design',
|
|
themeLabel: 'Theme',
|
|
themeLight: 'Hell',
|
|
languageLabel: 'Sprache',
|
|
languageDe: 'Deutsch',
|
|
languageEn: 'Englisch',
|
|
apiTitle: 'Twitch API',
|
|
clientIdLabel: 'Client ID',
|
|
clientSecretLabel: 'Client Secret',
|
|
saveSettings: 'Speichern & Verbinden',
|
|
downloadSettingsTitle: 'Download-Einstellungen',
|
|
storageLabel: 'Speicherort',
|
|
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 kuerzere VODs und aeltere Queue-Eintraege zuerst, damit der Durchsatz gleichmaessig bleibt. Deaktivieren = strikte Einfuegereihenfolge.',
|
|
streamerInvalid: 'Twitch-Username ungueltig (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 oeffnen',
|
|
backupCardTitle: 'Sicherung & Wartung',
|
|
backupCardIntro: 'Konfiguration sichern, auf einem anderen Geraet wiederherstellen oder die Liste der bereits heruntergeladenen VODs zuruecksetzen.',
|
|
exportConfig: 'Konfiguration exportieren',
|
|
importConfig: 'Konfiguration importieren',
|
|
resetDownloadedIds: 'Downloaded-VODs zuruecksetzen',
|
|
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 zuruecksetzen? Karten verlieren das gruene Haekchen, es werden aber keine Dateien geloescht.',
|
|
resetDownloadedDone: '{count} Eintraege 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 Eintraege hat, starten Downloads ~5 Sekunden nach dem Fensteroeffnen. Deaktivieren = Start-Klick noetig.',
|
|
notifyEachCompletionLabel: 'Benachrichtigung bei jedem fertigen Download',
|
|
notifyEachCompletionHint: 'Standardmaessig aus — bei langen Queues wuerde das System-Notifications-Panel sonst zugespammt. Die Queue-End-Zusammenfassung erscheint trotzdem.',
|
|
streamlinkDisableAdsLabel: 'Twitch-Ads beim Download ueberspringen',
|
|
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 oeffentliche Chat-Replay via Twitch GQL geholt und als JSON neben dem Video gespeichert. Twitch behaelt Chat-Replays nur solange wie das VOD selbst.',
|
|
streamlinkQualityLabel: 'Stream-Qualitaet',
|
|
streamlinkQualityHint: 'Streamlink versucht erst diese Qualitaet; falls das VOD sie nicht anbietet, faellt es auf "best" zurueck.',
|
|
streamlinkQualityBest: 'Best (Standard)',
|
|
streamlinkQualitySource: 'Source (Original)',
|
|
streamlinkQualityAudio: 'Nur Audio',
|
|
downloadPathNotWritable: 'Download-Ordner ist nicht beschreibbar. Waehle einen anderen Ordner oder pruefe die Schreibrechte.',
|
|
streamerSectionTitle: 'Streamer',
|
|
streamerListFilterPlaceholder: 'Filtern...',
|
|
streamerBulkRemoveTitle: 'Alle entfernen (oder gefilterte)',
|
|
streamerBulkRemoveAll: 'Alle {count} Streamer aus der Liste entfernen?',
|
|
streamerBulkRemoveFiltered: 'Die {count} passenden Streamer aus der Liste entfernen?',
|
|
cutterDropHint: 'Video-Datei hierher ziehen zum Laden.',
|
|
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 fur Dateinamen und teste dein Muster mit einer Live-Vorschau.',
|
|
templateGuideTemplateLabel: 'Template',
|
|
templateGuideOutputLabel: 'Live-Vorschau',
|
|
templateGuideVarsTitle: 'Verfugbare Platzhalter',
|
|
templateGuideVarCol: 'Platzhalter',
|
|
templateGuideDescCol: 'Beschreibung',
|
|
templateGuideExampleCol: 'Beispiel',
|
|
templateGuideUseVod: 'VOD-Template nutzen',
|
|
templateGuideUseParts: 'Teile-Template nutzen',
|
|
templateGuideUseClip: 'Clip-Template nutzen',
|
|
templateGuideClose: 'Schliessen',
|
|
templateGuideContextVod: 'Kontext: Beispiel fur kompletten VOD-Download',
|
|
templateGuideContextParts: 'Kontext: Beispiel fur VOD-Teil',
|
|
templateGuideContextClip: 'Kontext: Beispiel fur 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: 'Prufe...',
|
|
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: 'Ohne Login (Public Modus)',
|
|
connecting: 'Verbinde...',
|
|
connected: 'Verbunden',
|
|
connectFailedPublic: 'Verbindung fehlgeschlagen - Public Modus aktiv'
|
|
},
|
|
tabs: {
|
|
vods: 'VODs',
|
|
clips: 'Clips',
|
|
cutter: 'Video schneiden',
|
|
merge: 'Videos zusammenfugen',
|
|
settings: 'Einstellungen'
|
|
},
|
|
queue: {
|
|
empty: 'Keine Downloads in der Warteschlange',
|
|
start: 'Start',
|
|
stop: 'Pausieren',
|
|
resume: 'Fortsetzen',
|
|
statusDone: 'Abgeschlossen',
|
|
statusFailed: 'Fehlgeschlagen',
|
|
statusRunning: 'Laeuft',
|
|
statusPaused: 'Pausiert',
|
|
statusWaiting: 'Wartet',
|
|
progressError: 'Fehler',
|
|
progressReady: 'Bereit',
|
|
progressLoading: 'Lade...',
|
|
readyToDownload: 'Bereit zum Download',
|
|
started: 'Download gestartet',
|
|
done: 'Fertig',
|
|
failed: 'Download fehlgeschlagen',
|
|
speed: 'Geschwindigkeit',
|
|
eta: 'Restzeit',
|
|
part: 'Teil',
|
|
emptyAlert: 'Die Warteschlange ist leer. Fuge zuerst ein VOD oder einen Clip hinzu.',
|
|
duplicateSkipped: 'Dieser Eintrag ist bereits aktiv in der Warteschlange.',
|
|
openFile: 'Datei oeffnen',
|
|
showInFolder: 'Im Ordner zeigen',
|
|
openFileFailed: 'Datei konnte nicht geoeffnet werden (evtl. verschoben oder geloescht).',
|
|
outputFilesLabel: '{count} Ausgabedateien',
|
|
retryItem: 'Diesen Eintrag erneut versuchen',
|
|
statusBarSummary: '{downloading} aktiv, {pending} wartet',
|
|
ctxMoveTop: 'Nach oben verschieben',
|
|
ctxMoveBottom: 'Nach unten verschieben',
|
|
ctxCopyUrl: 'URL kopieren',
|
|
ctxOpenOnTwitch: 'Auf Twitch oeffnen',
|
|
ctxRemove: 'Aus Queue entfernen',
|
|
ctxCopiedUrl: 'URL in Zwischenablage kopiert.',
|
|
liveRecordingTitle: 'Live-Aufnahme - laeuft bis der Stream endet'
|
|
},
|
|
streamers: {
|
|
recordLiveTitle: 'Diesen Streamer live aufnehmen (laeuft bis der Stream endet)',
|
|
liveRecordingStarted: 'Live-Aufnahme fuer {streamer} gestartet.',
|
|
liveRecordingOffline: '{streamer} ist gerade offline.',
|
|
liveRecordingAlreadyActive: 'Aufnahme von {streamer} laeuft 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 fuer {streamer}. Live-Status wird geprueft...',
|
|
autoRecordDisabled: 'Auto-Aufnahme fuer {streamer} deaktiviert.'
|
|
},
|
|
vods: {
|
|
noneTitle: 'Keine VODs',
|
|
noneText: 'Wahle 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)',
|
|
filterClearTitle: 'Filter loeschen (Esc)',
|
|
filterNoMatchTitle: 'Keine Treffer',
|
|
filterNoMatchText: 'Keine VODs entsprechen dem aktuellen Filter.',
|
|
filterMatchCount: '{shown} von {total} VODs',
|
|
sortLabel: 'Sortierung:',
|
|
sortDateDesc: 'Neueste zuerst',
|
|
sortDateAsc: 'Aelteste zuerst',
|
|
sortViewsDesc: 'Meiste Aufrufe',
|
|
sortDurationDesc: 'Laengste zuerst',
|
|
sortDurationAsc: 'Kuerzeste zuerst',
|
|
bulkSelectedCount: '{count} ausgewaehlt',
|
|
bulkAddToQueue: '+ Warteschlange',
|
|
bulkAdding: 'Fuege hinzu...',
|
|
bulkClear: 'Loeschen',
|
|
bulkAddedToQueue: '{count} VODs zur Warteschlange hinzugefuegt.',
|
|
bulkAddSkipped: 'Keine VODs hinzugefuegt (bereits in Queue oder ungueltig).',
|
|
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 oeffnen',
|
|
ctxOpenOnTwitch: 'Auf Twitch oeffnen',
|
|
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, fur Fortsetzung):',
|
|
dialogPartHint: 'Leer lassen = Teil 1',
|
|
dialogFormatLabel: 'Dateinamen-Format:',
|
|
dialogConfirm: 'Zur Queue hinzufuegen',
|
|
invalidDuration: 'Ungultig!',
|
|
endBeforeStart: 'Endzeit muss grosser als Startzeit sein!',
|
|
outOfRange: 'Zeit ausserhalb des VOD-Bereichs!',
|
|
enterUrl: 'Bitte URL eingeben',
|
|
loadingButton: 'Lade...',
|
|
loadingStatus: 'Download laeuft...',
|
|
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"}'
|
|
},
|
|
cutter: {
|
|
videoInfoFailed: 'Konnte Video-Informationen nicht lesen. FFprobe installiert?',
|
|
previewLoading: 'Lade Vorschau...',
|
|
previewUnavailable: 'Vorschau nicht verfugbar',
|
|
cutting: 'Schneidet...',
|
|
cut: 'Schneiden',
|
|
cutSuccess: 'Video erfolgreich geschnitten!',
|
|
cutFailed: 'Fehler beim Schneiden des Videos.',
|
|
infoDuration: 'Dauer',
|
|
infoResolution: 'Aufloesung',
|
|
infoFps: 'FPS',
|
|
infoSelection: 'Auswahl',
|
|
startLabel: 'Start:',
|
|
endLabel: 'Ende:'
|
|
},
|
|
merge: {
|
|
empty: 'Keine Videos ausgewahlt',
|
|
merging: 'Zusammenfugen...',
|
|
merge: 'Zusammenfugen',
|
|
success: 'Videos erfolgreich zusammengefugt!',
|
|
failed: 'Fehler beim Zusammenfugen der Videos.'
|
|
},
|
|
mergeGroup: {
|
|
btn: 'Zusammenfugen & Splitten',
|
|
phaseDownloading: 'VOD wird heruntergeladen',
|
|
phaseMerging: 'Zusammenfugen...',
|
|
phaseSplitting: 'Part wird erstellt',
|
|
phaseCleanup: 'Aufraumen...',
|
|
needMinTwo: 'Mindestens 2 VODs auswahlen',
|
|
titleTwo: 'Merge: {title1} + {title2}',
|
|
titleMany: 'Merge: {title1} + {count} weitere',
|
|
metaLabel: '{count} VODs',
|
|
},
|
|
updates: {
|
|
bannerDefault: 'Neue Version verfugbar!',
|
|
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: 'verfugbar!',
|
|
downloadNow: 'Jetzt herunterladen',
|
|
downloadLabel: 'Download',
|
|
ready: 'bereit zur Installation!',
|
|
installNow: 'Jetzt installieren & neu starten',
|
|
modalAvailableTitle: 'Update verfugbar',
|
|
modalAvailableMessage: 'Version {version} ist verfugbar. Jetzt herunterladen?',
|
|
modalReadyTitle: 'Update bereit',
|
|
modalReadyMessage: 'Version {version} wurde heruntergeladen. Jetzt installieren und neu starten?',
|
|
modalDismiss: 'Nein',
|
|
modalDownloadConfirm: 'Ja, herunterladen',
|
|
modalInstallConfirm: 'Ja, installieren',
|
|
modalSkipVersion: 'Diese Version ueberspringen',
|
|
changelogLabel: 'Changelog',
|
|
showChangelog: 'Changelog anzeigen',
|
|
hideChangelog: 'Changelog ausblenden',
|
|
noChangelog: 'Kein Changelog verfugbar.',
|
|
releasedLabel: 'Release'
|
|
}
|
|
} as const;
|