Laravel 更改区域设置不起作用

2022-08-30 15:58:00

我正在使用语言的下拉列表,由英语和荷兰语组成。

<form class="" action="{{url('/locale')}}" method="post">
            Locale:
              <select class="" name="locale" onchange="this.form.submit()">

                <option value="en" >English</option>
                <option value="du" >Dutch</option>
              </select>
          </form>

那么这就是我的路线.php,

Route::post('/locale', function(){

     \App::setLocale(Request::Input('locale'));

     return redirect()->back();
});

它不起作用。

在我的项目中,路径是这样的

resources/
 /du
   navigation.php
 /en
  /navigation.php

来自荷兰语(du)“导航.php”

<?php
return [
  "home" => 'Home-test-dutch',  
];

和英语(en)“导航.php”

<?php
return [
  "home" => 'Home',  
];

答案 1

App::setLocale()不是持久性的,并且仅为当前请求(运行时)设置区域设置。您可以通过多种方式实现持久性(示例 2):

Route::post('/locale', function(){

     session(['my_locale' => app('request')->input('locale')]);

     return redirect()->back();
});

这将设置会话密钥,其中包含当前用户请求的值。接下来创建中间件以根据用户会话语言设置区域设置lang

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Foundation\Application;

class Language {

    public function __construct(Application $app, Request $request) {
        $this->app = $app;
        $this->request = $request;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $this->app->setLocale(session('my_locale', config('app.locale')));

        return $next($request);
    }

}

这将获取当前会话,如果为空,则将回退到在应用配置中设置的默认区域设置。

在添加以前创建的中间件中:app\Http\Kernel.phpLanguage

protected $middleware = [
   \App\Http\Middleware\Language::class,
];

作为全球中间件或仅用于Web(根据您的需求)。

方案 No2 - 基于 URL 路径的 Lang 在应用内创建具有所有可用区域设置的arrayapp config

'available_locale' => ['fr', 'gr', 'ja'],

在中间件内部,我们将检查 URL 第一段是否为 ,设置语言en, fr, gr, cyavailable_locale

public function handle($request, Closure $next)
{
      if(in_array($request->segment(1), config('app.available_locale'))){
            $this->app->setLocale($request->segment(1));
      }else{
            $this->app->setLocale(config('app.locale'));
      }

      return $next($request);
}

您需要修改以设置所有路由的前缀。因此,您可以使用“查找”(Find: )访问它们,然后将其添加到其中:(在添加之前)app\Providers\RouteServiceProviderexample.comexample.com/fr/French languagemapWebRoutesuse Illuminate\Http\Request;)

public function map(Request $request)
    {
        $this->mapApiRoutes();
        $this->mapWebRoutes($request);
    }
    protected function mapWebRoutes(Request $request)
    {
        $locale = null;
        if(in_array($request->segment(1), config('app.available_locale'))){
          $locale = $request->segment(1);
        }

        Route::group([
           'middleware' => 'web',
           'namespace' => $this->namespace,
           'prefix' => $locale
        ], function ($router) {
             require base_path('routes/web.php');
        });
    }

这将用国家/地区字母(如“fr gr cy”)作为所有路由的前缀,除了非重复内容,因此最好不要添加到available_locales_array


答案 2

我从这篇文章中解决了我的问题 https://mydnic.be/post/laravel-5-and-his-fcking-non-persistent-app-setlocale

感谢贡献“非持久性”一词的人


推荐