====== [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}}