【问题标题】:Laravel; how make setLocale permanent?拉拉维尔;如何使 setLocale 永久化?
【发布时间】:2020-05-28 21:16:12
【问题描述】:

我有我的回家路线

Route::get('/', 'HomeController@index')->name('home');

以及更改语言的特定路线

Route::get('/setLocale/{locale}', 'HomeController@setLocale')->name('setLocale');

HomeController->setLocale($locale) 中,我检查$locale 是否是有效的语言环境,然后简单地做

\App::setLocale($locale);

然后重定向到家。

在这里,在HomeController->index() 中,我使用验证语言环境

$locale = \App::getLocale();

问题是用户更改语言环境后,应用设置了新的语言环境,重定向,但检测到的语言环境仍然是默认语言环境,而不是用户设置的新语言环境。

我如何/在哪里/何时可以对应用语言环境进行持久更改?

我认为 Laravel 在使用 setLocale 时设置了区域设置 cookie 或其他东西,并在使用 getLocale 时重新读取它,但现在我认为 Laravel 不是这样工作的。

我再次问:如何设置应用程序区域设置以便在页面更改后保留?

【问题讨论】:

  • 使用会话/缓存来存储区域设置 \App:setLocale('ufo-language') 只为请求生命设置区域设置。无论如何都要使用路线,不要为了搜索引擎而保存任何东西。
  • 客户要求我避免使用语言环境。他更喜欢网址翻译
  • 您的客户是否了解所有后果?这似乎很愚蠢,但如果有网站翻译,谷歌永远不会知道,因为 g-bot 似乎不存储 cookie。干杯
  • 我们导出站点地图。谷歌会知道每一页。此外,每个控制器都使用 url 段来识别语言。非常糟糕的主意,但客户想要它

标签: php laravel laravel-5


【解决方案1】:

我通过使用中间件做到了这一点。这是我的代码:

语言中间件:

public function handle($request, Closure $next)
{
    if(session()->has('locale'))
        app()->setLocale(session('locale'));
    else 
        app()->setLocale(config('app.locale'));

    return $next($request);
}

记得注册你的中间件:)

用户可以通过简单的 GET-Route 更改语言:

Route::get('/lang/{key}', function ($key) {
    session()->put('locale', $key);
    return redirect()->back();
});

希望对你有所帮助:)

显然,Laravel 7.0 有一些变化!

如果您使用上面的代码,请从 BeforeMiddleware 更改为 AfterMiddleware! (见https://laravel.com/docs/7.x/middleware

如果不这样做,session('locale') 的值将始终为空!

【讨论】:

    【解决方案2】:

    setlocale 仅适用于当前请求。如果您希望记住该值,则必须手动设置 cookie。

    我建议使用middleware 来执行此操作。

    【讨论】:

    • 在应用程序启动时简单设置呢?
    • 取决于您应用中的所有路线是否都已翻译并需要个人区域设置。
    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 2018-05-10
    • 1970-01-01
    • 2022-11-24
    • 2018-10-16
    • 2018-03-13
    • 2017-10-02
    • 2016-09-19
    相关资源
    最近更新 更多