Zum Inhalt

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 in href nur 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 ohne href im 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-Feld nt_lingua_dom_languages greift jetzt derselbe Fallback wie im Frontend (alle mode:'dom'-Einträge aus Languages.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 wie nt-lingua.js collect() (inkl. translate="no"-/notranslate-Ausschluss). Damit treffen Browser-Anfragen den Cache wirklich — der bestehende ntlingua:warmup wärmt nur rohe tt_content-Felder und erzeugt für den DOM-Pfad unbrauchbare Schlüssel (andere Granularität, Navigation/Footer/ ContentBlocks fehlen). Optionen: --target (Standard: Site-Feld nt_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/leichte bleiben 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; \s matcht in PCRE nur ASCII → sonst entstanden Fast-Duplikate im Cache. Beide normalize()-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 = -1 ergä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_parent der 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 einen ChildInTranslatedContainerError und 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_parent der 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 ist pid-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-Pfad tag_handling=html).

[1.0.6]

Fixed

  • DOM-Übersetzung: Der Transform-Endpoint akzeptiert jetzt die im Site-Setting nt_lingua_dom_languages konfigurierten Sprachen (nicht nur die aus Languages.php).

[Unreleased]

Added

  • Initial release