Contao-Anleitungen.de > Blogpost lesen

Sprachabhängige Inhalte in Templates bereitstellen

06.08.2010 15:28 von Jan Theofel (Kommentare: 0)

Bei mehrsprachigen Projekten ist es oft notwendig, in einem Template sprachabhängig unterschiedliche Inhalte darzustellen. Doch viele Templates gibt es in Contao nur einmal. Sie können nicht pro Sprache jeweils ein neues Template anlegen. Und an den Stellen, bei denen dies geht, ist es oft ein deutlicher Mehraufwand.

Also müssen Sie in einem Template je nach Sprache des Betrachters unterschiedliche Inhalte ausgeben können. Das kann Contao, es gibt sogar drei Möglichkeiten dafür.

In den folgenden Beispielen gehen wir von einer Tabelle aus, die sprachabhängige Spaltenüberschriften erhalten soll.

Für alle drei Methoden gilt: Die Sprache richtet sich nicht unbedingt nach der Browsersprache des Benutzers, sondern stets und bei allen drei Methoden nach der Einstellung der Seite in der Seitenstruktur.

Wenn Ihr Benutzer je nach Browsersprache unterschiedliche Inhalte sehen soll, müssen Sie für verschiedene Sprachen verschiedene Startpunkte anlegen, und komplett eingene Seitenbäume betreiben.

Inserttag

Contao stellt das Inserttag {­{iflng}} zur Verfügung. Über die Ergänzung durch ein Sprachkürzel funktioniert das beispielsweise so: {­{iflng::de}}Hallo Welt!{­{iflng}}{­{iflng::en}}Hello World!{­{iflng}}. Wenn die Sprache nun Englisch ist, wird nur „Hello World!“ ausgeben, bei Deutsch ensprechend „Hallo Welt!“.

Auf die Tabelle bezogen sieht das etwa so aus:

<table>
<thead>
<tr>
<th>{­{iflng::en}}Heading 1{­{iflng}}{­{iflng::de}}Überschrift 1{­{iflng}}</th>
<th>{­{iflng::en}}Heading 2{­{iflng}}{­{iflng::de}}Überschrift 2{­{iflng}}</th>
</tr>

Logik im Template

Für umfangreichere sprachabhängige Bereiche kann das Inserttag ungünstig sein, reines PHP wäre vielleicht geschickter. Wer also mit if und else, oder break und case arbeiten möchte, kann im Template auch so auf die Sprache zugreifen: <?php echo $GLOBALS['TL_LANGUAGE']; ?>.

Auf die Tabelle bezogen könnte das so aussehen:

<table>
<thead>
<tr>
<?php if($GLOBALS['TL_LANGUAGE'] == 'en'): ?>
<th>Heading 1</th>
<th>Heading 2</th>
<?php elseif($GLOBALS['TL_LANGUAGE'] == 'de'): ?>
<th>Überschrift 1</th>
<th>Überschrift 2</th>
<?php endif; ?>
</tr>

Globale Labels

Manchmal bietet es sich an, die sprachabhängigen Inhalte auch auszulagern, damit sie global verfügbar sind, oder damit das Template nicht zu voll wird. Außerdem hilft es, Logik im Template zu reduzieren.

Dafür gibt es in Contao die Datei system/config/langconfig. Ähnlich wie ihre Schwestern localconfig.php und dcaconfig.php wird sie bei Updates nicht überschrieben, und kann somit sicher angepasst werden. In dieser Datei kann für jede Sprache eine „Beschriftung“ definiert werden, die im Template ausgelesen wird.

Eine solchermaßen angepasste Datei könnte so aussehen:

if ($GLOBALS['TL_LANGUAGE'] == 'de')
{
$GLOBALS['TL_LANG']['meinetabelle']['spalte1'] = 'Deutsches Label';
}
elseif ($GLOBALS['TL_LANGUAGE'] == 'en')
{
$GLOBALS['TL_LANG']['meinetabelle']['spalte1'] = 'Englisches Label';
}
else
{
$GLOBALS['TL_LANG']['meinetabelle']['spalte1'] = 'Fallback-Label';
}

In jedem beliebigen Template kann nun auf das Label zugegrifften werden, was tatsächlich ausgegeben wird, entscheidet sich in der langconfig.php.

<table>
<thead>
<tr>
<th><?php echo $GLOBALS['TL_LANG']['meinetabelle']['spalte1']; ?></th>

Dabei kann die Bezeichnung dieses Labels frei vergeben werden („meinetaballe“ und „spalte1“). Verwenden Sie dabei statt „meinetabelle“ möglichst eine projektbezogene Bezeichnung. Dadurch schließen Sie Namenskonflikte mit installierten Modulen oder ähnlichem aus.

meinetabelle

Zurück

Einen Kommentar schreiben