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); } } }