feat(quick-261003-387): Verwaltungsseite Kategorien, Marktplatz-Reihenfolge, Formular, Texte, CHANGELOG und Handbuch

- Administrator -> Module -> Kategorien: anlegen, umbenennen, sortieren, Eintraege zuordnen und sortieren, loeschen mit Zielauswahl
- Marktplatz-Filter folgen der Kategorienreihenfolge, Kategorieseite und Modulliste zeigen gespeicherte Namen
- Formular fuer eigene Module bietet alle Kategorien der Organisation an
- Texte de/en, CHANGELOG, Handbuch Administration und Anwender

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-03 02:48:04 +02:00
parent af1878d5ee
commit f2c0a896e8
16 changed files with 1173 additions and 14 deletions
+35
View File
@@ -864,6 +864,7 @@
"deactivateSuccess": "Modul erfolgreich deaktiviert",
"error": "Fehler bei der Modulverwaltung",
"grantsLink": "Freigaben-Matrix",
"categoriesLink": "Kategorien",
"grants": {
"title": "Freigaben-Matrix",
"searchPlaceholder": "Module oder Gruppen durchsuchen...",
@@ -874,6 +875,40 @@
"saveError": "Freigabe konnte nicht gespeichert werden. Bitte erneut versuchen.",
"noSearchResults": "Kein Treffer für „{search}\" — weder bei den Modulen noch bei den Gruppen."
},
"categories": {
"title": "Kategorien",
"description": "Legen Sie fest, wie die Module in der Seitenleiste und im Marktplatz gruppiert und sortiert werden. Die Einstellung gilt für alle Benutzer.",
"backToModules": "Zurück zu Module",
"createLabel": "Neue Kategorie",
"createPlaceholder": "Name der Kategorie",
"createButton": "Kategorie anlegen",
"moveUp": "Kategorie nach oben verschieben",
"moveDown": "Kategorie nach unten verschieben",
"itemMoveUp": "Eintrag nach oben verschieben",
"itemMoveDown": "Eintrag nach unten verschieben",
"rename": "Umbenennen",
"renameLabel": "Neuer Name",
"renameSave": "Speichern",
"renameCancel": "Abbrechen",
"delete": "Löschen",
"deleteBlocked": "Diese Kategorie kann nicht gelöscht werden",
"empty": "Keine Module in dieser Kategorie",
"customBadge": "Eigenes Modul",
"itemCategory": "Kategorie",
"itemCategoryLabel": "Kategorie für {name}",
"personalNote": "Außerdem {count, plural, one {# persönlicher Eintrag} other {# persönliche Einträge}} von Benutzern",
"loadError": "Die Kategorien konnten nicht geladen werden. Bitte versuchen Sie es erneut.",
"saveError": "Die Änderung konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.",
"deleteDialog": {
"title": "Kategorie löschen",
"bodyEmpty": "Die Kategorie „{name}“ ist leer und wird gelöscht.",
"bodyMove": "Die Kategorie „{name}“ enthält Einträge. Diese Module werden in die Kategorie verschoben, die Sie hier wählen – auch persönliche Einträge von Benutzern. Es geht nichts verloren.",
"target": "Verschieben nach",
"confirm": "Löschen",
"confirmMove": "Verschieben und löschen",
"cancel": "Abbrechen"
}
},
"activationDialog": {
"title": "Modul aktivieren: {module}",
"body": "Soll die Standardgruppe sofort Zugriff auf dieses Modul erhalten, oder möchten Sie die Freigaben separat konfigurieren?",
+35
View File
@@ -864,6 +864,7 @@
"deactivateSuccess": "Module deactivated successfully",
"error": "Error managing module",
"grantsLink": "Grants Matrix",
"categoriesLink": "Categories",
"grants": {
"title": "Grants Matrix",
"searchPlaceholder": "Search modules or groups...",
@@ -874,6 +875,40 @@
"saveError": "Could not save grant. Please try again.",
"noSearchResults": "No match for \"{search}\" — neither in the modules nor in the groups."
},
"categories": {
"title": "Categories",
"description": "Decide how modules are grouped and sorted in the sidebar and in the marketplace. The setting applies to all users.",
"backToModules": "Back to Modules",
"createLabel": "New category",
"createPlaceholder": "Category name",
"createButton": "Add category",
"moveUp": "Move category up",
"moveDown": "Move category down",
"itemMoveUp": "Move entry up",
"itemMoveDown": "Move entry down",
"rename": "Rename",
"renameLabel": "New name",
"renameSave": "Save",
"renameCancel": "Cancel",
"delete": "Delete",
"deleteBlocked": "This category cannot be deleted",
"empty": "No modules in this category",
"customBadge": "Custom module",
"itemCategory": "Category",
"itemCategoryLabel": "Category for {name}",
"personalNote": "Also {count, plural, one {# personal entry} other {# personal entries}} created by users",
"loadError": "The categories could not be loaded. Please try again.",
"saveError": "The change could not be saved. Please try again.",
"deleteDialog": {
"title": "Delete category",
"bodyEmpty": "The category “{name}” is empty and will be deleted.",
"bodyMove": "The category “{name}” contains entries. These modules are moved to the category you choose here, including personal entries created by users. Nothing is lost.",
"target": "Move to",
"confirm": "Delete",
"confirmMove": "Move and delete",
"cancel": "Cancel"
}
},
"activationDialog": {
"title": "Activate Module: {module}",
"body": "Should the default group get immediate access to this module, or would you rather configure grants separately?",
@@ -103,6 +103,8 @@ 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-261003-387: Kategorienverwaltung (korrektes Deutsch)
'Neuer',
// quick-261002-k67: Nextcloud-Status (korrektes Deutsch)
'Neueste',
'ausstehend',