Sprachumschalter themen (mit URL Alias)
Immer wieder benötige ich einen flexiblen und anpassbaren Sprachumschalter (language switcher) für Drupal 6. Zum Beispiel auch für diese Webseite:
Leider lässt die Implementation des Sprachschalters im i18n Module zu wünschen übrig. Der Sprachumschalter des i18n-Modules ist nicht frei konfigurierbar, z.B. nur Flaggen anzeigen etc. Auch sonst hat meine Erfahrung gezeigt, dass das i18n-Modul mit Vorsicht zu geniessen ist. Es gibt viele Stolpersteine und Bugs.
Wie habe ich die Sprachflaggen realisiert?
Es gibt insgesamt 2 Module, die mehr oder weniger das gleiche bieten. Das erstere ist jedoch ungeeignet:
Consistent Language Interface
http://drupal.org/project/languageinterface
Dieses Modul kann zwar Flaggen darstellen und auch die Reihenfolge der Sprache idt auswählbar. Für eine Seite mit URL Aliases ist aber von diesem Modul abzuraten. Der Entwickler generiert die Links nicht mit der l()-Funktion von Drupal. Aus diesem Grund ist das Modul nicht in der Lage, URL Aliase anzuzeigen. Die Adressen werden immer im Format /node/<langprefix>/<nodeid>/<remaining-params> ausgegeben.
Dies ist definitiv nicht suchmaschinenfreundlich. Google würde jede Webseite automatisch bestrafen, weil alle Inhalt doppel erreichbar wären. Und zwar:
- unter dem URL Alias und
- unter der erwähnten URL des Sprachschalters.
Aus diesem Grund ist das Modul ungeeignet.
Language Icons
http://drupal.org/project/languageicons
Dieses Modul wurde vom i18n-Entwickler erstellt und ergänzt die Sprachlinks mit Flaggen. Es ist jedoch nicht möglich über eine Theming-Funktion zu erreichen, das beispielsweise NUR Flaggen angezeigt werden. Auch die Reihenfolge der Flaggen kann nicht definiert werden. Aus diesem Grund genügt auch dieses Modul meinen Anforderungen nicht.
Eigene Theming Funktion
Die maximale Flexibilität bietet eine eigene Theming-Funktion, die in die template.php Datei des eigenen Themes eingefügt werden kann. Damit das nachfolgende Beispiel mit Flaggen funktioniert, müssen vorgängig folgende Module installiert aktiviert werden:
Code
page.tpl.php
... <div id="language-switch" class="clearfix floatbox"> <?php print language_switcher() ?> </div> ...
template.php
<?php
function language_switcher() {
$languages = language_list('enabled');
$links = array();
foreach ($languages[1] as $language) {
if ($language->language != $current) {
$links[$language->language] = array(
'href' => $_GET['q'],
'title' => '',//$language->native, Optional Sprachnamen anzeigen
'language' => $language,
'attributes' => array('class' => 'language-link'),
);
}
}
//URL Alias Unterstützung
translation_translation_link_alter($links, $_GET['q']);
i18n_translation_link_alter($links, $_GET['q']);
// Flagge zum Sprachlink hinzufügen
if (function_exists('languageicons_translation_link_alter'))
languageicons_translation_link_alter($links, $_GET['q']);
// Link anpassen, Z.B. das Bild im Link Themen.
if ($icon = theme('languageicons_icon', $language, NULL)) {
$links[$language->language]['title'] = theme('languageicons_place', $link['title'], $icon);
$links[$language->language]['html'] = TRUE;
}
//Falls die aktuelle Sprache ausgeblendet werden soll,
//die nachfolgenden Zeilen auskommentieren
//$current = i18n_get_lang();
//unset($links[$current]);
//Sprachschalter nur anzeigen, falls die Inhalte auch übersetzt wurden
if($node = menu_get_object()) {
if(!$node->tnid) {
return;
}
}
return theme('links', $links, array());
}
?>

