Rev 1688 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// +----------------------------------------------------------------------+// | PEAR :: I18Nv2 :: Negotiator |// +----------------------------------------------------------------------+// | This source file is subject to version 3.0 of the PHP license, |// | that is available at http://www.php.net/license/3_0.txt |// | If you did not receive a copy of the PHP license and are unable |// | to obtain it through the world-wide-web, please send a note to |// | license@php.net so we can mail you a copy immediately. |// +----------------------------------------------------------------------+// | Copyright (c) 2004 The Authors |// +----------------------------------------------------------------------+// | Authors: Naoki Shima <murahachibu@php.net> |// | Wolfram Kriesing <wk@visionp.de> |// | Michael Wallner <mike@iworks.at> |// +----------------------------------------------------------------------+//// $Id: Negotiator.php,v 1.1 2007-06-25 09:55:28 alexandre_tb Exp $/*** I18Nv2::Negotiator** @package I18Nv2* @category Internationalization*//*** I18Nv2_Negotiator** @author Naoki Shima <murahachibu@php.net>* @author Wolfram Kriesing <wk@visionp.de>* @author Michael Wallner <mike@php.net>* @version $Revision: 1.1 $* @access public* @package I18Nv2*/class I18Nv2_Negotiator{/*** I18Nv2_Language** @var object* @access public*/var $I18NLang = null;/*** I18Nv2_Country** @var object* @access public*/var $I18NCountry = null;/*** Save default country code.** @var string* @access private*/var $_defaultCountry;/*** Save default language code.** @var string* @access private*/var $_defaultLanguage;/*** Save default encoding code.** @var string* @access private*/var $_defaultEncoding;/*** HTTP_ACCEPT_CHARSET** @var array* @access private*/var $_acceptEncoding = array();/*** HTTP_ACCEPT_LANGUAGE** @var array* @access private*/var $_acceptLanguage = array();/*** Language variations** @var array* @access private*/var $_langVariation = array();/*** Countries** @var array* @access private*/var $_country = array();/*** Constructor** Find language code, country code, encoding code, and dialect or variant* of Locale setting in HTTP request headers.** @access public* @param string $defaultLanguage Default Language* @param string $defaultEncoding Default Encoding* @param string $defaultCountry Default Country*/function I18Nv2_Negotiator($defaultLanguage = 'en', $defaultEncoding = 'iso-8859-1', $defaultCountry = ''){$this->__construct($defaultLanguage, $defaultEncoding, $defaultCountry);}/*** ZE2 Constructor* @ignore*/function __construct($defaultLanguage = 'en', $defaultEncoding = 'iso-8859-1', $defaultCountry = ''){$this->_defaultCountry = $defaultCountry;$this->_defaultLanguage = $defaultLanguage;$this->_defaultEncoding = $defaultEncoding;$this->_negotiateLanguage();$this->_negotiateEncoding();}/*** Negotiate Language** @access private* @return void*/function _negotiateLanguage(){if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {return;}foreach(explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang) {// Cut off any q-value that might come after a semi-colonif ($pos = strpos($lang, ';')) {$lang = trim(substr($lang, 0, $pos));}if (strstr($lang, '-')) {list($pri, $sub) = explode('-', $lang);if ($pri == '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*/$lang = $sub;} else {$lang = $pri;$this->singleI18NCountry();if ($this->I18NCountry->isValidCode($sub)) {$this->_country[$lang][] = strToUpper($sub);} else {$this->_langVariation[$lang][] = $sub;}}}$this->_acceptLanguage[] = $lang;}}/*** Negotiate Encoding** @access private* @return void*/function _negotiateEncoding(){if (!isset($_SERVER['HTTP_ACCEPT_CHARSET'])) {return;}foreach (explode(',', $_SERVER['HTTP_ACCEPT_CHARSET']) as $encoding) {if (!empty($encoding)) {$this->_acceptEncoding[] = preg_replace('/;.*/', '', $encoding);}}}/*** Find Country Match** @access public* @return array* @param string $lang* @param array $countries*/function getCountryMatch($lang, $countries = null){return $this->_getMatch($countries,@$this->_country[$lang],$this->_defaultCountry);}/*** Return variant info for passed parameter.** @access public* @return string* @param string $lang*/function getVariantInfo($lang){return isset($this->_langVariation[$lang]) ? $this->_langVariation[$lang] : null;}/*** Find Encoding match** @deprecated* @access public* @return string* @param array $encodings*/function getCharsetMatch($encodings = null){return $this->_getMatch($encodings,$this->_acceptEncoding,$this->_defaultEncoding);}/*** Find Encoding match** @access public* @return string* @param array $encodings*/function getEncodingMatch($encodings = null){return $this->_getMatch($encodings,$this->_acceptEncoding,$this->_defaultEncoding);}/*** Find Language match** @access public* @return string* @param array $langs*/function getLanguageMatch($langs = null){return $this->_getMatch($langs,$this->_acceptLanguage,$this->_defaultLanguage);}/*** Find locale match** @access public* @return string* @param array $langs* @param array $countries*/function getLocaleMatch($langs = null, $countries = null){$lang = $this->_getMatch($langs, $this->_acceptLanguage, $this->_defaultLanguage);$ctry = $this->_getMatch($countries, @$this->_country[$lang], $this->_defaultCountry);return $lang . ($ctry ? '_' . $ctry : '');}/*** Return first matched value from first and second parameter.* If there is no match found, then return third parameter.** @access private* @return string* @param array $needle* @param array $haystack* @param string $default*/function _getMatch($needle, $haystack, $default = ''){if (!$haystack) {return $default;}if (!$needle) {return current($haystack);}if ($result = current($a = array_intersect($haystack, $needle))) {return $result;}return $default;}/*** Find Country name for country code passed** @access private* @return void* @param string $code country code*/function getCountryName($code){$this->singleI18NCountry();return $this->I18NCountry->getName($code);}/*** Find Country name for country code passed** @access private* @return void* @param string $code language code*/function getLanguageName($code){$this->singleI18NLanguage();return $this->I18NLang->getName($code);}/*** Create the Language helper object** @access public* @return object*/function &singleI18NLanguage(){if (!isset($this->I18NLang)) {include_once 'I18Nv2/Language.php';$this->I18NLang = &new I18Nv2_Language($this->_defaultLanguage,$this->_defaultEncoding);}return $this->I18NLang;}/*** Create the Country helper object** @access public* @return object*/function &singleI18NCountry(){if (!isset($this->I18NCountry)) {include_once 'I18Nv2/Country.php';$this->I18NCountry = &new I18Nv2_Country($this->_defaultLanguage,$this->_defaultEncoding);}return $this->I18NCountry;}}?>