summselbrumm!media
Beiträge: 44
Registriert: 6. Jan 2011, 14:39

Browser Language Detection und Sprachschalter

4. Mai 2015, 12:37

Hallo zusammen

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 :)
Ab da kommt der Sprachschalter oben rechts ins Spiel, damit er
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; 	
?>


Zurück zu „Templates/Navigationen [R4]“