make language detector more accurate

This commit is contained in:
printempw 2017-01-18 22:31:35 +08:00
parent 120df57edf
commit c628a3da3e
11 changed files with 114 additions and 61 deletions

View File

@ -15,6 +15,7 @@ class Kernel extends HttpKernel
*/ */
protected $middleware = [ protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \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\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class, \Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\SaveOptionRepository::class, \App\Http\Middleware\AfterSessionBooted::class,
], ],
'static' => [], 'static' => [],

View File

@ -0,0 +1,34 @@
<?php
namespace App\Http\Middleware;
use Closure;
class AfterSessionBooted
{
/**
* Jobs should be done after session booted.
*
* @var array
*/
static $jobs;
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
foreach (static::$jobs as $job) {
if (is_callable($job)) {
app()->call($job);
}
}
return $next($request);
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class DetectLanguagePrefer
{
public function handle($request, \Closure $next)
{
$response = $next($request);
if ($response instanceof Response) {
$response->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')]);
};
}
}

View File

@ -1,33 +0,0 @@
<?php
namespace App\Http\Middleware;
use Closure;
class SaveOptionRepository
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
/**
* Do the really operations of saving modified options.
*
* @param \Illuminate\Http\Request $request
* @param \Symfony\Component\HttpFoundation\Response $response
* @return void
*/
public function terminate($request, $response)
{
// deprecated
// app('options')->save();
}
}

View File

@ -4,7 +4,6 @@ namespace App\Providers;
use View; use View;
use Utils; use Utils;
use Schema;
use App\Services\Database; use App\Services\Database;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
@ -21,11 +20,20 @@ class BootServiceProvider extends ServiceProvider
*/ */
public function boot(Request $request) public function boot(Request $request)
{ {
View::addExtension('tpl', 'blade'); // detect current locale
$this->app->call('App\Http\Middleware\DetectLanguagePrefer@detect');
// set current locale $this->checkFilePermissions();
$this->i18n($request); $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 // check dotenv
if (!file_exists(base_path('.env'))) { if (!file_exists(base_path('.env'))) {
throw new PrettyPageException(trans('setup.file.no-dot-env'), -1); 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); throw new PrettyPageException(trans('setup.permissions.storage'), -1);
} }
if (!SetupController::checkDirectories()) {
throw new PrettyPageException(trans('setup.file.permission-error'), -1);
}
}
protected function checkDatabaseConnection()
{
try { try {
// check database config // check database config
Database::prepareConnection(); Database::prepareConnection();
@ -45,11 +60,6 @@ class BootServiceProvider extends ServiceProvider
$e->getCode() $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() protected function checkInstallation()
@ -59,10 +69,6 @@ class BootServiceProvider extends ServiceProvider
return redirect('/setup')->send(); return redirect('/setup')->send();
} }
if (!SetupController::checkDirectories()) {
throw new PrettyPageException(trans('setup.file.permission-error'), -1);
}
if (Utils::versionCompare(config('app.version'), option('version', ''), '>')) { if (Utils::versionCompare(config('app.version'), option('version', ''), '>')) {
return redirect('/setup/update')->send(); return redirect('/setup/update')->send();
} }
@ -70,15 +76,6 @@ class BootServiceProvider extends ServiceProvider
return true; 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. * Register any application services.
* *
@ -86,6 +83,8 @@ class BootServiceProvider extends ServiceProvider
*/ */
public function register() public function register()
{ {
View::addExtension('tpl', 'blade');
$this->app->singleton('options', OptionRepository::class); $this->app->singleton('options', OptionRepository::class);
$this->app->singleton('database', Database::class); $this->app->singleton('database', Database::class);
} }

View File

@ -17,4 +17,7 @@ return [
'name' => 'English', 'name' => 'English',
'short_name' => 'EN', 'short_name' => 'EN',
], ],
'en_US' => [
'alias' => 'en',
],
]; ];

View File

@ -1,7 +1,10 @@
@extends('setup.wizard.master') @extends('setup.wizard.master')
@section('content') @section('content')
<h1>{{ trans('setup.locked.title') }}</h1> <h1>
{{ trans('setup.locked.title') }}
@include('setup.wizard.language')
</h1>
<p>{{ trans('setup.locked.text') }}</p> <p>{{ trans('setup.locked.text') }}</p>
<p class="step"> <p class="step">

View File

@ -1,7 +1,10 @@
@extends('setup.updates.master') @extends('setup.updates.master')
@section('content') @section('content')
<h1>{{ trans('setup.updates.success.title') }}</h1> <h1>
{{ trans('setup.updates.success.title') }}
@include('setup.wizard.language')
</h1>
<p>{{ trans('setup.updates.success.text', ['version' => config('app.version')]) }}</p> <p>{{ trans('setup.updates.success.text', ['version' => config('app.version')]) }}</p>

View File

@ -1,7 +1,10 @@
@extends('setup.updates.master') @extends('setup.updates.master')
@section('content') @section('content')
<h1>{{ trans('setup.updates.welcome.title') }}</h1> <h1>
{{ trans('setup.updates.welcome.title') }}
@include('setup.wizard.language')
</h1>
<p>{!! nl2br(trans('setup.updates.welcome.text', ['version' => config('app.version')])) !!}</p> <p>{!! nl2br(trans('setup.updates.welcome.text', ['version' => config('app.version')])) !!}</p>

View File

@ -1,5 +1,7 @@
<select id="language-chooser" onchange="refreshWithLangPrefer()"> <select id="language-chooser" onchange="refreshWithLangPrefer()">
@foreach(config('locales') as $code => $langInfo) @foreach(config('locales') as $code => $langInfo)
<option value="{{ $code }}" {!! $code == config('app.locale') ? 'selected="selected"' : '' !!}>{{ $langInfo['short_name'] }} - {{ $langInfo['name'] }}</option> @if (!isset($langInfo['alias']))
<option value="{{ $code }}" {!! $code == config('app.locale') ? 'selected="selected"' : '' !!}>{{ $langInfo['short_name'] }} - {{ $langInfo['name'] }}</option>
@endif
@endforeach @endforeach
</select> </select>

View File

@ -7,7 +7,9 @@
</a> </a>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">
@foreach(config('locales') as $code => $langInfo) @foreach(config('locales') as $code => $langInfo)
<li class="locale"><a href="?lang={{ $code }}">{{ $langInfo['name'] }}</a></li> @if (!isset($langInfo['alias']))
<li class="locale"><a href="?lang={{ $code }}">{{ $langInfo['name'] }}</a></li>
@endif
@endforeach @endforeach
</ul> </ul>
</li> </li>