====== [PHP] getBrowserLangs ======
Es geht hier um 2 Funktionen. Mit getBrowserLangs() kann man alle vom User im Browser eingestellten
Sprachen ermitteln, mit getLang() findet man je nach Priorisierung der Browsersprachen die benötigte Sprache.
Die Idee und die Ansätze sind mir in den Sinn gekommen, als ich auf der Seite
[[http://staticfloat.com/2011/05/24/browsersprache-auslesen-und-ermitteln-mit-php|staticfloat.com: Browsersprache auslesen und ermitteln mit PHP]]
die Funktion getBrowserLangs() sah.
Nun, ich wollte die Umsetzung ein wenig anderst lösen. Seine Art den String zu zerlegen ist mir auf zu
wackligen Beinen. Diese Strings schreien geradezu nach regulären Ausdrücken.
====getBrowserLangs()====
Array aller Sprachen des Browsers
*/
function getBrowserLangs($langListString = false){
$langs = array();
//Fallse kein String mitgegeben wurde, diesen aus $_SERVER auslesen
if($langListString === false) $langListString = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
//Pattern zusammensetzen
$pattern = '/([[:alpha:]]{2})(?:-[[:alpha:]]{2}|)(?:;q=([[:digit:]\.]*)|())/i';
//Die Sprachen auslesen
$result = preg_match_all($pattern, $langListString, $langDefs, PREG_SET_ORDER);
//Ein Array mit den Sprachen als Key und der Prio als Wert zusammensetzen
foreach($langDefs as $langDef){
list($match, $lang, $prio) = $langDef;
$prio = (float) (($prio=='') ? 1 : $prio);
$langs[$lang] = (isset($lang, $langs)) ? max($langs[$lang], $prio) : $prio;
}
//Nach dem Wert (Prio) sortieren
arsort($langs);
//Die Array-Keys (also die Sprachen) zurückgeben
return array_keys($langs);
}
?>
====getLang====
/**
* Liest eine Sprache aus einer priorisierten Liste aus.
* @param Array $aviableLangsArray Array mit allen vom System (deinem Programm) unterstützten Sprachen
* @param Array $browserLangsArray Array mit allen Sprachen die vom Browser unterstützt werden
* Falls dieser Param leer bleibt (false), wird der Array aus
* getBrowserLangs($langListString) generiert
* @param String $langListString $langListString Normalerweise leer. Dann wird $_SERVER['HTTP_ACCEPT_LANGUAGE'] genommen
* jedoch zum Testen kann dies überschrieben werden
* @return String Ausgewählte Sprache. Wenn kein Treffer ermittelt werden konnte, wird die
* erste Sprache aus $aviableLangsArray genommen
*/
function getLang($aviableLangsArray, $browserLangsArray = false, $langListString = false){
if ($browserLangsArray === false) $browserLangsArray =getBrowserLangs($langListString);
$lang = array_shift(array_intersect($browserLangsArray, $aviableLangsArray));
return (is_null($lang)) ? array_shift($aviableLangsArray) : $lang;
}
====Test der Funktionen (Beispiel)====
Das ergibt das folgende Resultat
array(3) {
[0]=>
string(2) "de"
[1]=>
string(2) "fr"
[2]=>
string(2) "en"
}
string(2) "fr"
{{tag>PHP Function}}