docs: replace ASCII umlaut fallbacks with proper äöüß across all .md
Most German docs were written with `ue`/`ae`/`oe`/`ss` ASCII fallbacks (`fuer`, `aenderung`, `koennen`, `gemaess`) — relic from older toolchain constraints. Replaced 237 occurrences across 38 .md files with proper umlauts and ß so the docs read naturally. Substitutions are constrained to plain prose: fenced code blocks (```...```), inline code spans (`...`), markdown link targets `[..](..)`, and HTML comments are preserved verbatim. Path references like `docs/howto-erste-aenderung.md` keep their original (umlaut-replaced) filenames — only the surrounding prose is normalised. Tool: bin/fix-md-umlauts.py (idempotent — no-op on already-clean files). Re-runnable if ASCII fallbacks creep back in via copy-paste. Doc-link-check + doc-drift-check stay green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4,7 +4,7 @@ Letzte Aktualisierung: 2026-03-25
|
||||
|
||||
## Ziel
|
||||
|
||||
Referenz fuer das Modul `notifications`: Event-Registrierung, Erzeugungsregeln, Guardrails, Frontend-Vertrag und Testbarkeit.
|
||||
Referenz für das Modul `notifications`: Event-Registrierung, Erzeugungsregeln, Guardrails, Frontend-Vertrag und Testbarkeit.
|
||||
|
||||
## Scope v1
|
||||
|
||||
@@ -15,7 +15,7 @@ Referenz fuer das Modul `notifications`: Event-Registrierung, Erzeugungsregeln,
|
||||
- `user.activated`
|
||||
- `user.deactivated`
|
||||
- `user.assignment_changed`
|
||||
- Dedupe fuer diese Typen mit 30 Minuten Fenster.
|
||||
- Dedupe für diese Typen mit 30 Minuten Fenster.
|
||||
|
||||
## Modul-Verkabelung
|
||||
|
||||
@@ -25,7 +25,7 @@ Kanonische Quelle: `modules/notifications/module.php`
|
||||
- mappt Eventtyp -> Listenerklasse + Methode `handle`.
|
||||
- `ui_slots`
|
||||
- `topbar.right_item`: Bell-Template
|
||||
- `layout.head_style`: Modul-CSS fuer Topbar + Dropdown
|
||||
- `layout.head_style`: Modul-CSS für Topbar + Dropdown
|
||||
- `runtime.component`: Bell-JS (`initNotificationBell`)
|
||||
- `permissions`
|
||||
- `notifications.view`
|
||||
@@ -45,9 +45,9 @@ Kanonische Quelle: `modules/notifications/module.php`
|
||||
5. `NotificationRepository` persistiert in `user_notifications`.
|
||||
6. Bell-Endpunkte lesen tenant-scoped Daten und aktualisieren den Session-`unread_count`.
|
||||
|
||||
## Producer-Contract (fuer Core + andere Module)
|
||||
## Producer-Contract (für Core + andere Module)
|
||||
|
||||
Stabile Erzeugung erfolgt ueber:
|
||||
Stabile Erzeugung erfolgt über:
|
||||
|
||||
- `MintyPHP\Module\Notifications\Service\NotificationMessage`
|
||||
- `MintyPHP\Module\Notifications\Service\NotificationService::createFromMessage(...)`
|
||||
@@ -78,7 +78,7 @@ $notificationService->createForTenantAdminUsersFromMessage(
|
||||
);
|
||||
```
|
||||
|
||||
Plain/Fallback-Erzeugung bleibt moeglich mit `NotificationMessage::plain(...)`.
|
||||
Plain/Fallback-Erzeugung bleibt möglich mit `NotificationMessage::plain(...)`.
|
||||
|
||||
## Datenvertrag Notification
|
||||
|
||||
@@ -90,7 +90,7 @@ Persistierter Kernvertrag:
|
||||
- `link` (nullable string)
|
||||
- `data` (nullable JSON)
|
||||
|
||||
Erweiterung fuer locale-neutrale Texte:
|
||||
Erweiterung für locale-neutrale Texte:
|
||||
|
||||
- `data.__message.title_key` (string)
|
||||
- `data.__message.title_params` (array)
|
||||
@@ -111,20 +111,20 @@ Dedupe-Metadaten (intern):
|
||||
- Alle Bell-Endpunkte erzwingen:
|
||||
- Login
|
||||
- Ability `notifications.view`
|
||||
- POST-Endpunkte (`mark-read`, `delete`) pruefen CSRF.
|
||||
- POST-Endpunkte (`mark-read`, `delete`) prüfen CSRF.
|
||||
- Tenant-Scope wird serverseitig aus `current_tenant` erzwungen.
|
||||
- SQL ausschliesslich im Repository (`NotificationRepository`), Service nur Orchestrierung.
|
||||
|
||||
## Guardrails (Frontend)
|
||||
|
||||
- Endpunkte werden mit App-Base-URL gebaut (kein harter Root-Pfad).
|
||||
- Fehlerpfade laufen ueber zentrale Telemetrie (`warn_once`).
|
||||
- Fehlerpfade laufen über zentrale Telemetrie (`warn_once`).
|
||||
- A11y-Klickzeilen im Dropdown sind lokal gestylt, damit globale `[role="button"]` Regeln nicht durchschlagen.
|
||||
- Default-`details/summary`-Chevron wird pro Komponente ueber `data-summary-chevron="none"` deaktiviert.
|
||||
- Default-`details/summary`-Chevron wird pro Komponente über `data-summary-chevron="none"` deaktiviert.
|
||||
|
||||
## Template/Partial Best Practice
|
||||
|
||||
- Core-Partials immer ueber `templatePath('partials/...')` einbinden.
|
||||
- Core-Partials immer über `templatePath('partials/...')` einbinden.
|
||||
- Keine fragilen relativen Tiefenpfade auf Core-Templates verwenden.
|
||||
- Modulinterne Templates bleiben lokal relativ zum Modul.
|
||||
|
||||
@@ -138,22 +138,22 @@ Dedupe-Metadaten (intern):
|
||||
|
||||
### Unit
|
||||
|
||||
- Listener-Tests fuer alle Core-5 Typen:
|
||||
- Listener-Tests für alle Core-5 Typen:
|
||||
- Empfaengerregeln
|
||||
- Actor-Exclusion
|
||||
- ungultige/leere Payloads
|
||||
- Service-Tests fuer Dedupe (created vs suppressed)
|
||||
- Policy-Tests fuer `notifications.view`
|
||||
- Service-Tests für Dedupe (created vs suppressed)
|
||||
- Policy-Tests für `notifications.view`
|
||||
|
||||
### Integration/Flow
|
||||
|
||||
- End-to-End fuer create/delete/activate/deactivate/assignment-change.
|
||||
- Bell-Endpunkte mit Tenant-Scope und Permission-Pruefung.
|
||||
- End-to-End für create/delete/activate/deactivate/assignment-change.
|
||||
- Bell-Endpunkte mit Tenant-Scope und Permission-Prüfung.
|
||||
- Bulk-Flows dispatchen konsistent.
|
||||
|
||||
### Manueller Smoke
|
||||
|
||||
1. Zwei Admins im selben Tenant, einer als Actor.
|
||||
2. Actor fuehrt User-Aktion aus.
|
||||
2. Actor führt User-Aktion aus.
|
||||
3. Zweiter Admin sieht Bell-Badge + Listeneintrag.
|
||||
4. Wiederholung innerhalb 30 Minuten erzeugt kein Duplikat.
|
||||
|
||||
Reference in New Issue
Block a user