首先,我不确定如何正确构造问题标题,可以随时对其进行编辑以正确表示问题。我会尽力解释我的意思。
我在我的应用上实现了本地化(教程的URL在这篇文章的底部),并且我创建了如下路线:
// Set language
Route::get('lang/{locale}', 'PagesController@lang');
它有效。但是仅在网址中只有一个“级别”的页面上:
example.com/first-level
-在这些URL上更改语言可行
example.com/first-level/second-level
-在这些页面上更改语言不起作用
起初,我认为问题出在url参数上,这是偶然的原因,我最初发现更改语言不起作用的页面是在url上,而该路由具有这样的参数
example.com/first-level/{id}
因此,我然后尝试重写将语言更改为此的路线(添加了可选参数)
// Set language
Route::get('lang/{optional?}/{locale}', 'PagesController@lang');
但这也不起作用
通过指向路线的锚标记更改语言
<a href="lang/en">English</
<a href="lang/rs">Serbian</a>
预期结果:能够从单击链接的任何页面更改语言。单击example.com/one/two
和example.com/one/{id}/two
之类的页面上的链接应该可以正常工作。
实际结果:更改语言仅在example.com
和example.com/one
之类的页面上有效,而在example.com/one/two
和example.com/one/{id}/two
上则无效。在这些页面上单击链接后,该应用程序将发送到这样的URL:分别为example.com/one/lang/en
和example.com/one/{id}/lang/en
。
答案 0 :(得分:1)
您可以简单地定义两条路线。
Route::get('lang/{locale}', 'PagesController@locale');
Route::get('lang/{optional}/{locale}', 'PagesController@lang');
然后使用您的控制器方法处理可选变量。
public function locale($locale)
{
return $this->lang(null, $locale);
}
public function lang($optional, $locale)
{
// ... your logic
}
对于链接问题,您需要使用绝对路径。
// relative path — https://yourdomain.com/current/path/lang/en
<a href="lang/en">English</a>
<a href="lang/rs">Serbian</a>
// absolute path — https://yourdomain.com/lang/en
<a href="/lang/en">English</a>
<a href="/lang/rs">Serbian</a>