public static function detect_browser_locale($domain = null)
{
// Check for empty case
if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
return null;
}
// Given multiple canditates, narrow down the final result using the client's preferred languages
$inputLocales = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
if (empty($inputLocales)) {
return null;
}
// Generate mapping of priority => list of locales at this priority
// break up string into pieces (languages and q factors)
preg_match_all('/(?<code>[a-z]{1,8}(-[a-z]{1,8})?)\\s*(;\\s*q\\s*=\\s*(?<priority>1|0\\.[0-9]+))?/i', $inputLocales, $parsedLocales);
$prioritisedLocales = array();
if (count($parsedLocales['code'])) {
// create a list like "en" => 0.8
$parsedLocales = array_combine($parsedLocales['code'], $parsedLocales['priority']);
// Generate nested list of priorities => [locales]
foreach ($parsedLocales as $locale => $priority) {
$priority = empty($priority) ? 1.0 : floatval($priority);
if (empty($prioritisedLocales[$priority])) {
$prioritisedLocales[$priority] = array();
}
$prioritisedLocales[$priority][] = $locale;
}
// sort list based on value
krsort($prioritisedLocales, SORT_NUMERIC);
}
// Check each requested locale against loaded locales
foreach ($prioritisedLocales as $priority => $parsedLocales) {
foreach ($parsedLocales as $browserLocale) {
foreach (self::locales($domain) as $locale) {
if (stripos(preg_replace('/_/', '-', $locale), $browserLocale) === 0) {
return $locale;
}
}
}
}
return null;
}