Tipps & Scripts
PHP: Die Sprache des Besuchers ermitteln - eine Sprachweiche
22.09.2009 | Verständnis: fortgeschritten
Manchmal ist es nötig, die Sprache des Websitebesuchers zu kennen - zum Beispiel, um ihn dann auf die entsprechende Sprachversion einer Website umzuleiten, soweit sie denn existiert. In diesem Beispiel bestimmen wir die Sprache des Besuchers und geben ihm eine passende Willkommensmeldung aus.
Sprachkennung des Browsers auslesen
Praktischerweise sendet der Browser (in den meisten Fällen) Informationen darüber, welche Sprache er spricht. Und nicht nur das: es werden sogar in absteigender Reihenfolge alternative Sprachen mitgesendet. Eine Sprachkennung könnte zum Beispiel so aussehen:
de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Hier wird als bevorzugte Sprache Deutsch angegeben, danach folgt amerikanisches Englisch und als letztes Englisch. Diese Information ist in der Server-Variable $_SERVER['HTTP_ACCEPT_LANGUAGE'] gespeichert und kann mit PHP einfach abgerufen werden.
Achtung: Diese Sprachkennung bezieht sich auf die Sprachkennung des Browsers - die Sprache des Menschen vor dem Computer kann aber eine ganz andere sein.
Hinweis: http_negotiate_language()
PHP stellt bereits eine Funktion zur Verfügung, die anhand des Accept-Language-Headers die Nutzersprache ermittelt. Ein Script, welches diese Funktion verwendet, findest Du am Ende des Artikels. Da aber nicht alle Hoster diese Funktion anbieten, wird im folgenden ein Script entwickelt, welches (fast) die gleiche Aufgabe erfüllt wie http_negotiate_language().
Prioritäten setzen durch strpos()
Aus dem String $_SERVER['HTTP_ACCEPT_LANGUAGE'] kann man auf verschiedene Weise ermitteln, welche Sprache am ehesten auf den Besucher zutrifft. Ich nutze für dieses Beispiel die Funktion strpos(). Diese Funktion ermittelt das erste Vorkommen eines Strings in einem anderen String und übergibt die Position des ersten Vorkommens als Zahl.
Für unser Beispiel mit der Willkommensmeldung benötigen wir als erstes ein paar Übersetzungen des Wortes "Willkommen" mit zugehörigem Sprachcode. Diese schreiben wir mit der Zuordnung Sprachcode => Willkommensmeldung in ein Array:
Tipp
Eine Liste mit zweistelligen Sprachcodes findest du beispielsweise bei Microsoft. Genauere Informationen zum Sprachcode-Standard kannst du im Wikipedia-Artikel zu ISO 639 nachlesen.
<?php
$welcomes = array('de' => 'Willkommen',
'es' => 'Bienvenido',
'en' => 'Welcome',
'fr' => 'Bienvenue');
?>
Um herauszufinden, in welcher Sprache die Begrüßung am ehesten passt, müssen wir herausfinden, welcher Sprachcode als erstes in $_SERVER['HTTP_ACCEPT_LANGUAGE'] vorkommt. Jetzt kommt strpos() ins Spiel: Die Funktion überprüft jeden Sprachcode auf sein erstes Vorkommen; in der Sprache, die als erstes vorkommt, wird die Begrüßung ausgegeben.
<?php
$langs = " ".$_SERVER['HTTP_ACCEPT_LANGUAGE'];
//verfuegbare Sprachen in Array
$begruessungen = array('de' => 'Willkommen',
'es' => 'Bienvenido',
'en' => 'Welcome',
'fr' => 'Bienvenue');
//ermitteln der positionen
foreach($begruessungen as $code => $gruss) {
$pos = strpos($langs, $code);
if(intval($pos) != 0) {
$position[$code] = intval($pos);
}
}
?>
Die foreach-Schleife durchläuft den Array mit den Begrüßungen und schreibt die Position jedes Sprachcodes in das Array $position. Die if-Bedingung prüft mit intval(), dass nur Zahlen in das Array $position eingetragen werden, die tatsächlich in der Sprachkennung vorkommen.
Ganz wichtig ist das Leerzeichen, welches vor die Sprachkennung gesetzt wird:
$langs = " ".$_SERVER['HTTP_ACCEPT_LANGUAGE'];
Würde nämlich ein Sprachcode gleich an erster Stelle in $_SERVER['HTTP_ACCEPT_LANGUAGE'] auftreten, würde strpos() Null zurückgeben und die Sprache in der if-Bedingung ausschließen, obwohl es sich um die bevorzugte Sprache des Besuchers handelt. Durch ein zusätzliches Zeichen vor der eigentlichen Sprachkennung wird dies verhindert, da die bevorzugte Sprache nicht mehr an Position Null steht.
Mit min() die geeignete Sprache ausgeben
So, jetzt sind die geeigneten Sprachen nach Prioritäten sortiert im Array $position - nun muss nur noch der kleinste Wert ermittelt werden, um die geeignetste Sprache auszugeben.
Dazu nehmen wir die Funktion min(). Diese gibt den kleinsten Wert eines Arrays aus.
Zur Prüfung der Werte bietet sich wieder eine foreach-Schleife an. Wir durchlaufen nochmals das $begruessungen-Array und vergleichen die Position der einzelnen Ländercodes mit der kleinsten Position und schreiben bei Übereinstimmung die Begrüßung in die Variable $ausgabe.
<?php
foreach($begruessungen as $code => $gruss) {
if(isset($position[$code]) &&
$position[$code] == min($position)) {
$ausgabe = $gruss;
}
}
?>
Sollte aber kein Ländercode in der Sprachkennung des Browsers vorkommen, ist das Array $position leer und es muss eine Standardsprache festgelegt werden, in der der Besucher begrüßt wird - im Regelfall bietet sich Englisch an oder die Standardsprache der Website. Mit einer if-Bedingung wird geprüft, ob das Array gefüllt ist, da im Ernstfall eine Fehlermeldung produziert würde. Um die Standardsprache festzulegen, geben wir der Variable $ausgabe schon vorher einen Wert - sollte sich eine passendere Sprache in der foreach-Schleife herausstellen, wird $ausgabe einfach überschrieben.
<?php
//standardsprache festlegen = englisch
$ausgabe = 'Welcome';
//pruefen ob uebereinstimmungen vorhanden
if(!empty($position)) {
foreach($begruessungen as $code => $gruss) {
if(isset($position[$code]) &&
$position[$code] == min($position)) {
$ausgabe = $gruss;
}
}
}
echo $ausgabe;
?>
Schließlich wird die Begrüßung noch per echo ausgegeben. Und das wars dann auch schon.
Die automatische Sprachweiche für die Website
Das Script ist natürlich nicht darauf beschränkt, nur eine Begrüßung auszugeben. Aufbauend auf diesem Script kann schnell und einfach eine Sprachweiche realisiert werden, die auf verschiedene Sprachversionen einer Website weiterleitet.
Dazu packen wir das Script zunächst in eine Funktion, die wir flexibler einsetzen können. Nach kleinen Anpassungen gibt die Funktion nicht eine passende Begrüßung, sondern die geeignete Sprache zurück:
<?php
function getLanguage()
{
$langs = " ".$_SERVER['HTTP_ACCEPT_LANGUAGE'];
//verfuegbare Sprachen in Array
$languages = array('en',
'de',
'es',
'fr');
//ermitteln der positionen
foreach($languages as $code) {
$pos = strpos($langs, $code);
if(intval($pos) != 0) {
$position[$code] = intval($pos);
}
}
//standardsprache festlegen = englisch
$bestLanguage = 'en';
//pruefen ob uebereinstimmungen vorhanden
if(!empty($position)) {
foreach($languages as $code) {
if(isset($position[$code]) &&
$position[$code] == min($position)) {
$bestLanguage = $code;
}
}
}
return $bestLanguage;
}
?>
Nun brauchen wir noch ein kurzes Script, welches die Sprachprüfung durchführt (also die Funktion aufruft) und dann auf die entsprechende Sprachversion der Website weiterleitet. In diesem Beispiel befinden sich die verschiedenen Sprachversionen in den zum Sprachcode passenden Unterordnern (für die englische Version z.B. http://www.example.com/en/)
<?php
//url bilden, die auf sprachversion umleitet
$url = 'http://www.example.com/'.getLanguage();
//weiterleitung
header('location: '.$url);
?>
Diese zwei Zeilen Code könnten beispielsweise in der index.php stehen, um den Besucher noch vor dem Betreten der Website weiterzuleiten.
Schneller zum Ziel mit http_negotiate_language()
Je nach Serverinstallation steht die Funktion http_negotiate_language() zur Verfügung, welche die gleiche Aufgabe wie die obige Begrüßungs-Funktion erfüllt. Allerdings wird dazu weniger Code benötigt. Hier ein Script, welches die Funktion http_negotiate_language() nutzt:
<?php
function greeting()
{
//verfuegbare sprachen in array
//erste angegebene sprache = standardsprache
$languages = array('en',
'de',
'es',
'fr');
$greetings = array('en' => 'Welcome',
'es' => 'Bienvenido',
'de' => 'Willkommen',
'fr' => 'Bienvenue');
return $greetings[http_negotiate_language($languages)];
}
?>
Und der Vollständigkeit halber auch die Lösung der Sprachweiche:
<?php
function getLanguage()
{
//verfuegbare sprachen in array
//erste angegebene sprache = standardsprache
$languages = array('en',
'de',
'es',
'fr');
return http_negotiate_language($languages);
}
?>
Weiterführende Links
Kommentare
Kommentar schreiben
Tipp: Passe das Design von Ohrflieger.de nach Deinen Wünschen an! Wähle dazu Dein Wunschdesign unten rechts auf jeder Seite.
Michael sagte am 18.02.2010 um 21:42 Uhr
die function begruessung() funktioniert aber offensichtlich nur dann, wenn die im array vorgegeben werte auch tatsächlich dem $_SERVER['HTTP_ACCEPT_LANGUAGE'];
entsprechen. kommt z.b. als ausgabe de-de,de;q=0.8,en-us;q=0.5,en;q=0.3, so wird es und fr (auslesen mit forech..) als undefined error moniert.
if (!empty... prüft ja auch nicht ob eine übereinstimmung vorhanden ist, sondern lediglich auf "nicht leer". Leer iist $position ja in dem fall nicht und schon läuft die foreach in die falle undefined error....
wie wäre es denn z.b. anstelle von if(!empty($position)) {
mal mit if(!empty($position) && $position == $langs) {
einen versuch zu starten? das ergebnis ist deutlich erfreulicher
antworten
Ohrflieger sagte am 19.02.2010 um 18:51 Uhr
Danke für den Hinweis, das muss mir beim Testen wohl entgangen sein. Ich habe den Code oben angepasst, allerdings muss an einer anderen Stelle geprüft werden, ob die Sprache auch gesetzt ist, nämlich schon innerhalb der foreach-Schleife mit isset($position[$code]).
Martin sagte am 18.02.2010 um 21:51 Uhr
Servus und danke zunächst für die echt guten Tipps.
Ich wollte das Teil nun soweit umbauen, dass ich es als Weiterleitungsscript je nach angegebener Browsersprache verwenden kann...komme damit jedoch nicht klar.
Hast du vielleicht einen Tipp?
antworten
Ohrflieger sagte am 19.02.2010 um 19:19 Uhr
Ich habe den Artikel oben um eine Lösung für die Sprachweiche erweitert, da das der wohl meistgesuchte Gebrauch der Funktion ist.