bin zwar kein geübter Coder, aber habe mir endlich mal eine Lösung für ein mehrsprachiges Redaxo zusammengestiefelt. Sprich: Die Website soll erkennen, welche Sprache der Besucher spricht, auf die passende Sprachversion weiterleiten und aber auch einen manuellen Sprachschalter mit seo-optimierter URL anbieten. Das ganze ist etwas komplexer, als ich es zu programmieren vermag, bin aber schon weit gekommen.
Vielleicht ist jm. bewegt, aus diesem Code ein richtig gutes Template oder Addon zu machen, damit eine Out-of-the-Box für solche Sprachsachen vorhanden ist? In einem Addon könnten der Cookie-Zeitraum, die Anzeige des Sprachschalters ("Sprache" / "Language") und ev. Verhalten, was zu tun ist, wenn keine Sprache passt, definiert werden.
Ansehen kann mans hier http://www.filmefuerdieerde.org
Das Dropdown hab ich mit dem jQuery Plugin Suckerfish etwas aufgeschickt
Hier zum Ablauf des Skripts
- * Skript checkt mit Cookie, ob der Besucher heute schon mal da war.
* Wenn nicht, redirect auf den Artikel in seiner im Browser als erste eingestellte Sprache.
* Wenn ja, nehme ich mal an, er hats kapiert (Verbesserungsbedarf)
** a) dass es seine Sprache gibt und insofern einen Sprachschalter, falls
er nochmals einen anderssprachigen Link nutzt
** b) will ich ihn nicht davon abhalten, die Website doch in einer anderen
Sprache anzusehen, vielleicht ist er bilingue oder Programmierer, der
Tests macht
navigieren kann. Der Sprachschalter erscheint immer in der Sprache,
welche NICHT aktiv ist (bei zwei Sprachen), damit er auch auf jeden Fall
verstanden wird.
Probleme, die ich noch sehe:
Wenn er keine cookies zulässt… dann redirected es ihn jedesmal, wenn
er in einer Sprache die Website ansehen will, die er nicht spricht…
Das ganze ist so nur mit manuellen Eingriffen ins Skript nutzbar (könnte also nicht als Template, der Community gegeben werden.
Und hier noch der Code zur freien Bedienung
Code: Alles auswählen
<?php
////////// Detect Browser User Language Setting ////////////////
// define which cookie to look for (lets redirect only once a day)
$cookie_name = "VisitorService";
$cookie_value = "FirstTimeHeretoday";
if(isset($_COOKIE[$cookie_name])) {}
else {
// get article id
$article_id = 'REX_ARTICLE_ID';
// get browser user language settings (first two letters)
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
// redirect to article in preferred language / avoid loop / do nothing if not de or en
if ($lang == 'de' && $REX['CUR_CLANG'] == '0') {};
if ($lang == 'en' && $REX['CUR_CLANG'] == '1') {};
if ($lang == 'de' && $REX['CUR_CLANG'] == '1') rex_redirect ($article_id,$clang = '0');
if ($lang == 'en' && $REX['CUR_CLANG'] == '0') rex_redirect ($article_id,$clang = '1');
else {}; // lets assume visitor knows what he/she is doing instead of redirecting to english
// if visitor is here the first time, tag visitor with cookie
setcookie($cookie_name, $cookie_value, time() + (86400 * 1), "/"); // 86400 = 1 day
}
////////////// Manual Language Selector ////////////////////////////
//Erweiterung Sprachtemplate von Robert Rupf. Sprachwaehler wird nur ausgegeben,
//wenn mind. eine Rootkategorie von weiteren Sprachen online ist
//Robert Menghini, weissgrad.at
// local adaption from me
$langCurr = 'REX_CLANG_ID';
if ($langCurr == '0'){
$lang = '> language';
}
if ($langCurr == '1'){
$lang = '> Sprache';
}
else {}
// Template
$tpl = array(
'list' => '<ul id="lang-switch" class="sf-menu">
<li>'.$lang.'
<ul>
{ITEMS}
</ul></li></ul>',
'elem' => '<li id="lang-{ID}"><a href="{HREF}">{NAME}</a></li>',
'active-elem' => '<li id="lang-{ID}"><a href="{HREF}">{NAME}</a></li>',
);
$out = '';
do {
// nur anzeigen, wenn mehr als eine Sprache
if(count($REX['CLANG']) <= 1) break;
// evtl. vorhandene Parameter in der Sprachwahl-URL uebergeben
$params = array();
foreach ($_GET as $key => $value) {
if ($key == 'clang' OR $key == 'article_id') continue;
$params[$key] = $value;
}//next
// aktuelle Sprache
$clang = rex_get('clang', 'int', REX_CLANG_ID);
$lang_elems_out = '';
$countL = 0; //### Erweiterung zu Robert Rupfs Template
$artOnline = false; //### Erweiterung zu Robert Rupfs Template
foreach($REX['CLANG'] as $id => $name) {
//### Erweiterung #######################
if($REX['START_CLANG_ID'] != $id) { //StartLanguage ausschließen
$rootC = OOCategory::getRootCategories(true,$id); //alle online-Rootkategorien der Sprache(n)
$artOnline = (count($rootC) > 0) ? true : false; //wenn Kategorie(n) in Sprache online dann true, sonst false
if(count($rootC) > 0) $countL++; //Sprachzaehler increment
}else { //Start-Language in jedem Fall anzeigen, wenn mehrere Sprachen und eine davon online Kat. enthaelt
$artOnline = true;
}//end if
//#######################################
if(!$artOnline) continue;//### Erweiterung zu Robert Rupfs Template
$tplkey = 'elem';
if($id == $REX['CUR_CLANG']) $tplkey = 'active-elem';
// tpl: [active-]elem
$lang_elems_out .= str_replace(
array('{ID}', '{HREF}', '{NAME}'),
array(
strtolower(preg_replace('~[^a-zA-Z0-9_-]+~sm', '', $name)),
rex_geturl('', $id, $params),
htmlspecialchars($name)
),
$tpl[$tplkey]
);
}//next
// tpl: list
$out .= str_replace( array('{ITEMS}'), array($lang_elems_out), $tpl['list']);
} while(false);
//### Erweiterung zu Robert Rupfs Template
//-> nur wenn weitere Sprachen mit online-Rootkategorien, dann Sprachwaehler ausgeben
if($countL > 0) echo $out;
?>