/** * @param string $acceptedLanguagesString * @param array $fallBacks * @param string $default * @param array|null $categories * * @return Localizer */ public static function fromAcceptedLanguages($acceptedLanguagesString, array $fallBacks = array(), $default = 'C', array $categories = array(LC_ALL)) { $acceptedLanguageArray = array($default => 0.0); foreach (explode(',', $acceptedLanguagesString) as $lang) { if (preg_match('/([a-z-]{2,})(?:;q=(.+))?/i', $lang, $matches) === 0) { continue; } $localeParts = explode('_', strtr($matches[1], array('-' => '_'))); $localeCode = strtolower($localeParts[0]) . (isset($localeParts[1]) ? '_' . strtoupper($localeParts[1]) : null); $acceptedLanguageArray[$localeCode] = isset($matches[2]) ? (double) $matches[2] : 1.0; } uasort($acceptedLanguageArray, function ($a, $b) { if ($a === $b) { return 0; } elseif ($a < $b) { return 1; } else { return 0; } }); sort($categories); $localesToSet = array_keys($acceptedLanguageArray); $localizer = new Localizer(); $localeArr = array_fill_keys($categories, $localesToSet); if (isset($localeArr[LC_ALL]) === true) { // special case wa? foreach ($fallBacks as $cat => $localeMap) { $localeArr[$cat] = $localeArr[LC_ALL]; } } foreach ($localeArr as $cat => $locales) { for ($i = 0; $i < count($locales); ++$i) { if (isset($fallBacks[$cat][$locales[$i]]) === false) { continue; } $localeArr[$cat][$i] = $fallBacks[$cat][$locales[$i]]; } $localeArr[$cat] = array_unique($localeArr[$cat]); } $localizer->setLocale($localeArr); return $localizer; }