Sprachen

Mehrsprachigkeit


Sprachen verwalten

Mehrsprachige Websites sind mit REDAXO extrem einfach zu erstellen.
Im Menüpunkt System gibt es den Punkt Sprachen, dort ist Deutsch voreingestellt.
Mit einem Klick auf das + fügt man eine neue Sprache hinzu. Danach liegt die Struktur von REDAXO bereits in zwei Sprachen vor. Es wurde also eine komplette Kopie der Seitenstruktur für die andere Sprache erstellt. Der Artikelstatus steht in der neuen Sprache überall auf offline – wie beim Anlegen einer neuen Seite auch.

Datenbanktechnisch existiert jeder Artikel in beiden Sprachen als separater Datensatz – mit der ID der jeweiligen Sprache markiert.
Achtung: Die Sprachen sind aber dennoch untrennbar verknüpft! Löscht man einen Artikel in einer Sprache, so wird er auch in allen anderen Sprachen gelöscht. Deshalb nutzt man am besten die Offline-Funktion, wenn ein Artikel in einer Sprache nicht benötigt wird.

<html lang="<?php echo rex_clang::getCurrent()->getCode(); ?>">

Die zwei Felder jeder Sprache – Code und Name – haben zunächst keinen Einfluss im Frontend, können und sollten aber dynamisch Verwendung finden, wo sinnvoll.
Der Eintrag im Feld “Code” kann z.B. perfekt als language-Attribut im HTML-Tag genutzt werden.

Es muss nicht bei diesen beiden Feldern bleiben. Neu hinzugekommen in REDAXO 5 sind Metafelder für Sprachen. Wie bei Kategorien, Artikeln und Medien auch stehen bei den Sprachen nun also Metafelder zur Verfügung, z.B. für sprachspezifische Einstellungen.

Denkbar wären etwa Länderflaggen für einen Sprachwechsler oder – wie hier in der Demo – die setlocale-Einstellung von PHP. Mit dem Eintrag von “de_DE” für deutsch und “en_EN” für englisch würde dann das Datum z.B. vom 22.12.1978 in der für jedes Land gültigen Schreibweise angezeigt werden:

<?php
// setLocale ist ein Sprachen-Metafeld, das individuelle locale-Informationen pro Sprache ermöglicht
setlocale (LC_ALL, rex_clang::getCurrent()->getValue('clang_setlocale'));

// Zeige das Datum in dem für jedes Land üblichen Datumsformat
echo strftime ("%A %e %B %Y", mktime (0, 0, 0, 12, 22, 1978));

// mit setlocale "de_DE":
// Freitag 22 Dezember 1978

// mit setlocale "en_EN":
// Friday 22 December 1978
?>

Je nach Website wird man eine Art von “Sprachwechsler” benötigen.

Soll zum gleichen Artikel in der jeweils anderen Sprache gewechselt werden? Oder zur Startseite?
Gibt es für alle Sprachen Inhalte in allen Artikeln? Falls nicht, soll der Inhalt der Hauptsprache angezeigt werden oder der Link gar nicht erst in der Navigation erscheinen?


Dies sind nur einige der Fragen bei der Konzeption einer Sprachnavigation

Zwei Sprachen

Bei zwei Sprachen genügt oft eine ganz schlichte Navigation:
Es soll nur jeweils der Link zum gleichen Artikel in der anderen Sprache angezeigt werden.

Übrigens: Wenn man die Sprachnavigation in ein eigenes Template setzt und dieses an die Navigation in einem anderen Template anhängen möchte, kann man die in der Variable $languages gespeicherte Navigation mit setProperty global “zwischenspeichern”:
rex::setProperty('lang_switch', $languages);

Im anderen Template kann man diese Daten dann – sofern das Sprach-Template eingebunden wurde – an der passenden Stelle wieder auslesen und anzeigen:
echo rex::getProperty('lang_switch');

Mehr als zwei Sprachen

Bei mehr als zwei Sprachen könnte man ein Dropdown verwenden, das unter der aktuellen Sprache die Links zu allen anderen Sprachen anzeigt – allerdings nur, wenn diese online sind. Dies gelingt mit der Angabe “true”:
rex_clang::getAll(true)

In dieser Demo sind beide Variante zu finden: Lege eine weitere Sprache an, um die unterschiedliche Sprachnavigation zu sehen.

<?php
// zwei Sprachen -> zeige nur den Link zur anderen Sprache
foreach (rex_clang::getAll(true) as $lang) {
if (rex_clang::getCurrentId() != $lang->getValue('id')) {
echo '<a href="'.rex_getUrl($this->getValue('article_id'), $lang->getValue('id')).'">'.$lang->getValue('name').'</a>';
}
}

// mehr als zwei Sprachen online -> zeige Dropdown, die aktuelle Sprache nicht klickbar
foreach (rex_clang::getAll(true) as $lang) {
if (rex_clang::getCurrentId() == $lang->getValue('id')) {
echo '<li class="dropdown"><a href="#">'.$lang->getValue('name').'</a>';
} else {
echo '<li><a href="'.rex_getUrl($this->getValue('article_id'), $lang->getValue('id')).'">'.$lang->getValue('name').'</a></li>';
}
}
?>

Sprachersetzung: Zum Beispiel Sprog

Die Artikel und Kategorien sowie ihre jeweiligen Metafelder sind also alle in beiden Sprachen vorhanden. Der Medienpool ist allerdings nicht mit dieser automatischen Zweisprachigkeit ausgestattet, denn manche Dateien (etwa PDF-Downloads) sind nicht per se zweisprachig. Falls man im Medienpool Mehrsprachigkeit benötigt, kann man einfach selbst die entsprechenden Metafelder anlegen.

Trotz der guten mehrsprachigen Unterstützung wird es manche Daten geben, die man nicht in Modulen verwalten kann und die der Redakteur dennoch pflegen oder übersetzen soll. Ein Beispiel wären etwa Formulare, auf die der Redakteur keinen Zugriff haben soll. Für diese Fälle existieren Sprachersetzungs-AddOns wie das in dieser Demo verwendete Sprog, das Schlüssel und deren Übersetzung in allen Sprachen verwaltet. Nach Eingabe des Schlüssel
{{ enter_search_word }}
beispielsweise erscheint dann der übersetzte Begriff
Suchbegriff eingeben

Sprog kommt auf der Kontaktseite zum Einsatz. Und bei der Mobil-Navigation.

REDAXO CMS

Das CMS REDAXO ist dafür konzipiert, dass man es flexibel anpassen und den ausgegebenen Code vollständig kontrollieren kann. So eignet es sich als “CMS-Framework” vor allem für Agenturen, die sehr unterschiedliche Websites bauen wollen.

REDAXO 5 rocks!