- Sprachen verwalten
- Neue Sprachen anlegen
- Links
- Sprach-Metafelder
- Beispiel einer einfachen Sprachnavigation
- Beispiel Sprachnavigation zeigt nur aktive Sprachen
- Hilfreiche AddOns
Mehrsprachige Websites sind mit REDAXO sehr einfach umsetzbar. Unter dem Menüpunkt System
gibt es den Unterpunkt Sprachen
. In jeder neuen REDAXO-Installation existiert bereits eine aktive Sprache, diese ist nicht löschbar. Standardmäßig hat diese Sprache den Code de
und den Namen deutsch
; dies kann aber geändert werden. Der Status kann auf offline
gestellt werden – das hat aber wie bei den Artikeln und Kategorien zunächst keine Auswirkung auf das Frontend, kann aber selbstverständlich in der Frontend-Ausgabe genutzt werden.
Eine neue Sprache wird über das Pluszeichen angelegt. Nach diesem Schritt – also wenn mindestens zwei Sprachen vorhanden sind – findet man in der Strukturansicht Links zum Wechsel in die anderen Sprachen.
Was ist durch diesen Schritt datenbanktechnisch passiert? Alle Artikel, also alle Datensätze der Tabelle rex_article
, wurden dupliziert und als leere Artikel mit der neuen Sprach-ID 2 gespeichert. Die ursprüngliche Sprache hat die ID 1, die zweite Sprache die ID 2, usw.
Hinweis: In alten REDAXO-Version (4 und älter) fingen die Sprach-IDs mit der 0 an.
Da also jeder Artikel jeder Sprache in der Datenbank als eigener Datensatz vorliegt, können die Artikel in den Sprachen individuell umbenannt und sortiert werden.
Achtung: Beim Löschen eines Artikels oder einer Kategorie werden aber automatisch alle Sprachversionen dieses Artikels oder dieser Kategorie gelöscht. Unterschiedliche Navigationen realisiert man am besten, indem man die Kategorien in den jeweiligen Sprachen auf online oder offline setzt.
Sobald es mehrere Sprachen gibt, ändert sich auch die Form der Links. REX-Variablen wie REX_LINK erzeugen ab sofort andere Links, die die Sprachkennung enthalten, z.B. index.php?article_id=2&clang=2
. Der Parameter clang
sorgt dabei für den Aufruf der Sprache mit ID 2.
Man kann Links aber natürlich auch manuell über PHP erstellen mit rex_getUrl
, wie hier im Beispiel ein Link auf den Artikel mit der ID 5 und der Sprache mit der ID 2:
<a href="<?php echo rex_getUrl(5, 2); ?>">Link</a>
Um im gleichen Artikel zu bleiben und nur auf eine andere Sprache umzuschalten, könnte die Syntax wie folgt aussehen:
<a href="<?php echo rex_getUrl($this->getValue('article_id'), 2); ?>">Link</a>
Alternativ kann man die Artikel-ID auch leer lassen:
<a href="<?php echo rex_getUrl("", 2); ?>">Link</a>
Wenn man in der gleichen Sprache, jedoch auf einen anderen Artikel verlinken möchte, kann man dies so realisieren:
<a href="<?php echo rex_getUrl(5, rex_clang::getCurrentId()); ?>">Link</a>
Es reicht aber auch aus, nur die Artikel-ID zu übergeben. Die aktuelle Sprache wird von REDAXO automatisch erkannt.
<a href="<?php echo rex_getUrl(5); ?>">Link</a>
Außer für Kategorien und Medien bietet REDAXO auch für Sprachen Metafelder. Denkbar wäre, Sprach-Metafelder anzulegen für einen alternativen Navigations-Sprachnamen, z.B. DE oder EN.
Das standardmäßig vorhandene Sprach-Metafeld Code
kann sinnvoll genutzt werden z.B. zum Verwalten des Sprachattributs im html-Tag:
<html lang="<?php echo rex_clang::getCurrent()->getCode(); ?>">
Oder man könnte ein neues Sprach-Metafeld setlocale
anlegen und damit in PHP die Lokalisierung definieren, um regional individuelle Datumsangaben und Dezimatrennzeichen zu erhalten:
setlocale (LC_ALL, rex_clang::getCurrent()->getValue('clang_setlocale'));
Das folgende Beispiel zeigt einen automatisch generierten Sprachumschalter.
Bei nur zwei Sprachen wird nur ein Link zur anderen Sprache angezeigt. Als Linktext wird das Meta-Sprachfeld Name
verwendet. Bei mehr als zwei Sprachen werden Links zu allen Sprachen angezeigt, wobei die aktuelle Sprache nicht verlinkt wird.
<?php
// auskommentieren, um das Sprach-Array anzuzeigen
// dump(rex_clang::getAll());
// zwei Sprachen online -> nur den Link zur anderen Sprache anzeigen
if (count(rex_clang::getAll(true)) == 2) {
foreach (rex_clang::getAll(true) as $lang) {
// falls die Sprache nicht die aktuelle Sprache ist
if (rex_clang::getCurrentId() != $lang->getValue('id')) {
echo '<a href="'.rex_getUrl($this->getValue('article_id'), $lang->getValue('id')).'">'.$lang->getValue('code').'</a>';
}
}
// mehr als zwei Sprachen online
} elseif (count(rex_clang::getAll(true)) > 2) {
foreach (rex_clang::getAll(true) as $lang) {
// aktuelle Sprachenicht klickbar
if (rex_clang::getCurrentId() == $lang->getValue('id')) {
echo '<a href="#">'.$lang->getValue('name').'</a>';
// alle anderen klickbar
} else {
echo '<a href="'.rex_getUrl($this->getValue('article_id'), $lang->getValue('id')).'">'.$lang->getValue('name').'</a>';
}
}
}
?>
<?php
// aktuelle Sprache ermitteln
$current_lang = rex_clang::getCurrent();
// Sprachcode ermitteln
$langcode = $current_lang->getCode();
// gibt es mehr als eine Sprache?
if (count(rex_clang::getAll(true)) > 1) {
if (count(rex_clang::getAll(true))) {
// Sprachen auslesen
foreach (rex_clang::getAll(true) as $lang) {
// aktuelle Sprache soll nicht klickbar sein
if (rex_clang::getCurrentId() == $lang->getValue('id')) {
echo '<strong>' . $lang->getCode() . '</strong>';
// alle anderen klickbar
} else {
// ermittle Artikel-Infos der ermittelten Sprache
$art = rex_article::get($this->getValue('article_id'), $lang->getValue('id'));
// prüfen ob Artikel online, wenn ja anzeigen.
if ($art->isOnline()) {
echo '<a href="' . rex_getUrl($this->getValue('article_id'), $lang->getValue('id')) . '">' . $lang->getCode() . '</a>';
}
}
}
}
}
?>
Das AddOn Sprog leistet bei der Arbeit mit mehrsprachigen Websites unschätzbare Dienste. Mittels Platzhalter können sprachabhängige Ersetzungen realisiert werden. Auch kann eine Sprache die Ersetzungen einer anderen Sprache verwenden.
Sprog kann außerdem Artikelnamen und Kategoriename innerhalb derselben Sprache sowie die Metadaten oder das Template zwischen den Sprachen synchronisieren. Und: Inhalte lassen sich rasch von einer Sprache zur anderen Sprache kopieren.