make language detector more accurate
This commit is contained in:
parent
120df57edf
commit
c628a3da3e
@ -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' => [],
|
||||
|
34
app/Http/Middleware/AfterSessionBooted.php
Normal file
34
app/Http/Middleware/AfterSessionBooted.php
Normal 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);
|
||||
}
|
||||
|
||||
}
|
36
app/Http/Middleware/DetectLanguagePrefer.php
Normal file
36
app/Http/Middleware/DetectLanguagePrefer.php
Normal 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')]);
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -17,4 +17,7 @@ return [
|
||||
'name' => 'English',
|
||||
'short_name' => 'EN',
|
||||
],
|
||||
'en_US' => [
|
||||
'alias' => 'en',
|
||||
],
|
||||
];
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
4
resources/views/vendor/language.tpl
vendored
4
resources/views/vendor/language.tpl
vendored
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user