【发布时间】:2015-06-25 17:31:02
【问题描述】:
我创建了一个包含两个语言环境 en 和 ar 的双语 laravel 5 应用程序。
我希望网站访问者能够通过单击标有语言名称的链接来更改网站的语言。
【问题讨论】:
标签: laravel-5
我创建了一个包含两个语言环境 en 和 ar 的双语 laravel 5 应用程序。
我希望网站访问者能够通过单击标有语言名称的链接来更改网站的语言。
【问题讨论】:
标签: laravel-5
选项 1:
所以您的迁移可能如下所示:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration {
/**
* Run the migrations.
* @return void
*/
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->string('email')->unique();
$table->string('password', 60);
$table->string('locale', 5)->default('en');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('users');
}
}
示例: 对于控制器中经过身份验证的用户或访客
public function setLocale($locale){
if(Auth::check()){
$user = User::find(Auth::user()->id);
$user->update(['locale'=>$locale]);
}else{
Session::put('locale',$locale);
}
}
App::setLocale() 设置的区域设置,因此我们将使用中间件来设置每个请求的区域设置。要了解 Laravel 如何处理 App::setLocale(),这里是 Illuminate\Foundation\Application.php 中处理区域设置的方法
public function setLocale($locale)
{
$this['config']->set('app.locale', $locale);
$this['translator']->setLocale($locale);
$this['events']->fire('locale.changed', array($locale));
}
此方法调用 Translator.php 中的另一个方法如下所示:
/**
* Set the default locale.
*
* @param string $locale
* @return void
*/
public function setLocale($locale)
{
$this->locale = $locale;
}
正如您所见,没有什么像缓存或会话这样用于记住语言环境,因此我们必须在每个请求上设置它。所以让我们为它创建一个中间件。我将其称为 LocaleMiddleware。
<?php namespace App\Http\Middleware;
use Closure, Session, Auth;
class LocaleMiddleware {
public function handle($request, Closure $next)
{
if(Auth::user()){
app()->setLocale(Auth::user()->locale);
}elseif($locale = Session::has('locale')){
app()->setLocale($locale);
}
return $next($request);
}
}
protected $middleware = [
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
'Illuminate\Cookie\Middleware\EncryptCookies',
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
'App\Http\Middleware\VerifyCsrfToken',
'App\Http\Middleware\LocaleMiddleware'
];
【讨论】:
public function getSwitchLang() { App::setLocale('ar'); return redirect()->back(); } 那我做错了什么?
protected $middlewareGroups for web。