/** * @dataProvider dataProviderFor_detect */ public function test_detect($accept_language, $default, $expected) { $known_languages = ['ja', 'en', 'es', 'ko']; $strategy = function (array $locale) use($known_languages) { $is_wildcard = isset($locale['language']) && $locale['language'] === '*'; if (empty($locale['language']) && !$is_wildcard) { return null; } if ($is_wildcard || $locale['language'] === 'zh') { if (!empty($locale['region']) && $locale['region'] == 'TW') { return 'zh_tw'; } if (!empty($locale['script']) && $locale['script'] == 'Hant') { return 'zh_tw'; } if ($locale['language'] === 'zh') { return 'zh_cn'; } } if (in_array($locale['language'], $known_languages)) { return $locale['language']; } return null; }; $actual = AcceptLanguage::detect($strategy, $default, $accept_language); $this->assertEquals($expected, $actual); }
/** * Detect a user's languages and order them by priority. * * @param Language $language * @param AcceptLanguage $acceptLanguage * * @return bool */ public static function detect(Language $language, AcceptLanguage $acceptLanguage) { $acceptLanguageString = $acceptLanguage->getAcceptLanguageString(); $languages = array(); $language->setLanguages($languages); if (!empty($acceptLanguageString)) { $httpLanguages = preg_split('/q=([\\d\\.]*)/', $acceptLanguageString, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); $key = 0; foreach (array_reverse($httpLanguages) as $value) { $value = trim($value, ',; .'); if (is_numeric($value)) { $key = $value; } else { $languages[$key] = explode(',', $value); } } krsort($languages); foreach ($languages as $value) { $language->setLanguages(array_merge($language->getLanguages(), $value)); } } }
function byAcceptLanguage($_map = [], $default = 'en', $url = null, $http_accept_language = '') { if (!isset($url)) { $url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : ''; } if (isset($_COOKIE['language']) || trim($url, '/')) { return; } $map = []; foreach ($_map as $k => $v) { if (is_integer($k)) { $map[$v] = $this->getSubdomainHref($v); } else { $map[$k] = $v; } } if ($default) { if (is_array($default)) { $defaultUrl = $default[1]; $default = $default[0]; $map[$default] = $defaultUrl; } else { $map[$default] = $this->getSubdomainHref(); } } $language = $default; $redirect = AcceptLanguage::detect(function ($lang) use(&$map, &$language) { $k = implode('_', $lang); if (isset($map[$k])) { $language = $k; return $map[$k]; } }, $default, $http_accept_language); $lg = $this->getSubdomainLang(); $domain = $this->getServerHref(); if ($lg) { $domain = substr($domain, strlen($lg) + 1); } setcookie('language', $language, 0, '/', $domain); $current = $this->getBaseHref(); if ($current != $redirect) { header('Location: ' . $redirect, false, 302); exit; } }