Add language detection (guessing)

This commit is contained in:
2019-10-13 18:57:48 +02:00
parent 6e253911cf
commit a1003760f8
4 changed files with 117 additions and 39 deletions

View File

@@ -126,7 +126,7 @@ class ToolBox
return json_encode($asData);
}
public static function curl($sUrl, $bHeader=false, $asPostData=array(), $sCookie='', $sCreds='') {
public static function curl($sUrl, $bHeader=false, $asPostData=array(), $sReturnType='text', $sCookie='', $sCreds='') {
$oCurl = curl_init();
curl_setopt($oCurl, CURLOPT_URL, $sUrl);
curl_setopt($oCurl, CURLOPT_VERBOSE, false);
@@ -148,8 +148,18 @@ class ToolBox
if($sCreds!='') curl_setopt($oCurl, CURLOPT_USERPWD, $sCreds);
$sContent = curl_exec($oCurl);
$bSuccess = ($sContent!==false);
$sDesc = '';
if(!$bSuccess) $sDesc = curl_errno($oCurl).': '.curl_strerror(curl_errno($oCurl));
curl_close($oCurl);
return $sContent;
switch($sReturnType) {
case 'json': $oContent = json_decode($sContent, true); break;
default: $oContent = $sContent;
}
return array('result'=>$bSuccess, 'desc'=>$sDesc, 'content'=>$oContent);
}
public static function getMimeType($sPath, $bSubTypeOnly=false)
@@ -454,6 +464,41 @@ class ToolBox
return $sText;
}
public static function getUserLanguage($available_languages, $sDefaultLang='') {
$http_accept_language = isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])?$_SERVER['HTTP_ACCEPT_LANGUAGE']:'';
//Format: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
preg_match_all("/([[:alpha:]]{1,8})(-([[:alpha:]|-]{1,8}))?(\s*;\s*q\s*=\s*(1\.0{0,3}|0\.\d{0,3}))?\s*(,|$)/i", $http_accept_language, $hits, PREG_SET_ORDER);
$bestlang = $sDefaultLang;
$bestqval = 0;
foreach($hits as $arr) {
$langprefix = strtolower($arr[1]);
if(!empty($arr[3])) {
$langrange = strtolower($arr[3]);
$language = $langprefix.'-'.$langrange;
}
else $language = $langprefix;
//Q Value
$qvalue = 1.0;
if(!empty($arr[5])) $qvalue = floatval($arr[5]);
//find q-maximal language
if(in_array($language, $available_languages) && $qvalue > $bestqval) {
$bestlang = $language;
$bestqval = $qvalue;
}
//if no direct hit, try the prefix only but decrease q-value by 10% (as http_negotiate_language does)
elseif(in_array($langprefix, $available_languages) && ($qvalue * 0.9) > $bestqval) {
$bestlang = $langprefix;
$bestqval = $qvalue * 0.9;
}
}
return $bestlang;
}
/**
* Return relative time description
* FIXME shitty implementation of i18n