コード例 #1
0
 /**
  * @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);
 }
コード例 #2
0
 /**
  * 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));
         }
     }
 }
コード例 #3
0
ファイル: Route.php プロジェクト: redcatphp/localize
 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;
     }
 }