我的应用可以使用网址请求更改区域设置。
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);
}
问题是App::getLocale()
中的web.php
始终返回默认的区域设置,即使区域设置设置为另一个(因为我可以在网络上看到不同的文本)。
$locale = App::getLocale();
dd($locale); // default locale set in config.php
我尝试使用session('locale')
,但它始终返回null
。我很确定它是在会话中设置的,因为我可以看到网站有该语言环境。
我需要引用locale的原因是因为我想根据locale生成动态路由前缀。
$locale = App::getLocale();
Route::prefix($locale)->group(function () {
....
});
我想知道这里的问题是什么?是因为会话没有在路由之前实例化吗?
Kernal.php
protected $middlewareGroups = [
'web' => [
... (default)
\App\Http\Middleware\SetLocale::class,
],
];
所以我dd()web.php上的App :: getLocale()和我的全球网络中间件,web.php上的dd()首先打印出来......
所以我在注册任何全局中间件之前调用web.php。但是,如何根据locale ???
设置动态前缀答案 0 :(得分:3)
你可以使用这样的东西
这是路线
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>
希望这可以帮助你..
答案 1 :(得分: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()->getLocale())
放入您的控制器中。
这应该有用。