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