/** * 获取$accept_language * * @return array */ protected static function accept_language() { if (null !== self::$accept_language) { return self::$accept_language; } if (self::$core_initialized && ($local_cookie_name = Core::config('local_lang_cookie_name')) && isset($_COOKIE[$local_cookie_name]) && preg_match('#[a-z0-9\\-_]+#i', $_COOKIE[$local_cookie_name])) { # 读取COOKIE中的语言包设置 $accept_language = (string) $_COOKIE[$local_cookie_name]; } elseif (self::$core_initialized && ($lang_config = Core::config('lang')) && $lang_config !== 'auto') { # 系统设置的语言包 $accept_language = explode(',', $lang_config); } else { # 客户端语言包 $language = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : null; $accept_language = array(); # 匹配语言设置 if ($language && false === strpos($language, ';')) { # zh-cn if (preg_match('#^([a-z]+(?:\\-[a-z]+)?),#i', $language, $m)) { $accept_language = array(rtrim(strtolower($language), ',')); } else { $accept_language = array(strtolower($language)); } } elseif ($language) { $language = strtolower(trim(str_replace(',', ';', preg_replace('#(,)?q=[0-9\\.]+(,)?#', '', $language)), ';')); $accept_language = explode(';', $language); $accept_language = array_values(array_slice($accept_language, 0, 4)); //只取前4个语言设置 } if (self::$core_initialized && ($default_lang = Core::config('default_lang')) && !in_array($default_lang, $accept_language)) { $accept_language[] = $default_lang; } /* $accept_language 整理之前 Array ( [0] => ko-kr [1] => en-us [2] => zh-cn ) $accept_language 整理之后 Array ( [0] => ko-kr [1] => ko [2] => en-us [3] => en [4] => zh-cn [5] => zh ) */ $renew_accept_language = array(); foreach ($accept_language as $item) { $sub_lang = explode('-', $item); $renew_accept_language[] = $item; if (count($sub_lang) > 1) { $renew_accept_language[] = $sub_lang[0]; } } $accept_language = array_unique($renew_accept_language); } self::$accept_language = $accept_language; if (IS_DEBUG) { Core::debug()->info(self::$accept_language, 'language'); } return self::$accept_language; }
/** * 加载语言包文件 * * @link http://www.php.net/manual/en/function.parse-ini-file.php * @return Core_I18n */ public function load() { $langdata = array(); $files = Core::find_file('i18n', $this->lang, '.lang'); if ($files) { $ext_len = strlen(EXT); if (count($files) > 1) { krsort($files); //逆向排序 } foreach ($files as $langfile) { if (substr($langfile, -$ext_len) === EXT) { $lang = Core_I18n::_include_lang_file($langfile); } else { $lang = @parse_ini_file($langfile); } if (is_array($lang)) { $langdata = array_merge($langdata, $lang); } } } Core_I18n::$data[$this->lang] = $langdata; return $this; }