---
title: "Important: Translation sync is routed through the DataHandler"
manual: "Academic Profiles"
version: "main"
source: "Changelog/3.0/Important-TranslationSyncRoutedThroughDataHandler.rst"
rendered: "2026-10-02T20:47:49+00:00"
---

# Important: Translation sync is routed through the DataHandler {#important-1788193381}

## Description {#description}

`\FGTCLB\AcademicPersons\Service\RecordSynchronizer` — the service behind
the `AfterProfileUpdateEvent` listener that keeps profile translations in
sync — previously wrote its translations with raw SQL. That implementation had
drifted a long way from what a translation write in TYPO3 involves.

**The synchronisation only ever touched the top-level row.** The recursion into
inline children was dead code since version 2.1.0: a contract, address, email or
phone number was never translated along with its profile, and a contract added
after the translation existed was never carried over. File references and MM
relations (the profile image, related frontend users) were skipped even by
design, and `l10n_diffsource` was left empty, so the backend diff view had
nothing to show.

**Every write was a live row, regardless of the acting workspace** — an
unpublished draft leaked into the live site the moment anything triggered a
synchronisation from within a workspace.

The service now routes every write through the TYPO3 `DataHandler`. A
missing translation is created with a `localize` command, which carries the
full inline child tree, file references, MM relations and the diff source. For
an existing translation, the current values of the `l10n_mode=exclude`
columns are re-submitted as a datamap, so core's `DataMapProcessor`
propagates them, and an `inlineLocalizeSynchronize` command per inline
column carries children added later — including their own children.

## Impact {#impact}

**Child records are actually synchronised again.** A profile synchronisation
now translates contracts and their children, file references and MM relations,
as it did before 2.1.0. Note that this also re-activates the known
contacts4pages behaviour where a translated contact keeps pointing at an
untranslated default-language page.

**Writes are workspace aware.** A backend user acting in a workspace produces
versioned rows only (`t3ver_wsid`, `t3ver_state`); the live site is
untouched until the workspace is published. A frontend-triggered
synchronisation acting in a non-live workspace is refused entirely and logs a
notice instead of writing anything.

Because the writes go through the DataHandler they now also update the
reference index and record history, fire hooks, and bump `tstamp` on
updated translations.

## Affected Installations {#affected-installations}

Every installation that enables the translation synchronisation through the
`profile.allowedLanguages` setting of EXT:academic_persons_edit, or that
dispatches `AfterProfileUpdateEvent` from its own hooks.
