# Übersetzungs-Pipeline

> Wie übersetzbare Strings vom Quellcode bis zur Laufzeit fließen (xgettext → Weblate → PO → PHP)

---

Das Modul bringt seine eigenen Übersetzungen über die Standard-gettext-Kette ein, gehostet auf [**Codeberg Weblate**](https://translate.codeberg.org/projects/wt-modules/linkenhancer/).

## Ablauf




<pre class="mermaid">flowchart TB
    subgraph Extraction[&#34;1️⃣ Quellcode → POT&#34;]
        direction LR
        PHP[&#34;📝 src/*.php&#34;] --&gt;|npx gulp updatepo| POT[&#34;📄 messages.pot&#34;]
    end

    subgraph Translation[&#34;2️⃣ Übersetzung&#34;]
        direction LR
        WEBLATE[&#34;🌐 Weblate&#34;] --&gt;|download| PO[&#34;🗝 &lt;lang&gt;.po&#34;]
    end

    subgraph Rendering[&#34;3️⃣ Webtrees&#34;]
        direction LR
        PHPARR[&#34;📦 lang.php&#34;] --&gt;|I18N| RENDER[&#34;✅ Rendering&#34;]
    end

    POT --&gt;|upload| Translation
    PO --&gt;|npx gulp po2php| Rendering

    classDef sourceStyle fill:#e3f2fd,stroke:#1565C0,stroke-width:2px
    classDef fileStyle fill:#e8f5e9,stroke:#2E7D32,stroke-width:2px
    classDef weblateStyle fill:#f3e5f5,stroke:#7B1FA2,stroke-width:2px
    classDef renderStyle fill:#fce4ec,stroke:#C2185B,stroke-width:2px

    class PHP sourceStyle
    class POT,PO,PHPARR fileStyle
    class WEBLATE weblateStyle
    class RENDER renderStyle
</pre>

## Strings extrahieren

<a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/util/update-po-files.sh" target="_blank" rel="noopener"><code>update-po-files.sh</code></a>
 führt `xgettext` über jede `*.php` / `*.phtml` aus, außer `util/`, `vendor/`, `node_modules/` und `tests/`:

```bash
xgettext -L PHP \
  --keyword=translate --keyword=plural:1,2 --keyword=translateContext:1c,2 \
  --add-comments=I18N --from-code=utf-8 \
  --output=resources/lang/messages.pot …
```

Zwei Marker-Helfer steuern, was extrahiert wird:

- `I18N::translate()` / `MoreI18N::translate()` — **modulspezifische** Strings. `translate` ist ein xgettext-Keyword, daher werden diese aufgenommen.
- `MoreI18N::xlate()` — Strings, die **bereits vom webtrees-Core-POT** abgedeckt sind. Gleiches Laufzeit-Verhalten, anderer Name, daher unsichtbar für xgettext. Nach einem Core-Update `messages.pot` mit dem Core-POT vergleichen und neu abgedeckte msgids auf `xlate()` umstellen.

`/* I18N: … */`-Kommentare geben Übersetzern Kontext (über `--add-comments=I18N` aufgenommen).

## PO → PHP

`.po`-Dateien werden **nicht** lokal gemergt — das ist Weblates Aufgabe, um Konflikte zu vermeiden. Sobald Weblate aktualisierte `.po`-Dateien liefert, kompilieren:

```bash
npx gulp po2php
```

> **Hinweis:** ein früherer `.po` → `.mo`-Schritt ist überflüssig (Formatwechsel bei den Übersetzungen, [Issue #88](https://codeberg.org/bschwede/linkenhancer/issues/88)).
