Current File : //home/strato/chroot/opt/RZphp80/includes/I18N/Negotiator.php |
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 4.0 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.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. |
// +----------------------------------------------------------------------+
// | Authors: Naoki Shima <murahachibu@php.net> |
// | |
// +----------------------------------------------------------------------+//
// $Id: Negotiator.php 110339 2003-01-04 11:55:29Z mj $
/**
*
* //instantiate Locale_Negotiator
* $negotiator = & new I18N_Negotiator();
*
* //define which language[s] your site supports :: optional
* $supportLangs = array('fr','jp');
*
* //find first matched language
* $lang = $negotiator->getLanguageMatch($supportedLangs);
*
* //define which countries your site supports :: optional
* $supportCountries = array('gb','us');
*
* //find first matched Country
* $countryCode = $negotiator->getCountryMatch($lang,$supportCountries);
*
* echo 'Language Code: '.$lang.'
* Language Name: '.$negotiator->getLanguageName($lang).'
* Country Code: '.$countryCode.'
* Country Name: '.$negotiator->getCountryName($countryCode);
*/
class I18N_Negotiator{
// {{{ properties
/**
* Save default country code.
*
* @type : string
* @access: private
*/
var $_defaultCountry;
/**
* Save default language code.
*
* @type : string
* @access: private
*/
var $_defaultLanguage;
/**
* Save default charset code.
*
* @type : string
* @access: private
*/
var $_defaultCharset;
// }}}
// {{{ constructor
/**
* Find language code, country code, charset code, and dialect or variant
* of Locale setting in user's browser from $HTTP_ACCEPT_LANGUAGE,
* $LANGUAGE_ACCEPT_CHARSET
*
* @param : string Default Language
* @param : string Default Charset
* @param : string Default Country
*/
function I18N_Negotiator($defaultLanguage = "en", $defaultCharset = "ISO-8859-1", $defaultCountry = "")
{
if($_SERVER) {
$HTTP_ACCEPT_LANGUAGE = ( in_array("HTTP_ACCEPT_LANGUAGE",
array_keys($_SERVER)) ) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : "";
$HTTP_ACCEPT_CHARSET = ( in_array("HTTP_ACCEPT_CHARSET",
array_keys($_SERVER)) ) ? $_SERVER['HTTP_ACCEPT_CHARSET'] : "";
} else {
global $HTTP_ACCEPT_LANGUAGE,$HTTP_ACCEPT_CHARSET;
}
$this->_defaultCountry = $defaultCountry;
$this->_defaultLanguage = $defaultLanguage;
$this->_defaultCharset = $defaultCharset;
$langs = explode(',',$HTTP_ACCEPT_LANGUAGE);
foreach($langs AS $lang_tag) {
// Cut off any q-value that might come after a semi-colon
if($pos = strpos($lang_tag, ';')) {
$lang_tag = trim(substr($lang_tag,0,$pos));
}
$lang = $lang_tag;
if($pos = strpos($lang_tag, '-')) {
$primary_tag = substr($lang_tag,0,$pos);
$sub_tag = substr($lang_tag,($pos+1));
if($primary_tag == '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_tag;
} else {
$lang = $primary_tag;
$this->_prepareI18NCountry();
if($this->_lc->isValidCode($sub_tag)) {
$this->_country[$lang][] = $sub_tag;
} else {
/**
* Dialect or variant information such as no-nynorsk or
* en-cockney.
* Script variations, such as az-arabic and az-cyrillic
*/
$this->_lang_variation[$lang][] = $sub_tag;
}
}
}
$this->_acceptLanguage[] = $lang;
}
$this->_acceptCharset = explode(',',$HTTP_ACCEPT_CHARSET);
}
// }}}
// {{{ _constructor();
/**
* Dummy constructor
* call actual constructor
*/
function _constructor()
{
$this->I18N_Negotiator();
}
// }}}
// {{{ destructor
/**
* It does nothing right now
*/
function _I18N_Negotiater()
{
}
// }}}
// {{{ getCountryMatch()
/**
* Find Country Match
*
* @param : string
* @param : array
*
* @return: array
* @access: public
*/
function getCountryMatch($lang='',$countries = '')
{
if(!$lang) {
return FALSE;
}
return $this->_getMatch($countries,$this->_country[$lang],
$this->_defaultCountry);
}
// }}}
// {{{ getVariantInfo()
/**
* Return variant info for passed parameter.
*
* @param : string
*
* @return: string
* @access: public
*/
function getVariantInfo($lang)
{
return $this->_lang_variation[$lang];
}
// }}}
// {{{ getCharsetMatch()
/**
* Find Charset match
*
* @param : array
*
* @return: string
* @access: public
*/
function getCharsetMatch($chasets = '')
{
return $this->_getMatch($charsets,$this->_acceptCharset,
$this->_defaultCharset);
}
// }}}
// {{{ getLanguageMatch()
/**
* Find Language match
*
* @param : array
*
* @return: string
* @access: public
*/
function getLanguageMatch($langs = '')
{
return $this->_getMatch($langs,$this->_acceptLanguage,
$this->_defaultLanguage);
}
// }}}
// {{{ _getMatch()
/**
* Return first matched value from first and second parameter.
* If there is no match found, then return third parameter.
*
* @param : array
* @param : array
* @param : string
*
* @return: string
* @access: private
*/
function _getMatch($needle,$heystack,$default = '')
{
if(!$heystack) {
return $default;
}
if(!$needle) {
return array_shift($heystack);
}
if($result = array_shift(array_intersect($heystack,$needle))) {
return $result;
}
return $default;
}
/**
* Find Country name for country code passed
*
* @param : string country code
*
* @return: void
* @access: private
*/
function getCountryName($code)
{
$this->_prepareI18NCountry();
return $this->_lc->getName($code);
}
/**
* Find Country name for country code passed
*
* @param : string country code
*
* @return: void
* @access: private
*/
function getLanguageName($code)
{
$this->_prepareI18NLanguage();
return $this->_ll->getName($code);
}
/**
* Check if I18N_Language class has been instantiated and set to $this->_ll
* If it's not, it will load the script and instantiate I18N_Language class
*
* @return: void
* @access: private
*/
function _prepareI18NLanguage()
{
if(!isset($this->_ll)) {
include_once('I18N/Language.php');
$this->_ll =& new I18N_Language();
}
}
/**
* Check if I18N_Country class has been instantiated and set to $this->_lc
* If it's not, it will load the script and instantiate I18N_Country class
*
* @return: void
* @access: private
*/
function _prepareI18NCountry()
{
if(!isset($this->_lc)) {
include_once('I18N/Country.php');
$this->_lc =& new I18N_Country();
}
}
}
?>