Extbase / Fluid: Übersetzungen in Fluid-Arrays für ViewHelper

Extbase und Fluid nehmen dem Entwickler einiges an Arbeit bei der Extension-Entwicklung für TYPO3 ab, insbesondere auch dann, wenn es zum Beispiel um die Sichtbarkeit und Lokalisierung von anzuzeigenden Datensätzen geht. Allerdings muss man – auch wegen der zum Teil noch sehr dürftigen Dokumentation des relativ neuen Frameworks – manchmal viel Zeit in die Suche nach einer bestimmten Lösung investieren. Ein Beispiel sind unter anderem Übersetzungen, die man in einem Fluid-Array zur Weiterverarbeitung in anderen ViewHelpern benötigt.

Die Lokalisierung von Templates findet in Fluid über den sogenannten “Translate-ViewHelper” statt – in den meisten Fällen auch kein Problem. Man baut in sein Template einfach einen Translate-ViewHelper-Tag ein, übergibt als key-Attribut den Übersetzungsschlüssel und Voilà! – das Template wird ordnungsgemäß übersetzt.
Ein kleines Beispiel:

<div>
	<f:translate key="translation_key" />
</div>

Bei spezielleren Fällen, insbesondere dann, wenn die Übersetzung innerhalb eines Fluid-Arrays stattfinden soll, gestaltet sich das Ganze schon etwas kniffliger. Zur Erinnerung: ein Fluid-Array ist nichts anderes als eine JSON-Darstellung der enthaltenen Daten. Ein Beispiel könnte so aussehen:

{0:'ein String', 1:123, 3:{0:'ein', 1:'Array'}}

Angenommen, wir wollten nun also ein Fluid-Array mittels For-ViewHelper durchiterieren und mehr oder weniger unanständige Dinge mit den einzelnen Elementen anstellen – zum Beispiel sie einfach ausgeben – kämen wir auf folgendes Template:

<f:for each="{0:'ein String', 1:'noch einer'}" as="string">
	{string}
</f:for>

Was aber, wenn wir nun Strings in diesem Array per ViewHelper lokalisieren wollen? Die Variante

<f:for each="{0:<f:translate key="translation_key1" />, 1:<f:translate key="translation_key2" />}" as="string">
	{string}
</f:for>

funktioniert nicht, hier legt eine ungültige JSON-Syntax vor. Es fehlen auf jeden Fall die Anführungszeichen, die einen JSON-String umgeben müssen. Fluid quittiert das mit einer Fehlermeldung, die sinngemäß besagt, das für das Argument “each” ein Array registriert wurde, hier aber ein String vorliegt. Das liegt daran, das Fluid beim parsen der Tags inklusive Attribute die ungültige JSON-Syntax nicht korrekt in ein PHP-Array umwandeln kann. Das Argument ist und bleibt ein String, womit der For-ViewHelper nun mal aber nicht klarkommt.

Auch die Variante mit Anführungszeichen

<f:for each="{0:'<f:translate key="translation_key1" />', 1:'<f:translate key="translation_key2" />'}" as="string">
	{string}
</f:for>

funktioniert nicht. Theoretisch zwar ganz gut, da der ViewHelper-Tag als herkömmlicher String gehandhabt werden soll. Allerdings haben wir immer noch keine gültige JSON-Syntax. Fluid bedankt sich mit der bekannten Fehlermeldung.
Nach einem kurzen Blick in die JSON-Dokumentation fällt auf, das Anführungszeichen (“) und Slashes (/) mittels Backslash (\) maskiert werden müssen. Also folgender Versuch:

<f:for each="{0:'<f:translate key=\"translation_key1\" \/>', 1:'<f:translate key=\"translation_key2\" \/>'}" as="string">
	{string}
</f:for>

Und siehe da, keine Fehlermeldung mehr! Allerdings leider auch nicht das gewünschte Ergebnis. Wir haben jetzt zwar eine korrekte JSON-Syntax, aber nun macht uns Fluid einen Strich durch die Rechnung. Der f:translate-Tag wird nicht geparst.

Also noch ein Versuch. Wir erinnern uns an die gute alte Shorthand-Syntax von Fluid, die für Übersetzungen eh zu Benutzen empfohlen ist. Kommen wir also zu folgender Variante:

<f:for each="{0:'{f:translate(key:\"translation_key1\")}', 1:'{f:translate(key:\"translation_key2\")}'}" as="string">
	{string}
</f:for>

Und – warum nicht gleich so? – Wir bekommen wunderbar lokalisierte Ausgaben. Fluid scheint bei Verwendung der Shorthand-Syntax in JSON-Strings keine Probleme zu haben – ganz im Gegensatz zur Tag-Syntax.
Wichtig ist lediglich, das man sowohl auf eine korrekte JSON-Syntax, als auch auf die passende Schachtelung bzw. die entsprechende \-Maskierung von einfachen (‘) und doppelten (“) Anführungszeichen achtet – ein Problem, dass ja spätestens seit JavaScript in Tag-Attributen bekannt sein sollte.

Ein Gedanke zu „Extbase / Fluid: Übersetzungen in Fluid-Arrays für ViewHelper

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.