ich mühe mich auch grad mit
ich mühe mich auch grad mit einer Mehrsprachigen Seite ab.
Danke für diesen Tip mit den flags.
Hast Du vielleicht sonst noch ein paar Tips auf Lager was man tun oder eben nicht tun soll.
Danke und Gruss
Daniel Hunziker
Hi! Kann es sein, dass bei
Hi!
Kann es sein, dass bei diesem Vorgehen der Sprachumschalter lediglich auf der Startseite platziert wird, aber bei einem Navigieren auf eine Unterseite verschwindet?
Gruß!
Node überprüfen
Der Sprachumschalter hat nur dann mehrere Sprachen zur Auswahl, wenn für den Node, der gerade offen ist, eine Übersetzung existiert. Ich vermute, Du bist auf einem Node, für den es keine Übersetzung gibt. Dann ist klar, dass der Sprachumschalter nur die aktuelle Sprache oder je nach dem gar nichts anzeigt.
In der Tat
Klingt logisch und war in der Tat mein Fehler. Super, vielen lieben Dank. :)
Einen habe ich aber noch: Mein Seitenaufbau sieht nun so aus, dass jede Seite aus jeweils einem zweispaltigen Panel besteht. Die in der linken und rechten Spalte eingebundenen Nodes sind jeweils in deutscher und/oder englischer Sprache angelegt.
Das Panel besitzt aber ja meines Erachtens keine Möglichkeit eine Spracheigenschaft zu hinterlegen. Und da eigentlich im Browser ja das Panel geöffnet ist, wird nun der Sprachumschalter widerum NICHT angezeigt.
Öffne ich nur den einzelnen, im Panel verlinkten, Node erscheinen die Sprachumschalter.
Eine Idee, wie ich das lösen kann?!
Ich habe nun eine Lösung für
Ich habe nun eine Lösung für mein Problem gefunden und einfach den Teil deines Codes, der dafür sorgt, dass die Flaggen nur dann dargestellt werden, wenn auch eine Übersetzung angelegt wurde, entfernt.
Da für die Panels keine Übersetzung angelegt wurde (sondern nur für die in ihnen verlinkten Nodes), tauchten auch die Flaggen nicht auf.
Da diese nun aber ausnahmslos dargestellt werden, lässt sich auch die Sprache bei aufgerufenen Panels wechseln und die darin dargestellten Inhaltsseiten passen sich mit an. :)
Allerdings habe ich nun gleich ein neues Problem, da ich die Überschrift der in den Spalten des Panels dargestellten Inhaltsseiten unterdrücke und den Titel des Panels als gemeinsame Überschrift ausgebe. Diese Überschrift wird nun (natürlich, da sie ja zum Panel ohne jegliche Spracheinstellungen gehört) nicht übersetzt. Da werde ich aber hoffentlich auch noch eine Lösung finden. ;)
Lösung für Panels:
Ich habe das auch schon gelöst mit den Sprachen in Panels. Bei Auflistungen von Nodes etc. verwendest Du einfach eine Views (mit Filter i18n Negotiation Filter). Die Sprachfilterung und Steuerung überlasse ich eigentlich immer den Views, da dies zuverlässig funktioniert.
Lösung für Consistant Language Interface
Für URL Alias mit consistant language interface einfach das Modul statt in modules/ nach sites/all/modules/ laden und aktivieren, dann in der languageinterface.module folgende Zeile:
$path = url(rootpath().$prefix.'node/'. $destination_nid . $remaining, array('language' => $lang, 'prefix' => $prefix));mit dieser ersetzen:
$path = url(rootpath(). $prefix. drupal_get_path_alias('node/'. $destination_nid, $lang) . $remaining, array('language' => $lang, 'prefix' => $prefix));Das hat mir geholfen, ich verwende prefix zum Umschalten der Sprache. Die Url-Alias werden dadurch korrekt erstellt.
Nachtrag: Der Pfad für die
Nachtrag: Der Pfad für die Flaggen stimmt dann nicht mehr, dass kann aber in den Einstellungen des Moduls direkt in Drupal geändert werden, sollten dann in einem öffentlichen Verzeichnis liegen.
Flagge nur anzeigen wenn Übersetzung auf Veröffentlicht wurde
Kann mir jemand einen Tipp geben, wie ich das ganze leicht umsetzen kann?
Danke
Kommentar hinzufügen