* @version $Revision: 1.2 $ $Date: 2005/01/05 03:15:14 $ * @package System.I18N.core */ /** * Include the CultureInfo class. */ require_once(dirname(__FILE__).'/CultureInfo.php'); /** * HTTPNegotiator class. * * Get the language and charset information from the client browser. * * @author Xiang Wei Zhuo * @version v1.0, last update on Fri Dec 24 16:01:35 EST 2004 * @package System.I18N.core */ class HTTPNegotiator { /** * A list of languages accepted by the browser. * @var array */ protected $languages; /** * A list of charsets accepted by the browser * @var array */ protected $charsets; /** * Get a list of languages acceptable by the client browser * @return array languages ordered in the user browser preferences. */ function getLanguages() { if($this->languages !== null) { return $this->languages; } $this->languages = array(); if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) return $this->languages; //$basedir = CultureInfo::dataDir(); //$ext = CultureInfo::fileExt(); $info = new CultureInfo(); foreach(explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang) { // Cut off any q-value that might come after a semi-colon if ($pos = strpos($lang, ';')) $lang = trim(substr($lang, 0, $pos)); if (strstr($lang, '-')) { $codes = explode('-',$lang); if($codes[0] == 'i') { // Language not listed in ISO 639 that are not variants // of any listed language, which can be registerd with the // i-prefix, such as i-cherokee if(count($codes)>1) $lang = $codes[1]; } else { for($i = 0, $k = count($codes); $i<$k; ++$i) { if($i == 0) $lang = strtolower($codes[0]); else $lang .= '_'.strtoupper($codes[$i]); } } } if($info->validCulture($lang)) $this->languages[] = $lang; } return $this->languages; } /** * Get a list of charsets acceptable by the client browser. * @return array list of charsets in preferable order. */ function getCharsets() { if($this->charsets !== null) { return $this->charsets; } $this->charsets = array(); if (!isset($_SERVER['HTTP_ACCEPT_CHARSET'])) return $this->charsets; foreach (explode(',', $_SERVER['HTTP_ACCEPT_CHARSET']) as $charset) { if (!empty($charset)) $this->charsets[] = preg_replace('/;.*/', '', $charset); } return $this->charsets; } }