php Laravel -使用区域设置进行翻译

xqkwcwgp  于 2023-01-08  发布在  PHP
关注(0)|答案(1)|浏览(118)
    • bounty将在5天后过期**。回答此问题可获得+150的声誉奖励。Hardist正在寻找来自声誉良好来源的答案:我已经编辑了这个问题和TL; dr在顶部声明,但任何对我的粗体声明有效的解决方案都将获得奖励。

现在,我需要根据URL中设置的区域设置来设置我的区域设置,以便我的应用程序正常工作。我也使用翻译的插件,如果在加载路线之前没有设置区域设置,它将始终默认回默认区域设置。因此,我需要在例如RouteServiceProvider中设置区域设置。
为此,我现在在RouteServiceProdiverboot方法中有以下代码:

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()只返回ennl等等。

    • 问题:**

有时候,不管出于什么原因,如果当前语言环境设置为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:**

我可以使用中间件完美地设置用户区域设置,一切正常工作。但由于特定原因,我需要在加载路由之前设置我的区域设置,这需要在例如我的RouteServiceProviderAppServiceProvider中完成。
如果我能以某种方式访问登录的用户或其中一个提供程序中的会话,那么我就没有问题了。但由于这是不可能的,我卡住了。

gpnt7bae

gpnt7bae1#

    • 编辑:**

所以之前的解决方案是下面的答案。但是我已经删除了这个,做了一些更多的测试,看起来最初的问题已经解决了,我不需要再做下面的了。这解决了整个问题。

    • 初步答复:**

我已经通过在RouteServiceProviderboot方法中设置我的语言环境解决了这个问题:

request()->segment(1)
    ? app()->setLocale(request()->segment(1))
    : app()->setLocale('en');

相关问题