有没有办法设置可选的路线位置部分?
Is there a way to set optional route location parts?
首先,我不确定如何正确构建问题标题,请随意编辑它以正确表示问题。我会尽力解释我的意思。
我在我的应用程序上实现了本地化(URL 教程在这个 post 的底部),我创建了如下路线:
// Set language
Route::get('lang/{locale}', 'PagesController@lang');
并且有效。但仅限于 url:
中只有一个 "level" 的页面
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
。
我按照本教程对我的项目实施了本地化 https://appdividend.com/2019/04/01/how-to-create-multilingual-website-using-laravel-localization/#Step_2_Creating_Translation_Files
您可以简单地定义两条路线。
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
}
至于你的link问题,你需要使用绝对路径。
// 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>
首先,我不确定如何正确构建问题标题,请随意编辑它以正确表示问题。我会尽力解释我的意思。
我在我的应用程序上实现了本地化(URL 教程在这个 post 的底部),我创建了如下路线:
// Set language
Route::get('lang/{locale}', 'PagesController@lang');
并且有效。但仅限于 url:
中只有一个 "level" 的页面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
。
我按照本教程对我的项目实施了本地化 https://appdividend.com/2019/04/01/how-to-create-multilingual-website-using-laravel-localization/#Step_2_Creating_Translation_Files
您可以简单地定义两条路线。
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
}
至于你的link问题,你需要使用绝对路径。
// 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>