ajax-chat/public/lib/class/AJAXChatLanguage.php
2022-02-06 17:08:09 +01:00

102 lines
2.7 KiB
PHP

<?php
/*
* @package AJAX_Chat
* @author Sebastian Tschan
* @copyright (c) Sebastian Tschan
* @license GNU Affero General Public License
* @link https://blueimp.net/ajax/
*/
class AJAXChatLanguage {
var $_regExpAcceptLangCode;
var $_availableLangCodes;
var $_defaultLangCode;
var $_strictMode;
var $_langCode;
function __construct($availableLangCodes, $defaultLangCode, $langCode=null, $strictMode=false) {
$this->_regExpAcceptLangCode = '/^([a-z]{1,8}(?:-[a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i';
$this->_availableLangCodes = $availableLangCodes;
$this->_defaultLangCode = $defaultLangCode;
if($langCode && in_array($langCode, $availableLangCodes)) {
$this->_langCode = $langCode;
}
$this->_strictMode = $strictMode;
}
// Method to detect the language code from the HTTP_ACCEPT_LANGUAGE header:
function detectLangCode() {
// If HTTP_ACCEPT_LANGUAGE is empty use defaultLangCode:
if(empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$this->_langCode = $this->_defaultLangCode;
return;
}
// Split up the HTTP_ACCEPT_LANGUAGE header:
$acceptedLanguages = preg_split('/,\s*/', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
$currentLangCode = $this->_defaultLangCode;
$currentLangQuality = 0.0;
foreach($acceptedLanguages as $acceptedLanguage) {
// Parse the language string:
$match = preg_match($this->_regExpAcceptLangCode, $acceptedLanguage, $matches);
// Check if the syntax is valid:
if(!$match) {
continue;
}
// Get and split the language code:
$langCodeParts = explode ('-', $matches[1]);
// Get the language quality given as float value:
if(isset($matches[2])) {
$langQuality = (float)$matches[2];
} else {
// Missing language quality value is maximum quality:
$langQuality = 1.0;
}
// Go through it until the language code is empty:
while(count($langCodeParts)) {
// Join the current langCodeParts:
$langCode = strtolower(join('-', $langCodeParts));
// Check if the langCode is in the available list:
if(in_array($langCode, $this->_availableLangCodes)) {
// Check the quality setting:
if ($langQuality > $currentLangQuality) {
$currentLangCode = $langCode;
$currentLangQuality = $langQuality;
break;
}
}
// If strict mode is set, don't minimalize the language code:
if($this->_strictMode) {
break;
}
// else chop off the right part:
array_pop($langCodeParts);
}
}
$this->_langCode = $currentLangCode;
}
function getLangCode() {
if(!$this->_langCode) {
$this->detectLangCode();
}
return $this->_langCode;
}
function setLangCode($langCode) {
$this->_langCode = $langCode;
}
function getLangCodes() {
return $this->_availableLangCodes;
}
}
?>