[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Browser Language Detection und Sprachschalter - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
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 „Allgemeines [R4]“