User Tools

Site Tools


php:functions:getbrowserlangs

[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 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()

getBrowserLangs.php
<?php
/**
 * gibt die Sprachen die vom Browser unterstützt werden zurück. 
 * Sortiert nach der Prio-Einstellung des Browsers
 * @param   String          $langListString     Normalerweise leer. Dann wird $_SERVER['HTTP_ACCEPT_LANGUAGE'] genommen
 *                                              jedoch zum Testen kann dies überschrieben werden
 * @return  Array<String>                       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

getLang.php
/**
 * Liest eine Sprache aus einer priorisierten Liste aus.
 * @param   Array<String>   $aviableLangsArray  Array mit allen vom System (deinem Programm) unterstützten Sprachen
 * @param   Array<String>   $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)

<?php
//Rückgabe von $_SERVER['HTTP_ACCEPT_LANGUAGE'] simulieren
$testLangListString = "de-ch,en-us;q=0.2,de-de;q=0.7,en;q=0.3,fr-fr;q=0.8";
//Alle Sprachen nach Priorität absteing ausgeben
var_dump(getBrowserLangs($testLangListString));
//Erste Sprache nach einem Vergleich mit meinen Programmsprachen
$programLangs =  array('en', 'fr');
var_dump(getLang($programLangs, false, $testLangListString));  

Das ergibt das folgende Resultat

array(3) {
  [0]=>
  string(2) "de"
  [1]=>
  string(2) "fr"
  [2]=>
  string(2) "en"
}
string(2) "fr"
php/functions/getbrowserlangs.txt · Last modified: 09.12.2013 09:39:54 (external edit)