<?php
namespace app\service;
use app\service\UserService;
use app\service\AdminService;
* 多语言服务层
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-01T21:51:08+0800
*/
class MultilingualService
{
public static $cache_key = 'multilingual_language';
* 获取当前默认语言信息
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2023-02-13
* @desc description
*/
public static function MultilingualData()
{
static $user_multilingual_static_result = [];
if(empty($user_multilingual_static_result))
{
$default = [];
$select = [];
$allow_lang_list = MyConfig('lang.allow_lang_list');
$multilingual_list = self::MultilingualCanChooseList();
if(!empty($multilingual_list) && is_array($multilingual_list) && !empty($allow_lang_list) && is_array($allow_lang_list))
{
$domain_multilingual = array_column(MyC('common_domain_multilingual_bind_list', [], true), 'domain', 'lang');
$allow_lang_list = array_column($allow_lang_list, null, 'code');
$user_lang = self::GetUserMultilingualValue();
$default_lang = MyConfig('lang.default_lang');
$url = self::CurrentViewUrl();
foreach($multilingual_list as $k=>$v)
{
if(array_key_exists($k, $allow_lang_list) || $k == $default_lang)
{
$temp = array_merge($allow_lang_list[$k], [
'name' => $v['name'],
'icon' => $v['icon'],
'url' => $url.$k,
]);
if(!empty($domain_multilingual) && is_array($domain_multilingual) && array_key_exists($k, $domain_multilingual))
{
$temp['url'] = __MY_HTTP__.'://'.$domain_multilingual[$k];
}
$select[] = $temp;
if(empty($default) && !empty($default_lang) && $k == $default_lang)
{
$default = $temp;
}
if(!empty($user_lang) && $k == $user_lang)
{
$default = $temp;
}
}
}
if(empty($default) && !empty($select))
{
$default = $select[0];
}
}
$user_multilingual_static_result = [
'default' => $default,
'data' => $select,
];
}
return $user_multilingual_static_result;
}
* 语言列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2023-03-22
* @desc description
*/
public static function MultilingualCanChooseList()
{
$result = [];
$data = MyConst('common_multilingual_list');
$choose_list = MyC('common_multilingual_choose_list');
if(!empty($data) && is_array($data) && !empty($choose_list) && is_array($choose_list))
{
foreach($data as $k=>$v)
{
if(array_key_exists($k, $choose_list) && isset($choose_list[$k]) && isset($choose_list[$k]['status']) && $choose_list[$k]['status'] == 1)
{
$result[$k] = [
'name' => $v,
'icon' => empty($choose_list[$k]['icon']) ? '' : $choose_list[$k]['icon'],
];
}
}
}
return $result;
}
* 当前页面url地址
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2023-02-13
* @desc description
*/
public static function CurrentViewUrl()
{
$url = __MY_VIEW_URL__;
$lang_var = MyConfig('lang.detect_var');
if(stripos($url, $lang_var) !== false)
{
$arr1 = explode('?', $url);
if(!empty($arr1[1]))
{
$arr2 = explode('&', $arr1[1]);
foreach($arr2 as $k=>$v)
{
if(stripos($v, $lang_var) !== false)
{
unset($arr2[$k]);
}
}
$url = '?'.implode('&', $arr2);
}
}
$join = (stripos($url, '?') === false) ? '?' : '&';
return $url.$join.$lang_var.'=';
}
* 当前语言
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-09-10
* @desc description
*/
public static function GetUserMultilingualValue()
{
static $user_multilingual_static_value = null;
if(is_null($user_multilingual_static_value))
{
$value = input(MyConfig('lang.detect_var'));
if(empty($value))
{
$header_var = MyConfig('lang.header_var');
if(!empty($_SERVER[$header_var]))
{
$value = strtolower($_SERVER[$header_var]);
}
}
if(empty($value))
{
$value = MyCookie(MyConfig('lang.cookie_var'));
}
if(empty($value))
{
$value = MySession(self::CacheKey(self::$cache_key));
}
if(empty($value))
{
$uuid = input('uuid');
if(!empty($uuid))
{
$value = MyCache(self::CacheKey(self::$cache_key.'_'.$uuid));
}
}
if(empty($value))
{
$user = (RequestModule() == 'admin') ? AdminService::LoginInfo() : UserService::CacheLoginUserInfo();
if(!empty($user['id']))
{
$value = MyCache(self::CacheKey(self::$cache_key.'_'.$user['id']));
}
}
if(empty($value))
{
$domain_multilingual = MyC('common_domain_multilingual_bind_list');
if(!empty($domain_multilingual) && is_array($domain_multilingual))
{
foreach($domain_multilingual as $v)
{
if(!empty($v['domain']) && !empty($v['lang']) && $v['domain'] == __MY_HOST__)
{
$value = $v['lang'];
}
}
}
}
if(empty($value) && MyC('common_multilingual_auto_status') == 1)
{
$value = self::BrowserHttpAcceptLanguage();
}
if(empty($value))
{
$value = MyConfig('lang.default_lang');
}
$user_multilingual_static_value = htmlspecialchars(str_replace(['.', '/'], '', $value));
}
return $user_multilingual_static_value;
}
* 设置用户选择的语言
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-09-10
* @desc description
*/
public static function SetUserMultilingualValue()
{
$value = input(MyConfig('lang.detect_var'));
if(!empty($value))
{
MySession(self::CacheKey(self::$cache_key), $value);
$user = UserService::LoginUserInfo();
if(!empty($user['id']))
{
MyCache(self::CacheKey(self::$cache_key.'_'.$user['id']), $value);
}
$uuid = input('uuid');
if(!empty($uuid))
{
MyCache(self::CacheKey(self::$cache_key.'_'.$uuid), $value);
}
}
return true;
}
* 缓存key
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2022-05-14
* @desc description
* @param [string] $key [缓存key]
*/
public static function CacheKey($key)
{
return RequestModule().'_'.$key;
}
* 获取浏览器默认语言
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2022-08-22
* @desc description
*/
public static function BrowserHttpAcceptLanguage()
{
$value = '';
if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE']))
{
$lang_list = MyConfig('lang.allow_lang_list');
if(!empty($lang_list) && is_array($lang_list))
{
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4);
foreach($lang_list as $v)
{
if(!empty($v['preg']) && preg_match('/'.$v['preg'].'/i', $lang))
{
$value = $v['code'];
break;
}
}
}
}
return $value;
}
}
?>