Tech 14. Jul. 2006

TYPO3: Mehrsprachigkeit mit TemplaVoilá

Endlich ist eine 1.x Version von TemplaVoila! verfügbar, alsoeine gute Gelegenheit sich die neue Template Engine noch einmal genau anzusehen. Das bauen eines Seiten-Templates mit Menüs, Inhalt, Stylesheets usw. ging recht problemlos. Das Konfigurieren von RealURL war dann schon eher ein Trip, aber nach ein paar Versuchen auch lauffähig.

Letztlich mach die Kombination aus mehreren Sprachen (in einem Baum mit Translate Feature), RealURL und einem Sprachmenü (echt dynamisch und als Text) einige Probleme

Zunächst zu den Sprachmenüs. Das HMENU special language tut sich leider schwer einen Textlink mit dem Sprachkürzel (aus dem Backend) auszugeben; anstatt dessen wird ein Link auf die eigene Seite (als Ziel richtig, aber als Label falsch) ausgegeben. Dies kann nur (oder nicht) manuell per TypoScript überschrieben werden. Alternativ ist oft von sr_language_menu die Rede. Diese hat leider meine Typo3 Installation zum Absturz gebracht - schade. Letztlich bin ich auf die Extension cab_realurl_languageselector ausgewichen, welche anhand der RealURL Konfiguration ein Menü aufbaut, also genau das was man benötigt.

Ausschnitt aus ext_localconf.php von realurl:

array(
	‘GETvar’ => ‘L’,
	‘valueMap’ => array(
		‘en’ => ‘2′,
		‘de’ => ‘0′,
		‘fr’ => ‘4′,
	),
	‘valueDefault’ => ‘en’,
	‘noMatch’ => ‘bypass’,
)

Sprachmenü in TypoScript (Setup):

lib.languagemenu = TEXT
lib.languagemenu.postUserFunc = tx_cablanguageselector_pi1->main
lib.languagemenu.postUserFunc{
	atag.before = <a xhref=”|” mce_href=”|”   >
	atag.after = </a>
	startUID = 5
	allWrap =|   /   |*| |   /   |*| |
}

Nach einigen Versuchen und Konfigurationsänderungen zeigt mir das Menü nun Links mit /de/section/page/ oder /en/section/page/ an. Die Menüpunkte und alle Daten aus dem Pageheader werden auch aus der richtigen Sprachversion geholt.

Nur der Inhalt bleibt immer der Standard. Bei Suchen nach einer Ursache stößt man zumeist auf den Hinweis, dass der folgende Code in die Datenstruktur eingefügt werden soll:

meta type=”array”>
 <langChildren type=”integer”>1</langChildren>
 <langDisable type=”integer”>0</langDisable>
 </meta></p></blockquote> <p>Damit ist es allerding nicht getan. Die Sprachparameter werden zwar richtig übergeben und verarbeitet, aber das select auf den Inhalt ignoriert diese Angabe. Es wird weiterhin der default Content angezeigt. Dies liegt an diesem Beispielcode:</p> <blockquote><p>10 = RECORDS
 10.source.current = 1
 10.tables = tt_content

Hier, wo der Inhalt gemappt wird, muss nun die Sprache mit ausgewertet werden.

10 = CONTENT
10 {
	table = tt_content
	select {
		pidInList = this
		orderBy = sorting
		where = colPos=0
		languageField = sys_language_uid
	}
}

Nur gibt es noch das folgende Problem: Beim Anspringen der Startseite gibt das Sprachmenü Links mit index.php und Parametern aus und die normalen Seitenlinks enthalten keinen Sprachkürzel. Hierfür ist die Deklaration startUID = 1 des Sprachmenüs verantwortlich. Wir hier die wirkliche pid (bei mir 5) eingefügt, wird nun auch ein korrektes Sprachmenü auf der Startseite generiert.

Letztlich fehlt jetzt noch eine Standardsprache, die auch in den initialen Menüs berücksichtigt wird. Anhand der Angaben

config.sys_language_uid = 2
config.language = en
config.locale_all = english

im TypoScript (Setup) wird zwar der richtige Inhalt und auch die richtige Sprache der Menüpunkte ausgegeben - die RealURL Links enthalten jedoch noch eine Sprachkennung. Hierfür muss in der ext_localconf.php von realurl zum einen ein Default-Wert gesetzt und zum anderen der bypass auf jeden Fall ausgeschaltet werden:

‘valueDefault’ => ‘en’,
 // ‘noMatch’ => ‘bypass’,

Nun funktioniert alles wie gewollt!