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:
2026-04-29 09:57:22 +02:00
parent 2e73cb98b4
commit 545bcc789b
39 changed files with 499 additions and 237 deletions

View File

@@ -4,7 +4,7 @@ Letzte Aktualisierung: 2026-03-26
## Ziel
Schritt-fuer-Schritt Anleitung: vom leeren Verzeichnis zum lauffaehigen Modul mit Route, Permission, UI-Slot und Test.
Schritt-für-Schritt Anleitung: vom leeren Verzeichnis zum lauffaehigen Modul mit Route, Permission, UI-Slot und Test.
## Voraussetzungen
@@ -54,7 +54,7 @@ return [
];
```
Alternative: `APP_ENABLED_MODULES` Umgebungsvariable (ueberschreibt die Datei).
Alternative: `APP_ENABLED_MODULES` Umgebungsvariable (überschreibt die Datei).
## Schritt 3: Manifest konfigurieren
@@ -138,7 +138,7 @@ final class MeinModulContainerRegistrar implements ContainerRegistrar
}
```
Ohne diese Registrierung wird die Policy von `ModuleClassResolver` ignoriert und die Permission-Pruefung fuer UI-Slots schlaegt fehl (Slot wird nicht angezeigt).
Ohne diese Registrierung wird die Policy von `ModuleClassResolver` ignoriert und die Permission-Prüfung für UI-Slots schlaegt fehl (Slot wird nicht angezeigt).
## Schritt 5: Erste Seite anlegen
@@ -171,14 +171,14 @@ Datei `modules/mein-modul/pages/mein-modul/index(default).phtml`:
docker compose exec php php bin/console module:sync
```
Dieser Befehl fuehrt automatisch aus:
Dieser Befehl führt automatisch aus:
1. `module:migrate` — SQL-Migrationen anwenden
2. `module:permissions-sync` — Permissions registrieren
3. `module:build` — Seiten-Symlinks erstellen
4. `module:assets-sync` — CSS/JS-Assets veroeffentlichen
Nach jedem Manifest-Aenderung erneut ausfuehren.
Nach jedem Manifest-Änderung erneut ausführen.
## Schritt 7: Validieren
@@ -186,7 +186,7 @@ Nach jedem Manifest-Aenderung erneut ausfuehren.
docker compose exec php php bin/console module:validate mein-modul
```
Prueft: Manifest-Syntax, Klassen-Existenz, Namespace-Konventionen, Verzeichnisstruktur.
Prüft: Manifest-Syntax, Klassen-Existenz, Namespace-Konventionen, Verzeichnisstruktur.
## Schritt 8: Testen
@@ -195,7 +195,7 @@ docker compose exec php vendor/bin/phpunit --filter=MeinModul
docker compose exec php vendor/bin/phpstan analyse -c phpstan.neon modules/mein-modul/
```
Architektur-Tests (pruefen automatisch Namespace-Isolation, Session-Key-Prefix, Manifest-Contract):
Architektur-Tests (prüfen automatisch Namespace-Isolation, Session-Key-Prefix, Manifest-Contract):
```bash
docker compose exec php vendor/bin/phpunit tests/Architecture/
@@ -203,7 +203,7 @@ docker compose exec php vendor/bin/phpunit tests/Architecture/
---
## Erweitern: Haeufige Erweiterungspunkte
## Erweitern: Häufige Erweiterungspunkte
### UI-Slot: Sidebar-Tab
@@ -278,11 +278,11 @@ Fuer globale Assets (auf jeder Seite) stattdessen `layout.head_style` oder `runt
Interface: `core/App/Module/Contracts/SessionProvider.php` (Methoden: `populate()`, `clear()`).
**Session-Key-Konvention:** `module.mein-modul.*` (wird per Architektur-Test geprueft).
**Session-Key-Konvention:** `module.mein-modul.*` (wird per Architektur-Test geprüft).
### Layout-Kontext
`LayoutContextProvider` implementieren — liefert Daten fuer Templates bei jedem Page-Render:
`LayoutContextProvider` implementieren — liefert Daten für Templates bei jedem Page-Render:
```php
'layout_context_providers' => [
@@ -292,7 +292,7 @@ Interface: `core/App/Module/Contracts/SessionProvider.php` (Methoden: `populate(
Interface: `core/App/Module/Contracts/LayoutContextProvider.php` (Methode: `provide()`).
**Key-Konvention:** Top-Level-Keys muessen namespaced sein: `mein-modul.nav`, nicht `nav`.
**Key-Konvention:** Top-Level-Keys müssen namespaced sein: `mein-modul.nav`, nicht `nav`.
### Event-Listener
@@ -308,7 +308,7 @@ Interface: `core/App/Module/Contracts/EventListener.php` (Methode: `handle(strin
### Scheduler-Job
Siehe `/docs/howto-geplante-aufgaben.md` und `modules/audit/module.php` fuer Beispiele.
Siehe `/docs/howto-geplante-aufgaben.md` und `modules/audit/module.php` für Beispiele.
### Modul-eigene Datenbank
@@ -317,16 +317,16 @@ Siehe `/docs/howto-geplante-aufgaben.md` und `modules/audit/module.php` fuer Bei
```
SQL-Dateien unter `modules/mein-modul/db/updates/` — idempotent (IF NOT EXISTS, ON DUPLICATE KEY).
Ausgefuehrt ueber `php bin/console module:migrate`.
Ausgeführt über `php bin/console module:migrate`.
### Uebersetzungen
### Übersetzungen
```php
'i18n_path' => 'i18n',
```
Dateien: `modules/mein-modul/i18n/default_de.json`, `modules/mein-modul/i18n/default_en.json`.
Schluessel werden per `t('key')` aufgeloest — identisch zu Core-Translations.
Schlüssel werden per `t('key')` aufgeloest — identisch zu Core-Translations.
### Abhaengigkeit von anderem Modul
@@ -334,7 +334,7 @@ Schluessel werden per `t('key')` aufgeloest — identisch zu Core-Translations.
'requires' => ['notifications'],
```
Nicht-deklarierte Cross-Module-Imports sind verboten und werden per Architektur-Test geprueft.
Nicht-deklarierte Cross-Module-Imports sind verboten und werden per Architektur-Test geprüft.
---
@@ -351,13 +351,13 @@ Nicht-deklarierte Cross-Module-Imports sind verboten und werden per Architektur-
- [ ] Session-Keys verwenden `module.<id>.*` Prefix
- [ ] Keine Core-Namespaces (`MintyPHP\Service\*`, `MintyPHP\Repository\*`) im Modul-Code
## Haeufige Fehler
## Häufige Fehler
| Problem | Ursache | Loesung |
| Problem | Ursache | Lösung |
|---|---|---|
| Sidebar-Tab/UI-Slot wird nicht angezeigt | AuthorizationPolicy nicht im Container registriert | Policy in ContainerRegistrar mit `PermissionService` registrieren |
| 404 auf Modul-Route | `module:sync` nicht ausgefuehrt | `php bin/console module:sync` |
| 404 auf Modul-Route | `module:sync` nicht ausgeführt | `php bin/console module:sync` |
| Permission existiert nicht | Permission nicht in Manifest deklariert | `permissions`-Array in `module.php` ergaenzen, dann `module:sync` |
| CSS/JS werden nicht geladen | Assets nicht veroeffentlicht | `php bin/console module:assets-sync` oder `module:sync` |
| RuntimeException: fingerprint mismatch | Build veraltet nach Manifest-Aenderung | `php bin/console module:sync` |
| RuntimeException: fingerprint mismatch | Build veraltet nach Manifest-Änderung | `php bin/console module:sync` |
| Namespace-Fehler in Tests | Modul-Klasse in Core-Namespace | Alle Klassen unter `MintyPHP\Module\<Name>\*` |