现在,我需要根据URL中设置的区域设置来设置我的区域设置,以便我的应用程序正常工作。我也使用翻译的插件,如果在加载路线之前没有设置区域设置,它将始终默认回默认区域设置。因此,我需要在例如RouteServiceProvider
中设置区域设置。
为此,我现在在RouteServiceProdiver
的boot
方法中有以下代码:
if (in_array(request()->segment(1), ['ca', 'en', 'es', 'nl']))
{
request()->segment(1)
? app()->setLocale(request()->segment(1))
: app()->setLocale('en');
}
所以目前我有四种语言可以使用。我所有的网址都是这样的:
https://mywebsite.com/en/users
https://mywebsite.com/nl/gebruikers
因此区域设置始终设置为URL的segment(1)
。
在我的LocaleMiddleware
中,我有以下内容:
if (Auth::check())
{
app()->setLocale($request->user()->getLocale());
}
$request->user()->getLocale()
只返回en
、nl
等等。
- 问题:**
有时候,不管出于什么原因,如果当前语言环境设置为nl
,则URL将更改为en
。
所以我现在的网址是:
https://mywebsite.com/nl/gebruikers
但是我点击了refresh
,或者back
,或者类似的东西,突然URL变成了:
https://mywebsite.com/en/users
当然,除了我不喜欢它的外观外,它还带来了一个问题,即URL外观的外观问题。如果我去任何模型查看详细信息,我会得到一个404。例如:我的locale现在被设置为荷兰语,但是在URL中,由于某种原因,它被设置为en
。
https://mywebsite.com/en/categories/slug-en/show
但实际上它应该寻找带有slug-nl
slug的模型,所以它没有找到它并抛出错误,这是因为对于这个用户,locale实际上被设置为nl
,但是route和slug被设置为en
locale。
- TL; DR:**
我可以使用中间件完美地设置用户区域设置,一切正常工作。但由于特定原因,我需要在加载路由之前设置我的区域设置,这需要在例如我的RouteServiceProvider
或AppServiceProvider
中完成。
如果我能以某种方式访问登录的用户或其中一个提供程序中的会话,那么我就没有问题了。但由于这是不可能的,我卡住了。
1条答案
按热度按时间gpnt7bae1#
所以之前的解决方案是下面的答案。但是我已经删除了这个,做了一些更多的测试,看起来最初的问题已经解决了,我不需要再做下面的了。这解决了整个问题。
我已经通过在
RouteServiceProvider
的boot
方法中设置我的语言环境解决了这个问题: