'; } } //_pr($browser_langcodes); // We should take pristine values from the HTTP headers, but Internet Explorer // from version 7 sends only specific language tags (eg. fr-CA) without the // corresponding generic tag (fr) unless explicitly configured. In that case, // we assume that the lowest value of the specific tags is the value of the // generic language to be as close to the HTTP 1.1 spec as possible. // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 and // http://blogs.msdn.com/b/ie/archive/2006/10/17/accept-language-header-for-internet-explorer-7.aspx asort($browser_langcodes); foreach ($browser_langcodes as $langcode => $qvalue) { $generic_tag = strtok($langcode, '-'); if (!isset($browser_langcodes[$generic_tag])) { $browser_langcodes[$generic_tag] = $qvalue; } } echo "browser_langcodes
"; _pr($browser_langcodes); echo "languages
"; _pr($languages); // Find the enabled language with the greatest qvalue, following the rules // of RFC 2616 (section 14.4). If several languages have the same qvalue, // prefer the one with the greatest weight. $best_match_langcode = FALSE; $max_qvalue = 0; foreach ($languages as $langcode => $language) { // Language tags are case insensitive (RFC2616, sec 3.10). $langcode = strtolower($langcode); // If nothing matches below, the default qvalue is the one of the wildcard // language, if set, or is 0 (which will never match). $qvalue = isset($browser_langcodes['*']) ? $browser_langcodes['*'] : 0; // Find the longest possible prefix of the browser-supplied language // ('the language-range') that matches this site language ('the language tag'). $prefix = $langcode; echo "prefix: " . $prefix . "
"; do { if (isset($browser_langcodes[$prefix])) { $qvalue = $browser_langcodes[$prefix]; break; } } while ($prefix = substr($prefix, 0, strrpos($prefix, '-'))); // Find the best match. if ($qvalue > $max_qvalue) { $best_match_langcode = $language->language; $max_qvalue = $qvalue; } } _pr($best_match_langcode); echo "bml" . $best_match_langcode . "
"; return $best_match_langcode; } function locale_language_from_browser($languages) { // Specified by the user via the browser's Accept Language setting // Samples: "hu, en-us;q=0.66, en;q=0.33", "hu,en-us;q=0.5" $browser_langs = array(); if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $browser_accept = explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']); foreach ($browser_accept as $langpart) { // The language part is either a code or a code with a quality. // We cannot do anything with a * code, so it is skipped. // If the quality is missing, it is assumed to be 1 according to the RFC. if (preg_match("!([a-z-]+)(;q=([0-9\\.]+))?!", trim($langpart), $found)) { $browser_langs[$found[1]] = (isset($found[3]) ? (float) $found[3] : 1.0); } } } // Order the codes by quality arsort($browser_langs); //Array ( [en-us] => 1 [en] => 0.7 [fr] => 0.3 ) Firefox Fr //Array ( [fr-] => 1 [en-] => 1 [fr] => 0.8 [en] => 0.4 ) Chrome 5 Fr //Array ( [fr-fr] => 1 ) Safari Fr //Array ( [fr-fr] => 1 ) iCab Fr //Array ( [zh-] => 1 [fr] => 1 [pt-] => 1 [en-] => 1 [en] => 0.9 [ja] => 0.7 [de] => 0.6 [es] => 0.5 [it] => 0.4 [pt] => 0.3 [pl] => 0.1 [ru] => 0.1 [ko] => 0.1 [sv] => 0.1 [nl] => 0.1 [nb] => 0.1 [da] => 0.1 [fi] => 0.1 ) Opera 10.6 // Try to find the first preferred language we have foreach ($browser_langs as $langcode => $q) { foreach ($languages as $value) { /* $string = strtolower(str_replace('_','-',$value)); echo $langcode . '-' . $q . '-' . $value . '
'; if ($string == $langcode) { echo $value; return $value; break; } */ //echo $langcode . '-' . $q . '-' . $value . '
'; if (substr($langcode, 0, 2) == substr($value, 0, 2)) { $lang = $value; break 2; } } } return $lang; } function localize($domain) { //if ($_SERVER['SERVER_NAME'] == 'airbook.local') $root = $_SERVER['DOCUMENT_ROOT']; //$root = dirname($_SERVER['SCRIPT_FILENAME']); // /Users/bruno/Sites/sls //include($root.'/lib2/localize.php'); $dir_locales = $root . '/Locale'; $liste_locale = list_dir($dir_locales); /* Array ( [0] => de_DE [1] => en_US [2] => es_ES [3] => fr_FR ) */ //if ((!isset($_POST['lang'])) and (!isset($_GET['lang']))) $langue = locale_language_from_browser($liste_locale); //else $langue = $_REQUEST['lang']; if ((empty($_REQUEST['lang'])) and (empty($_SESSION['language']))){ $langue = locale_language_from_browser($liste_locale); } elseif (!empty($_REQUEST['lang'])) { $langue = $_REQUEST['lang']; $_SESSION['language'] = $_REQUEST['lang']; } else $langue = $_SESSION['language']; $langue .= ".utf8"; /* if (isset($_GET['lang'])) echo "_GET lang: " . $_GET['lang'] . "
"; else echo "_GET lang: NULL" . "
"; if (isset($_REQUEST['lang'])) echo "_REQUEST lang: " . $_REQUEST['lang'] . "
"; else echo "_REQUEST lang: NULL" . "
"; if (isset($_SESSION['language'])) echo "_SESSION language: " . $_SESSION['language'] . "
"; else echo "_SESSION language: NULL" . "
"; echo "langue: " . $langue . "
"; */ putenv('LC_ALL=' . $langue); $loc = setlocale(LC_ALL, $langue); bindtextdomain($domain, $root . '/Locale/'); bind_textdomain_codeset($domain, 'UTF-8'); textdomain($domain); $nation = array('fr_FR' => gettext('French'), 'en_US' => gettext('English') , 'de_DE' => gettext('German'), 'es_ES' => gettext('Spanish') ); } ?>