107 lines
3.7 KiB
PHP
107 lines
3.7 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Middleware;
|
||
|
||
use Closure;
|
||
|
||
/**
|
||
* 設定網站語系
|
||
*
|
||
* Class SetAppLanguage
|
||
* @package App\Http\Middleware
|
||
*/
|
||
class SetAppLanguage
|
||
{
|
||
/**
|
||
* Cookie及Session存放Locale資訊的Key
|
||
*
|
||
* @var string
|
||
*/
|
||
private $cookieAndSessionKey = 'appLocale';
|
||
|
||
/**
|
||
* 設定Locale時的參數Key
|
||
*
|
||
* @var string
|
||
*/
|
||
private $localeRequestKey = 'locale';
|
||
/**
|
||
* Handle an incoming request.
|
||
*
|
||
* @param \Illuminate\Http\Request $request
|
||
* @param \Closure $next
|
||
* @return mixed
|
||
*/
|
||
public function handle($request, Closure $next)
|
||
{
|
||
//取得所有語言清單
|
||
$availableLocales = (array)config('languages');
|
||
//要被回傳的Cookie
|
||
$setLocaleCookie = false;
|
||
//要被設定的語言
|
||
$setLocale = false;
|
||
//如果有Locale參數
|
||
if($request->get($this->localeRequestKey) !== null) {
|
||
//取得傳入的Locale值
|
||
$requestLocale = $request->get($this->localeRequestKey);
|
||
//如果有在語言清單內
|
||
if(array_key_exists($requestLocale, $availableLocales)) {
|
||
//設定session
|
||
$request->session()->put($this->cookieAndSessionKey, $requestLocale);
|
||
//設定要被回傳的Cookie及目標Locale
|
||
$setLocale = $setLocaleCookie = $requestLocale;
|
||
}
|
||
}
|
||
//假如沒有目標Locale,再讀取Session、Cookie、瀏覽器的Locale
|
||
if(!$setLocale) {
|
||
$cookieLocale = $request->cookies->get($this->cookieAndSessionKey);
|
||
$sessionLocale = $request->session()->get($this->cookieAndSessionKey);
|
||
if(array_key_exists($sessionLocale, $availableLocales)) {
|
||
//設定要被回傳的Cookie及目標Locale
|
||
$setLocale = $sessionLocale;
|
||
if(!$cookieLocale) {
|
||
$setLocaleCookie = $sessionLocale;
|
||
}
|
||
} elseif(array_key_exists($cookieLocale, $availableLocales)) {
|
||
//設定Session及目標Locale
|
||
$request->session()->put($this->cookieAndSessionKey, $cookieLocale);
|
||
$setLocale = $cookieLocale;
|
||
} else {
|
||
//Session及Cookie都沒有Locale值時,讀取HTTP Header的資訊
|
||
$browserLocales = $request->server('HTTP_ACCEPT_LANGUAGE');
|
||
$browserLocales = preg_replace('/;q=0\.\d+/', '', $browserLocales);
|
||
$browserLocales = explode(',', $browserLocales);
|
||
$browserLocales = array_map(function($lang){
|
||
return strtolower($lang);
|
||
}, $browserLocales);
|
||
|
||
//與語言清單比對
|
||
$validBrowserLocales = array_intersect($browserLocales, array_keys($availableLocales));
|
||
|
||
if(!empty($validBrowserLocales)) {
|
||
//取得第一個瀏覽器Locale
|
||
$validBrowserLocale = head($validBrowserLocales);
|
||
//設定Session及目標Locale
|
||
$request->session()->put($this->cookieAndSessionKey, $validBrowserLocale);
|
||
$setLocale = $setLocaleCookie = $validBrowserLocale;
|
||
}
|
||
}
|
||
}
|
||
|
||
if($setLocale) {
|
||
//如果有目標Locale
|
||
app()->setLocale($setLocale);
|
||
} else {
|
||
//如果沒有目標Locale,則設定成預設語言
|
||
app()->setLocale(config('app.fallback_locale'));
|
||
}
|
||
|
||
//如果有Cookie,則帶入request
|
||
if($setLocaleCookie) {
|
||
return $next($request)->withCookie(cookie()->forever($this->cookieAndSessionKey, $setLocaleCookie));
|
||
} else {
|
||
return $next($request);
|
||
}
|
||
}
|
||
}
|