问题描述
假设我有这种网址:
example.com/en/
example.com/en/login
example.com/fr/login
我想使用中间件来设置语言,然后返回不包含语言部分的要处理的路由。这样路由器将获得/
或/login
,而没有任何语言内容。
public function handle(Request $request,Closure $next) {
app()->setLocale($request->segment(1));
// $request->server->set('REQUEST_URI',substr($_SERVER['REQUEST_URI'],4));// not working
return $next($request);
}
解决方法
我建议将语言存储在会话中,并使用中间件来设置Locale。
工作示例
SetLocale.php中间件
public function handle($request,Closure $next)
{
if (Session::has('language'))
{
App::setLocale(strtolower(Session::get('language')));
}
return $next($request);
}
用于设置会话语言的控制器功能
public function setLanguage(string $language)
{
if (Session::has('language'))
{
Session::forget('language');
}
Session::put('language',$language);
return redirect()->back();
}
因此,现在网站上发生的所有事情,中间件都将检查语言并将其设置为会话中的内容。
也不要忘记在app \ Http \ Kernel.php的$ middlewareGroups中指定中间件
您可以在网站上的任何位置创建一个表单,供用户选择其语言首选项以及到控制器功能的路径。