cms/app/Http/Middleware/SetAppLanguage.php

107 lines
3.7 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
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);
}
}
}