function language($code)
{
$code = preg_replace('/\\h+|;q=[0-9.]+/', '', $code);
$code .= ($code ? ',' : '') . $this->fallback;
$this->languages = [];
foreach (array_reverse(explode(',', $code)) as $lang) {
if (preg_match('/^(\\w{2})(?:-(\\w{2}))?\\b/i', $lang, $parts)) {
// Generic language
array_unshift($this->languages, $parts[1]);
if (isset($parts[2])) {
// Specific language
$parts[0] = $parts[1] . '-' . ($parts[2] = strtoupper($parts[2]));
array_unshift($this->languages, $parts[0]);
}
}
}
$this->languages = array_unique($this->languages);
$locales = [];
$windows = preg_match('/^win/i', PHP_OS);
// Work around PHP's Turkish locale bug
foreach (preg_grep('/^(?!tr)/i', $this->languages) as $locale) {
if ($windows) {
$parts = explode('-', $locale);
$locale = @constant('ISO::LC_' . $parts[0]);
if (isset($parts[1]) && ($country = @constant('ISO::CC_' . strtolower($parts[1])))) {
$locale .= '-' . $country;
}
}
$locales[] = $locale;
$locales[] = $locale . '.' . ini_get('default_charset');
}
setlocale(LC_ALL, str_replace('-', '_', $locales));
return implode(',', $this->languages);
}