diff --git a/app/Listeners/SetAppLocale.php b/app/Listeners/SetAppLocale.php new file mode 100644 index 00000000..e4e4688e --- /dev/null +++ b/app/Listeners/SetAppLocale.php @@ -0,0 +1,35 @@ +request = $request; + } + + public function handle($event) + { + /** @var User */ + $user = $event->user; + + if ($this->request->has('lang')) { + $user->locale = $this->request->input('lang'); + $user->save(); + + return; + } + + $locale = $user->locale; + if ($locale) { + app()->setLocale($locale); + } + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 247401ee..94fcdf1b 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -33,5 +33,8 @@ class EventServiceProvider extends ServiceProvider 'closet.removed' => [ Listeners\ResetPlayerForRemovedClosetItem::class, ], + 'Illuminate\Auth\Events\Authenticated' => [ + Listeners\SetAppLocale::class, + ], ]; } diff --git a/database/factories/UserModelFactory.php b/database/factories/UserModelFactory.php index 00239f0b..ef9fad36 100644 --- a/database/factories/UserModelFactory.php +++ b/database/factories/UserModelFactory.php @@ -8,6 +8,7 @@ $factory->define(User::class, function (Faker\Generator $faker) { return [ 'email' => $faker->email, 'nickname' => $faker->name, + 'locale' => null, 'score' => 1000, 'avatar' => 0, 'password' => app('cipher')->hash(Str::random(10), config('secure.salt')), diff --git a/tests/ListenersTest/SetAppLocaleTest.php b/tests/ListenersTest/SetAppLocaleTest.php new file mode 100644 index 00000000..7bac0557 --- /dev/null +++ b/tests/ListenersTest/SetAppLocaleTest.php @@ -0,0 +1,36 @@ +create(); + + // This is a hacky way. + // We must call `get` first before set authentication, + // since this let Laravel update the `Request` instance, + // otherwise the event handler will be called first and + // it won't be able to retrieve request information. + $this->get('/?lang=en'); + $this->actingAs($user); + + $this->assertEquals('en', $user->fresh()->locale); + } + + public function testSetAppLocale() + { + $user = factory(User::class)->create(['locale' => 'zh_CN']); + + event(new \Illuminate\Auth\Events\Authenticated('web', $user)); + $this->assertEquals('zh_CN', app()->getLocale()); + + app()->setLocale('en'); + } +}