From c628a3da3eaacdddce5ccdef568c46381e74200f Mon Sep 17 00:00:00 2001 From: printempw Date: Wed, 18 Jan 2017 22:31:35 +0800 Subject: [PATCH] make language detector more accurate --- app/Http/Kernel.php | 3 +- app/Http/Middleware/AfterSessionBooted.php | 34 ++++++++++++++++ app/Http/Middleware/DetectLanguagePrefer.php | 36 ++++++++++++++++ app/Http/Middleware/SaveOptionRepository.php | 33 --------------- app/Providers/BootServiceProvider.php | 43 ++++++++++---------- config/locales.php | 3 ++ resources/views/setup/locked.tpl | 5 ++- resources/views/setup/updates/success.tpl | 5 ++- resources/views/setup/updates/welcome.tpl | 5 ++- resources/views/setup/wizard/language.tpl | 4 +- resources/views/vendor/language.tpl | 4 +- 11 files changed, 114 insertions(+), 61 deletions(-) create mode 100644 app/Http/Middleware/AfterSessionBooted.php create mode 100644 app/Http/Middleware/DetectLanguagePrefer.php delete mode 100644 app/Http/Middleware/SaveOptionRepository.php diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 033c157e..3bfa2bdb 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -15,6 +15,7 @@ class Kernel extends HttpKernel */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, + \App\Http\Middleware\DetectLanguagePrefer::class, ]; /** @@ -29,7 +30,7 @@ class Kernel extends HttpKernel \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, - \App\Http\Middleware\SaveOptionRepository::class, + \App\Http\Middleware\AfterSessionBooted::class, ], 'static' => [], diff --git a/app/Http/Middleware/AfterSessionBooted.php b/app/Http/Middleware/AfterSessionBooted.php new file mode 100644 index 00000000..38dedfc2 --- /dev/null +++ b/app/Http/Middleware/AfterSessionBooted.php @@ -0,0 +1,34 @@ +call($job); + } + } + + return $next($request); + } + +} diff --git a/app/Http/Middleware/DetectLanguagePrefer.php b/app/Http/Middleware/DetectLanguagePrefer.php new file mode 100644 index 00000000..c6c97199 --- /dev/null +++ b/app/Http/Middleware/DetectLanguagePrefer.php @@ -0,0 +1,36 @@ +cookie('locale', config('app.locale')); + } + + return $response; + } + + public function detect(Request $request) + { + $locale = $request->input('lang') ?: ($request->cookie('locale') ?: $request->getPreferredLanguage()); + + // if current locale is an alias of other locale + if (($info = array_get(config('locales'), $locale)) && ($alias = array_get($info, 'alias'))) { + $locale = $alias; + } + + app()->setLocale($locale); + AfterSessionBooted::$jobs[] = function () { + session(['locale' => config('app.locale')]); + }; + } + +} diff --git a/app/Http/Middleware/SaveOptionRepository.php b/app/Http/Middleware/SaveOptionRepository.php deleted file mode 100644 index f1d70d17..00000000 --- a/app/Http/Middleware/SaveOptionRepository.php +++ /dev/null @@ -1,33 +0,0 @@ -save(); - } -} diff --git a/app/Providers/BootServiceProvider.php b/app/Providers/BootServiceProvider.php index cca3d964..c1ff4e56 100644 --- a/app/Providers/BootServiceProvider.php +++ b/app/Providers/BootServiceProvider.php @@ -4,7 +4,6 @@ namespace App\Providers; use View; use Utils; -use Schema; use App\Services\Database; use Illuminate\Http\Request; use Illuminate\Support\ServiceProvider; @@ -21,11 +20,20 @@ class BootServiceProvider extends ServiceProvider */ public function boot(Request $request) { - View::addExtension('tpl', 'blade'); + // detect current locale + $this->app->call('App\Http\Middleware\DetectLanguagePrefer@detect'); - // set current locale - $this->i18n($request); + $this->checkFilePermissions(); + $this->checkDatabaseConnection(); + // skip the installation check when setup or under CLI + if (!$request->is('setup*') && PHP_SAPI != "cli") { + $this->checkInstallation(); + } + } + + protected function checkFilePermissions() + { // check dotenv if (!file_exists(base_path('.env'))) { throw new PrettyPageException(trans('setup.file.no-dot-env'), -1); @@ -36,6 +44,13 @@ class BootServiceProvider extends ServiceProvider throw new PrettyPageException(trans('setup.permissions.storage'), -1); } + if (!SetupController::checkDirectories()) { + throw new PrettyPageException(trans('setup.file.permission-error'), -1); + } + } + + protected function checkDatabaseConnection() + { try { // check database config Database::prepareConnection(); @@ -45,11 +60,6 @@ class BootServiceProvider extends ServiceProvider $e->getCode() ); } - - // skip the installation check when setup or under CLI - if (!$request->is('setup') && !$request->is('setup/*') && PHP_SAPI != "cli") { - $this->checkInstallation(); - } } protected function checkInstallation() @@ -59,10 +69,6 @@ class BootServiceProvider extends ServiceProvider return redirect('/setup')->send(); } - if (!SetupController::checkDirectories()) { - throw new PrettyPageException(trans('setup.file.permission-error'), -1); - } - if (Utils::versionCompare(config('app.version'), option('version', ''), '>')) { return redirect('/setup/update')->send(); } @@ -70,15 +76,6 @@ class BootServiceProvider extends ServiceProvider return true; } - protected function i18n($request) - { - $locale = $request->input('lang') ?: ($request->cookie('locale') ?: $request->getPreferredLanguage()); - - app()->setLocale($locale); - session()->set('locale', $locale); - cookie()->queue('locale', $locale); - } - /** * Register any application services. * @@ -86,6 +83,8 @@ class BootServiceProvider extends ServiceProvider */ public function register() { + View::addExtension('tpl', 'blade'); + $this->app->singleton('options', OptionRepository::class); $this->app->singleton('database', Database::class); } diff --git a/config/locales.php b/config/locales.php index 01eb72e3..0930baa4 100644 --- a/config/locales.php +++ b/config/locales.php @@ -17,4 +17,7 @@ return [ 'name' => 'English', 'short_name' => 'EN', ], + 'en_US' => [ + 'alias' => 'en', + ], ]; diff --git a/resources/views/setup/locked.tpl b/resources/views/setup/locked.tpl index cf9c80a2..892bbf4b 100644 --- a/resources/views/setup/locked.tpl +++ b/resources/views/setup/locked.tpl @@ -1,7 +1,10 @@ @extends('setup.wizard.master') @section('content') -

{{ trans('setup.locked.title') }}

+

+{{ trans('setup.locked.title') }} +@include('setup.wizard.language') +

{{ trans('setup.locked.text') }}

diff --git a/resources/views/setup/updates/success.tpl b/resources/views/setup/updates/success.tpl index d8dc674b..8d0aeb04 100644 --- a/resources/views/setup/updates/success.tpl +++ b/resources/views/setup/updates/success.tpl @@ -1,7 +1,10 @@ @extends('setup.updates.master') @section('content') -

{{ trans('setup.updates.success.title') }}

+

+{{ trans('setup.updates.success.title') }} +@include('setup.wizard.language') +

{{ trans('setup.updates.success.text', ['version' => config('app.version')]) }}

diff --git a/resources/views/setup/updates/welcome.tpl b/resources/views/setup/updates/welcome.tpl index 74284f5c..4c9a8b13 100644 --- a/resources/views/setup/updates/welcome.tpl +++ b/resources/views/setup/updates/welcome.tpl @@ -1,7 +1,10 @@ @extends('setup.updates.master') @section('content') -

{{ trans('setup.updates.welcome.title') }}

+

+{{ trans('setup.updates.welcome.title') }} +@include('setup.wizard.language') +

{!! nl2br(trans('setup.updates.welcome.text', ['version' => config('app.version')])) !!}

diff --git a/resources/views/setup/wizard/language.tpl b/resources/views/setup/wizard/language.tpl index b72a1a10..ae1e08a8 100644 --- a/resources/views/setup/wizard/language.tpl +++ b/resources/views/setup/wizard/language.tpl @@ -1,5 +1,7 @@ diff --git a/resources/views/vendor/language.tpl b/resources/views/vendor/language.tpl index e595e51a..80fb447c 100644 --- a/resources/views/vendor/language.tpl +++ b/resources/views/vendor/language.tpl @@ -7,7 +7,9 @@