【问题标题】:Laravel doesn't give the correct locale in web.phpLaravel 没有在 web.php 中给出正确的语言环境
【发布时间】:2018-08-10 04:09:57
【问题描述】:

我的应用可以使用 url 请求更改语言环境。

Route::get('/setLocale/{locale}', function (Request $request, $locale) {
    session()->put('locale', $locale);
    App::setLocale($locale);
    return redirect('/');
})->name('setLocale');

并且该语言环境字符串将存储在会话中。如果有的话,我使用中间件使用会话数据动态更改语言环境。

public function handle($request, Closure $next)
    {
        if (session('locale')) {
            App::setLocale(session('locale'));
        }
        return $next($request);
    }

问题是web.php 中的App::getLocale() 总是返回默认区域设置,即使区域设置为另一个(因为我可以在网络上看到不同的文本)。

$locale = App::getLocale();

dd($locale); // default locale set in config.php

我尝试使用session('locale'),但它总是返回null。我很确定它是在会话中设置的,因为我可以看到该网站具有该语言环境。

我需要参考语言环境的原因是因为我想根据语言环境生成动态路由前缀。

$locale = App::getLocale();

Route::prefix($locale)->group(function () {
   ....
});

我想知道这里有什么问题?是不是因为 session 没有在路由之前实例化?


内核.php

protected $middlewareGroups = [
        'web' => [
            ... (default)
            \App\Http\Middleware\SetLocale::class,
        ],
    ];

所以我 dd() web.php 上的 App::getLocale() 和我的 globle web 中间件, web.php 上的 dd() 首先打印...

所以我在注册任何全局中间件之前调用了 web.php。但是那我怎样才能根据语言环境设置动态前缀???

【问题讨论】:

  • @Wreigh,问题不在于在中间件中设置语言环境,因为它适用于我的情况。问题是我无法在 web.php 中获取 session('locale') 或 App::getLocale() 的正确值...
  • 你读过吗?那里的问题似乎与您的问题具有相同的性质。
  • 你看到了吗mydnic.be/post/…?你在哪里打电话App::getLocale()?是在带有上述中间件的路由组内吗?
  • @Wreigh App::getLocale();不在任何路由函数中,它位于 web.php 的“最外层”范围内。不在任何函数中...因为我需要在全局范围内定义这个变量,只有这样我才能设置动态前缀。

标签: php laravel


【解决方案1】:

您可以在 web.php 文件中使用此全局帮助程序设置获取语言环境应用程序:

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
app()->setLocale('en');
dd(app()->getLocale());

但是您的中间件将在之后应用您请求访问某些路由而不是之前。 因此,要测试您的应用语言环境,请将此代码 dd(app()-&gt;getLocale()) 放入您的控制器中。

这应该可行。

【讨论】:

  • 它总是返回默认值。甚至我的全球网络中间也已将其设置为其他语言环境。
【解决方案2】:

你可以使用这样的东西

这里是路线

Route::group(['middleware' => ['language']], function () {
   Route::get('/language/{locale}', [
    'uses' => 'Frontend\LanguageController@changeLanguage',
    'as' => 'language.changer',
    'role' => ['company', 'user']
   ]);
});

这里是语言控制器

<?php

 namespace App\Http\Controllers\Frontend;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller; 
 use Session;

class LanguageController extends Controller
{
public function changeLanguage($locale){
    Session::put('locale', $locale);
    return redirect()->back();
}
}

这是中间件

public function handle($request, Closure $next)
{
    if (Session::has('locale') == true) {

        App::setLocale(Session::get('locale'));
    }
    Carbon::setLocale(Session::get('locale'));
    return $next($request);
}

如果出现问题,这是设置您的默认语言环境

public function boot()
{
    Schema::defaultStringLength(191);
    if(Session::has('locale') == false)
    {
        App::setLocale('en');
    }
}

你终于可以使用类似的东西了:

<li class="is-relative hidden-lg hidden-md">
   <a href="/logout">
      <i class="fa fa-power-off"></i> 
      {{ trans('lang.logout') }}
     <span class="sr-only">(current)</span>
  </a>
</li>

希望这对你有所帮助..

【讨论】:

  • 这正是我分享的链接中的内容。
  • @Wreigh 也许看看标记。
  • 是的,这应该可以 :) @GrantGarrison 不需要,我只是说大声笑,谢谢!
  • @Wreigh 哦,我以为他在你要发布它或类似的东西时“偷走了”你的答案。
  • 现在不用 if else 阻止控制器中的写入方式,只需行 Session::put('locale', $locale); 即可。
猜你喜欢
  • 2022-11-13
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多