Lokalisierung von Extbase-Objekten
Eines unserer Projekte ist der Internetauftritt und gleichzeit Mitarbeiter- und Studentenportal der Hochschule Pforzheim. Ein großer und komplexer Teil ist das Personenverzeichnis, bei dem aus mehreren fremden Diensten Daten importiert und gepflegt werden müssen. Die Daten landen danach in einer Solr-Instanz.
Die Daten der Dienste und die Webseite sind lokalisiert. Da wir die Daten beim Import programmatisch anlegen müssen wir im selben Schritt auch die lokalisierten Daten erstellen und mit den Originalen verknüpfen, sodass die TYPO3 interne Lokalisierungslogik ausgenutzt werden kann.
Language-Overlay und das Repository
Als Problem trat hier das Language-Overlay von TYPO3 auf. Im CommandController konnten wir zwar die Spracheinschränkung abstellen, allerdings konnte nicht verhindert werden, dass die englischen Datensätze trotzdem ins Deutsche übersetzt wurden. Also gab es alles zwei mal.
Manuell das TCA des betreffenden Models am Scriptanfang anzupassen und nach getaner Arbeit wird herzustellen konnte das Problem lösen.
Am Anfang:
$transOrigPointerTable = $GLOBALS['TCA']['tx_ext_model_domain_modelname']['ctrl']['transOrigPointerTable'];
$GLOBALS['TCA']['tx_ext_model_domain_modelname']['ctrl']['transOrigPointerTable'] = '';
Und am Ende:
$GLOBALS['TCA']['tx_wracadem_domain_model_person']['ctrl']['transOrigPointerTable'] = $transOrigPointerTable;
Dynamischer Feldzugriff mit Sprach-Flag
Eine Quelle von Personendaten sind XML-Dateien (eine pro Person). Die Übersetzungen liegen in der selben Datei als Kindelemente in dem jeweiligen Feld.
Ist beispielsweise das Feld "title" lokalisiert sieht das im XML so aus:
<title>
<lib_de>Deutscher Titel</lib_de>
<lib_en>Englischer Titel</lib_en>
</title>
Aus dem XML wird ein SimpleXMLElement, auf das wir zugreifen und die Felder in unserem Model setzen.
Es gibt also etwas von dieser Art pseudo-code, der bereits vor der lokalisierung vorhanden war:
funktion createPerson(SimpleXMLElement)
newPerson.field = SimpleXMLElement.field_de
...
return newPerson
Dass auf "field_de" statisch zugegriffen wird ist ungünstig, da das Feld im englischen Datensatz anders heißt.
Da wir zwei Objekte erstellen müssen (original und übersetzt), und wir unseren Code wiederverwendbar halten wollen (auch für dazukommende Sprachen), haben wir uns eines Sprachfeatures von PHP bedient. Man kann innerhalb von beispielsweise Variablennamen oder Methodennamen wiederum Variablen verwenden.
Für die Biographie einer Person sieht das dann so aus:
$language_flag = "en"; //ist ein Übergabeparameter an erstellePerson
$person->setBio((string)$xml->{"bio_$language_flag"});
Diese Zeile ist mit den gesetzten Bedingungn ($language_flag = "en") äquivalent zu:
$person->setBio((string)$xml->bio_en);
Auf diese Weise muss für eine neue Sprache (insofern die XML-Struktur übernommen wird und die neue Sprache als weiters Kindelement der selben Form dazukommt) beim Anlegen des neuen Datensatzes einfach die selbe Methode aufgerufen werden, nur mit dem neuen Sprachkürzel und ein wenig Anpassung bei der Verknüpfung der Datensätze zum Original.