/** * @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); }
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; } }