我在网站的页脚上有一个选择菜单。每个选项都是国家/地区的名称。该网站默认为英文,但用户应该能够选择5个可用国家/地区中的一个,并且该网站应将文本翻译为所选语言。
使用下面的代码显示" Missing required parameters for [Route: site.translate] [URI: {language}].
"。你知道错误在哪里吗?
// LocaleMiddleware
class LocaleMiddleware
{
protected $languages = ['en','fr','es', 'de'];
public function handle($request, Closure $next)
{
if(!session()->has('locale'))
{
session()->put('locale', $request->getPreferredLanguage($this->languages));
}
app()->setLocale(session('locale'));
return $next($request);
}
}
// TranslateLocale控制器
class TranslateLocale extends Controller
{
public function language($language)
{
if(Session::has(locale)){
session()->set('locale', $language);}
else{
session()->set('locale', 'en');
}
return redirect()->back();
}
}
路线:
Route::get('/{language}', [
'uses' => 'TranslateLocale@language',
'as' =>'site.translate'
]);
页脚上的Html选择菜单供用户选择语言:
<h3>Language</h3>
<form method="get" action="{{route('site.translate')}}">
{{csrf_field()}}
<select name="language" class="form-control" id="exampleFormControlSelect1">
<option selected class="selected" value="de">German</option>
<option value="en">English</option>
<option value="fr">French</option>
<option value="es">Spanish</option>
<option>5</option>
</select>
</form>
答案 0 :(得分:0)
表单将您的参数附加为 GET 值,因此laravel不会将其识别为变量语言,如果您希望保持路径的方式应该生成网址,但我认为更简单的解决方案是将您的路线和控制器调整为:
方法1:
<强>路线强>
Route::get('/language', [
'uses' => 'TranslateLocale@language',
'as' =>'site.translate'
]);
<强>控制器强>
class TranslateLocale extends Controller
{
public function language(Request $request)
{
if (Session::has(locale)) :
session()->set('locale', $request->language);//obtain value from GET parameter
else :
session()->set('locale', 'en');
endif;
return redirect()->back();
}
}
如果确实需要保留现有路线,解决问题的一种方法是使用javascript根据所选值创建路线,可以使用以下内容完成:
//为您的表单添加和ID - &gt; id="languageForm"
然后用js:
$('#languageForm').submit(function(e) {
// change action route from the default GET /?language to /{language}
$('#languageForm').attr('action', '/' + $('#exampleFormControlSelect1').val());
// not sure if you need to specify .submit() on the form again, try with or without hehe xd
$('#languageForm').submit();
});