Changelog¶
Changelog¶
[1.0.20]¶
Fixed¶
- Interne Links überlebten die Übersetzung nicht. RTE-Inhalte speichern
Verweise als
t3://page?uid=…. Der HTML-Sanitizer, der die Antwort des Übersetzungsanbieters säubert, lässt inhrefnur http, https, mailto, tel und lokale Pfade zu — jedes andere Schema verliert das Attribut. Aus<a href="t3://page?uid=508">Ziel</a>wurde damit in jeder Übersetzung<a>Ziel</a>: Der Text stand da, das Ziel war weg. Betroffen waren native Overlays ebenso wie Einfache/Leichte Sprache — unbemerkt, weil ein Link ohnehrefim Frontend wie Fließtext aussieht.
Der URI wird jetzt vor dem Übersetzen auf eine reservierte .invalid-Adresse
abgebildet und danach zurückgesetzt (Typo3UriProtector). Der Sanitizer
bleibt eng eingestellt — er säubert fremde Ausgabe und sollte keine
zusätzlichen Schemata erlauben. Nebeneffekt: Der Anbieter bekommt den URI
URL-kodiert und übersetzt keine Wörter mehr darin.
Bereits zwischengespeicherte Übersetzungen aus der Zeit davor werden erkannt und verworfen, statt weiter ausgeliefert zu werden: Enthält die Quelle mehr verlinkte Anker als der Cache-Treffer, wird neu übersetzt.
[1.0.19]¶
Fixed¶
- Batch-Übersetzungs-Modul zeigte Zielsprachen mehrfach (z. B. „English (en)"
dreimal):
getTranslationLanguages()sammelte die Sprachen über ALLE Sites (getAllSites()), sodass in einer Multi-Site-Installation dieselbe Sprach-ID je Site einmal erschien. Die Liste wird jetzt nach Sprach-ID dedupliziert — jede Zielsprache erscheint genau einmal.
[1.0.18]¶
Added¶
- Öffentliche API
NtLingua.translateNode(node): übersetzt einen dynamisch gerenderten Teilbaum (z. B. die Suchergebnisse von nt-search) in die aktuell aktive DOM-Sprache; no-op ohne aktive Sprache.
Fixed¶
- Leerzeichen an Inline-Element-Grenzen blieben erhalten: Der Server trimmt
Segmente — bei Textknoten neben
<strong>/<mark>u. ä. verschwand das Leerzeichen an der Naht („TYPO3 Hosting" → „TYPO3Hébergement").apply()stellt führendes/abschließendes Whitespace des Quellknotens wieder her.
[1.0.17]¶
Fixed¶
ntlingua:warmup-dom: Bei leerem Site-Feldnt_lingua_dom_languagesgreift jetzt derselbe Fallback wie im Frontend (allemode:'dom'-Einträge ausLanguages.php) — vorher wurde die Site übersprungen, obwohl die Sprachbuttons angezeigt werden.
[1.0.16]¶
Added¶
- Neuer CLI-Command
ntlingua:warmup-dom(Scheduler-fähig): wärmt den DOM-Übersetzungs-Cache mit den echten Frontend-Segmenten — er rendert jede Seite aus der XML-Sitemap wie ein Besucher und extrahiert Textknoten +title/alt/placeholder/aria-label+ Seitentitel nach denselben Regeln wient-lingua.js collect()(inkl.translate="no"-/notranslate-Ausschluss). Damit treffen Browser-Anfragen den Cache wirklich — der bestehendentlingua:warmupwärmt nur rohett_content-Felder und erzeugt für den DOM-Pfad unbrauchbare Schlüssel (andere Granularität, Navigation/Footer/ ContentBlocks fehlen). Optionen:--target(Standard: Site-Feldnt_lingua_dom_languages),--site,--sitemap(explizite URL bei Redirect-Setups),--limit,--sleep,--dry-run. Bereits gecachte Segmente kosten nichts — geplante Läufe übersetzen nur Neues/Geändertes.
[1.0.15]¶
Added¶
- DOM-Übersetzung: Der Seitentitel (
document.title) wird jetzt mitübersetzt — Browser-Tab und Verlaufseintrag erscheinen in der gewählten Sprache; beim Zurücksetzen wird der Originaltitel wiederhergestellt. Läuft über denselben Cache wie die übrigen Segmente (Server + Client), kostet also nach dem ersten Mal keine weiteren Tokens.
[1.0.14]¶
Changed¶
- DOM-Übersetzung: Das Fortschritts-Overlay („Übersetze …") erscheint jetzt in der
Zielsprache (fr/es/it/hu/en/pt/nl) statt fest auf Deutsch. Fallback auf die
deutsche Phrase mit Sprachnamen für nicht gelistete Codes.
einfache/leichtebleiben auf Deutsch.
[1.0.13]¶
Fixed¶
- DOM-Übersetzung: Kaskaden-Bug behoben. Ein Wechsel Sprache A → B sammelte den
bereits übersetzten DOM (Sprache A) und schickte ihn als Quelle → jeder
Sprache-zu-Sprache-Wechsel war ein garantierter Cache-Miss (A→B war nie
gewärmt) und traf live das LLM (8–10 s je Umschaltung). Es wird jetzt immer aus
dem gespeicherten deutschen Original übersetzt (
origOf()statt des aktuell angezeigten Textes).
[1.0.12]¶
Added¶
- Client-Cache (localStorage) pro Zielsprache, Schlüssel = Quelltext (nicht URL): geteilte Chrome (Navigation/Footer) und wiederkehrende Inhalte werden einmal für die ganze Site gecacht und bei jeder Folgeseite ohne Roundtrip angewandt. Selbstinvalidierend (Schlüssel = Quelltext) plus Deploy-Stempel und 14-Tage-TTL.
- LLM-Fallback: Der Batch wird in 20er-Chunks zerlegt und — sofern der Provider es
unterstützt — nebenläufig ausgeführt (nt-ai
completeMany()via curl_multi). Rund 2× schneller.
Fixed¶
- LLM-Fallback: robuster Per-Chunk-Fallback statt „all or nothing". Bisher wurde bei einer Zähl-Diskrepanz der GESAMTE Batch als Originaltext zurückgegeben und so unübersetzt gecacht (ganze Sprachen „vergiftet", z. B. Ungarisch). Jetzt betrifft ein Fehler nur einen 20er-Chunk, mit sequentiellem Retry pro leerem Slot.
- Whitespace-Trim der LLM-Ausgabe — kein
\n…-Müll mehr im Cache. normalize()faltet jetzt auch nbsp (U+00A0) und weitere Unicode-Leerzeichen;\smatcht in PCRE nur ASCII → sonst entstanden Fast-Duplikate im Cache. Beidenormalize()-Kopien (TextTransformationService + GlossaryRepository) angeglichen.
[1.0.11]¶
Fixed¶
- Performance:
translateStrings()bündelt die Cache-Lookups in einen Batch-Query (TextCacheRepository::getMany(),content_hash IN (…)) statt einem Query pro Segment. Gegen die entfernte Live-DB waren das hunderte sequentielle Roundtrips → sekundenlanger, „hängender" Spinner bei Volltext-Übersetzung (128 gecachte Segmente: 12 s → ~1 s).
[1.0.10]¶
Fixed¶
- Glossar:
rootLevel = -1ergänzt — Einträge lassen sich jetzt auch auf Root-Level (pid=0) anlegen, nicht nur auf Seiten.
[1.0.9]¶
Fixed¶
- Container-Übersetzung (Korrektur zu 1.0.8): Das
tx_container_parentder Kind-Overlays zeigt jetzt auf das Default-Sprach-Container-Record statt auf das übersetzte Container-Overlay — so verlangt es b13/container im Connected-Mode (vgl.container:fixContainerParentForConnectedMode). 1.0.8 hatte auf das Overlay gezeigt, was pro Kind einenChildInTranslatedContainerErrorund im Backend „doppelte/verwaiste" Elemente erzeugte. Frontend war in beiden Fällen ok.
[1.0.8]¶
Fixed¶
- Native Übersetzung von Seiten mit EXT:container-Struktur (Spalten/Grids):
Container werden jetzt in Hierarchie-Reihenfolge lokalisiert (Container vor
Kindern) und
tx_container_parentder Overlays auf die Container-Overlays umgebogen. Vorher blieben die Kind-Overlays verwaist (colPos ohne Container → „unbenutzte Elemente"), Spalten/Bilder fehlten und beim Lokalisieren eines Kindes vor seinem Container trat eine Exception auf. - Glossar-Records lassen sich jetzt auf jedem Seitentyp anlegen
(
ctrl.security.ignorePageTypeRestriction), inkl. Root-Seite. Zielsprache-Feld mit Hinweis ergänzt, dass*für alle Sprachen gilt. Doku: Ablageort istpid-unabhängig (global gelesen).
[1.0.7]¶
Fixed¶
- Einfache/Leichte Sprache: Inline-HTML (
<img>,<span>,<a>…) in Textblöcken wurde nach der KI-Umschreibung als literaler Text ausgegeben. Inline-Markup wird jetzt vor dem KI-Call durch Platzhalter-Token geschützt und danach 1:1 wieder eingesetzt (analog zum DeepL-Pfadtag_handling=html).
[1.0.6]¶
Fixed¶
- DOM-Übersetzung: Der Transform-Endpoint akzeptiert jetzt die im Site-Setting
nt_lingua_dom_languageskonfigurierten Sprachen (nicht nur die ausLanguages.php).
[Unreleased]¶
Added¶
- Initial release