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 = [
\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' => [],

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 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);
}

View File

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

View File

@ -1,7 +1,10 @@
@extends('setup.wizard.master')
@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 class="step">

View File

@ -1,7 +1,10 @@
@extends('setup.updates.master')
@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>

View File

@ -1,7 +1,10 @@
@extends('setup.updates.master')
@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>

View File

@ -1,5 +1,7 @@
<select id="language-chooser" onchange="refreshWithLangPrefer()">
@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
</select>

View File

@ -7,7 +7,9 @@
</a>
<ul class="dropdown-menu" role="menu">
@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
</ul>
</li>