|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace think; |
|
|
|
|
|
class Lang |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
private static $lang = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static $range = 'zh-cn'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected static $langDetectVar = 'lang'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected static $langCookieVar = 'think_var'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected static $langCookieExpire = 3600; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected static $allowLangList = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected static $acceptLanguage = ['zh-hans-cn' => 'zh-cn']; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function range($range = '') |
|
|
{ |
|
|
if ($range) { |
|
|
self::$range = $range; |
|
|
} |
|
|
|
|
|
return self::$range; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function set($name, $value = null, $range = '') |
|
|
{ |
|
|
$range = $range ?: self::$range; |
|
|
|
|
|
if (!isset(self::$lang[$range])) { |
|
|
self::$lang[$range] = []; |
|
|
} |
|
|
|
|
|
if (is_array($name)) { |
|
|
return self::$lang[$range] = array_change_key_case($name) + self::$lang[$range]; |
|
|
} |
|
|
|
|
|
return self::$lang[$range][strtolower($name)] = $value; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function load($file, $range = '') |
|
|
{ |
|
|
$range = $range ?: self::$range; |
|
|
$file = is_string($file) ? [$file] : $file; |
|
|
|
|
|
if (!isset(self::$lang[$range])) { |
|
|
self::$lang[$range] = []; |
|
|
} |
|
|
|
|
|
$lang = []; |
|
|
|
|
|
foreach ($file as $_file) { |
|
|
if (is_file($_file)) { |
|
|
|
|
|
App::$debug && Log::record('[ LANG ] ' . $_file, 'info'); |
|
|
|
|
|
$_lang = include $_file; |
|
|
|
|
|
if (is_array($_lang)) { |
|
|
$lang = array_change_key_case($_lang) + $lang; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
if (!empty($lang)) { |
|
|
self::$lang[$range] = $lang + self::$lang[$range]; |
|
|
} |
|
|
|
|
|
return self::$lang[$range]; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function has($name, $range = '') |
|
|
{ |
|
|
$range = $range ?: self::$range; |
|
|
|
|
|
return isset(self::$lang[$range][strtolower($name)]); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function get($name = null, $vars = [], $range = '') |
|
|
{ |
|
|
$range = $range ?: self::$range; |
|
|
|
|
|
|
|
|
if (empty($name)) { |
|
|
return self::$lang[$range]; |
|
|
} |
|
|
|
|
|
$key = strtolower($name); |
|
|
$value = isset(self::$lang[$range][$key]) ? self::$lang[$range][$key] : $name; |
|
|
|
|
|
|
|
|
if (!empty($vars) && is_array($vars)) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (key($vars) === 0) { |
|
|
|
|
|
array_unshift($vars, $value); |
|
|
$value = call_user_func_array('sprintf', $vars); |
|
|
} else { |
|
|
|
|
|
$replace = array_keys($vars); |
|
|
foreach ($replace as &$v) { |
|
|
$v = "{:{$v}}"; |
|
|
} |
|
|
$value = str_replace($replace, $vars, $value); |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return $value; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function detect() |
|
|
{ |
|
|
$langSet = ''; |
|
|
|
|
|
if (isset($_GET[self::$langDetectVar])) { |
|
|
|
|
|
$langSet = strtolower($_GET[self::$langDetectVar]); |
|
|
} elseif (isset($_COOKIE[self::$langCookieVar])) { |
|
|
|
|
|
$langSet = strtolower($_COOKIE[self::$langCookieVar]); |
|
|
} elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { |
|
|
|
|
|
preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches); |
|
|
$langSet = strtolower($matches[1]); |
|
|
$acceptLangs = Config::get('header_accept_lang'); |
|
|
|
|
|
if (isset($acceptLangs[$langSet])) { |
|
|
$langSet = $acceptLangs[$langSet]; |
|
|
} elseif (isset(self::$acceptLanguage[$langSet])) { |
|
|
$langSet = self::$acceptLanguage[$langSet]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (empty(self::$allowLangList) || in_array($langSet, self::$allowLangList)) { |
|
|
self::$range = $langSet ?: self::$range; |
|
|
} |
|
|
|
|
|
return self::$range; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function setLangDetectVar($var) |
|
|
{ |
|
|
self::$langDetectVar = $var; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function setLangCookieVar($var) |
|
|
{ |
|
|
self::$langCookieVar = $var; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function setLangCookieExpire($expire) |
|
|
{ |
|
|
self::$langCookieExpire = $expire; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function setAllowLangList($list) |
|
|
{ |
|
|
self::$allowLangList = $list; |
|
|
} |
|
|
} |
|
|
|