shopxo/app/service/MultilingualService.php
2023-03-22 18:59:53 +08:00

304 lines
9.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2099 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://opensource.org/licenses/mit-license.php )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
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
{
// 多语言选择缓存key
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_result = [];
if(empty($user_multilingual_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))
{
$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,
'url' =>$url.$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_result = [
'default' => $default,
'data' => $select,
];
}
return $user_multilingual_result;
}
/**
* 语言列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2023-03-22
* @desc description
*/
public static function MultilingualCanChooseList()
{
$result = [];
$data = MyLang('common_multilingual_list');
if(!empty($data) && is_array($data))
{
$choose_list = MyC('common_multilingual_choose_list');
foreach($data as $k=>$v)
{
if(!empty($choose_list) && is_array($choose_list) && in_array($k, $choose_list))
{
$result[$k] = $v;
}
}
}
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_value = null;
if(is_null($user_multilingual_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]);
}
}
// cookie
if(empty($value))
{
$value = MyCookie(MyConfig('lang.cookie_var'));
}
// session读取
if(empty($value))
{
$value = MySession(self::CacheKey(self::$cache_key));
}
// 根据uuid读取
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::LoginUserInfo();
if(!empty($user['id']))
{
// 缓存读取
$value = MyCache(self::CacheKey(self::$cache_key.'_'.$user['id']));
}
}
// 自动检测
if(empty($value))
{
$value = self::BrowserHttpAcceptLanguage();
}
// 默认语言
if(empty($value))
{
$value = MyConfig('lang.default_lang');
}
$user_multilingual_value = $value;
}
return $user_multilingual_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))
{
// session
MySession(self::CacheKey(self::$cache_key), $value);
// 当前用户
$user = UserService::LoginUserInfo();
if(!empty($user['id']))
{
MyCache(self::CacheKey(self::$cache_key.'_'.$user['id']), $value);
}
// uuid
$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))
{
//只取前4位这样只判断最优先的语言。如果取前5位可能出现en,zh的情况影响判断。
$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;
}
}
?>