feat(nextcloud-status): Modul mit Statusabruf, Versionsbewertung und Kachelansicht

- NextcloudInstance mit Zeilenschutz, Migration 20261002150000
- Bewertung (Ampel) als reine Funktion, status.php-Abruf mit Grenzen, endoflife.date-Zwischenspeicher
- API: Liste mit Bewertung, Anlegen und Einzelprüfung nur mit Verwalten
- Modulseite mit Kacheln, Registrierung in Seitenleiste, Marktplatz und Symbolen

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-02 14:49:02 +02:00
parent 7188733f70
commit 5ef7b0c6cc
31 changed files with 2513 additions and 2 deletions
+38
View File
@@ -1814,5 +1814,43 @@
"procurement": "Beschaffung",
"accounting": "Finanzbuchhaltung",
"custom-modules": "Eigene Module"
},
"nextcloudStatus": {
"title": "Nextcloud-Status",
"description": "Versionen und Erreichbarkeit Ihrer Nextcloud-Clouds im Blick",
"loading": "Clouds werden geladen …",
"loadError": "Die Clouds konnten nicht geladen werden. Bitte laden Sie die Seite neu.",
"empty": "Es sind noch keine Clouds eingetragen.",
"emptyManage": "Fügen Sie Ihre erste Cloud über „Cloud hinzufügen“ hinzu.",
"newestVersion": "Neueste Nextcloud-Version: {version}",
"referenceUnavailable": "Versionsdaten derzeit nicht verfügbar",
"card": {
"version": "Version",
"versionUnknown": "—",
"lastCheck": "Zuletzt geprüft {age}",
"neverChecked": "Noch nie geprüft",
"openCloud": "Cloud im neuen Tab öffnen",
"noLogo": "Kein Logo"
},
"level": {
"green": "Grün",
"yellow": "Gelb",
"red": "Rot",
"unknown": "Ohne Bewertung"
},
"reason": {
"current": "Aktuell",
"updateAvailable": "Update auf {version} verfügbar",
"eolSoon": "Support endet am {date}",
"eolPassed": "Support abgelaufen seit {date}",
"eolPassedNoDate": "Support abgelaufen",
"unreachable": "Nicht erreichbar",
"invalidResponse": "Keine gültige Nextcloud-Antwort",
"maintenance": "Wartungsmodus",
"needsDbUpgrade": "Datenbank-Aktualisierung ausstehend",
"noReference": "Bewertung nicht möglich",
"versionUnknown": "Version unbekannt",
"notChecked": "Noch nicht geprüft"
}
}
}
+38
View File
@@ -1814,5 +1814,43 @@
"procurement": "Procurement",
"accounting": "Financial accounting",
"custom-modules": "Custom modules"
},
"nextcloudStatus": {
"title": "Nextcloud status",
"description": "Keep track of versions and availability of your Nextcloud clouds",
"loading": "Loading clouds …",
"loadError": "The clouds could not be loaded. Please reload the page.",
"empty": "No clouds have been added yet.",
"emptyManage": "Add your first cloud with “Add cloud”.",
"newestVersion": "Newest Nextcloud version: {version}",
"referenceUnavailable": "Version data currently unavailable",
"card": {
"version": "Version",
"versionUnknown": "—",
"lastCheck": "Last checked {age}",
"neverChecked": "Never checked",
"openCloud": "Open cloud in a new tab",
"noLogo": "No logo"
},
"level": {
"green": "Green",
"yellow": "Yellow",
"red": "Red",
"unknown": "Not rated"
},
"reason": {
"current": "Up to date",
"updateAvailable": "Update to {version} available",
"eolSoon": "Support ends on {date}",
"eolPassed": "Support ended on {date}",
"eolPassedNoDate": "Support ended",
"unreachable": "Not reachable",
"invalidResponse": "Not a valid Nextcloud response",
"maintenance": "Maintenance mode",
"needsDbUpgrade": "Database upgrade pending",
"noReference": "Rating not possible",
"versionUnknown": "Version unknown",
"notChecked": "Not checked yet"
}
}
}
@@ -103,6 +103,9 @@ export const UMLAUT_REPLACEMENTS: Record<string, string> = {
* and must never be touched by the replacement or flagged by the guard.
*/
export const UMLAUT_ALLOWLIST: readonly string[] = [
// quick-261002-k67: Nextcloud-Status (korrektes Deutsch)
'Neueste',
'ausstehend',
// quick-261001-l4q: Zertifikatsmodul, Übersicht (korrektes Deutsch)
'Aussteller',
'Betriebssystemen',