move into sonardesk
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Localization\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\View\View;
|
||||
use Modules\Localization\Models\Locale;
|
||||
use Modules\Localization\Services\LocaleManager;
|
||||
|
||||
final class LocaleController extends Controller
|
||||
{
|
||||
public function index(): View
|
||||
{
|
||||
abort_unless(auth()->user()->can('localization.manage'), 403);
|
||||
$subjects = collect(config('localization.supported_subjects'))->map(function (array $config): array {
|
||||
$model = $config['model'];
|
||||
|
||||
return $config + ['records' => $model::query()->latest()->limit(8)->get()];
|
||||
});
|
||||
|
||||
return view('localization::admin.index', ['locales' => Locale::query()->orderBy('position')->get(), 'subjects' => $subjects]);
|
||||
}
|
||||
|
||||
public function switch(string $locale, LocaleManager $manager): RedirectResponse
|
||||
{
|
||||
$manager->activate($locale);
|
||||
|
||||
return back();
|
||||
}
|
||||
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
abort_unless($request->user()->can('localization.manage'), 403);
|
||||
$data = $request->validate($this->rules());
|
||||
if (($data['is_default'] ?? false) === true) {
|
||||
Locale::query()->update(['is_default' => false]);
|
||||
}
|
||||
Locale::query()->create($data);
|
||||
|
||||
return back()->with('success', 'Locale created.');
|
||||
}
|
||||
|
||||
public function update(Request $request, Locale $locale): RedirectResponse
|
||||
{
|
||||
abort_unless($request->user()->can('localization.manage'), 403);
|
||||
$data = $request->validate($this->rules($locale));
|
||||
if (($data['is_default'] ?? false) === true) {
|
||||
Locale::query()->whereKeyNot($locale->id)->update(['is_default' => false]);
|
||||
}
|
||||
$locale->update($data);
|
||||
|
||||
return back()->with('success', 'Locale updated.');
|
||||
}
|
||||
|
||||
public function destroy(Request $request, Locale $locale): RedirectResponse
|
||||
{
|
||||
abort_unless($request->user()->can('localization.manage'), 403);
|
||||
abort_if($locale->is_default, 422, 'The default locale cannot be deleted.');
|
||||
$locale->delete();
|
||||
|
||||
return back()->with('success', 'Locale deleted.');
|
||||
}
|
||||
|
||||
private function rules(?Locale $locale = null): array
|
||||
{
|
||||
return [
|
||||
'code' => ['required', 'string', 'max:20', 'unique:locales,code,'.($locale?->id ?? 'NULL')],
|
||||
'name' => ['required', 'string', 'max:100'], 'native_name' => ['required', 'string', 'max:100'],
|
||||
'regional_code' => ['nullable', 'string', 'max:20'], 'direction' => ['required', 'in:ltr,rtl'],
|
||||
'date_format' => ['required', 'string', 'max:40'], 'time_format' => ['required', 'string', 'max:40'],
|
||||
'timezone' => ['required', 'timezone'], 'currency_code' => ['nullable', 'string', 'size:3'],
|
||||
'currency_symbol' => ['nullable', 'string', 'max:10'], 'position' => ['nullable', 'integer', 'min:0'],
|
||||
'is_default' => ['sometimes', 'boolean'], 'is_active' => ['sometimes', 'boolean'],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Localization\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\View\View;
|
||||
use Modules\Localization\Models\Locale;
|
||||
|
||||
final class TranslationController extends Controller
|
||||
{
|
||||
public function edit(string $subject, int $id): View
|
||||
{
|
||||
abort_unless(auth()->user()->can('localization.translate'), 403);
|
||||
[$record, $config] = $this->resolve($subject, $id);
|
||||
$record->load('translations.locale');
|
||||
|
||||
return view('localization::admin.translate', ['record' => $record, 'subject' => $subject, 'config' => $config, 'locales' => Locale::query()->active()->get()]);
|
||||
}
|
||||
|
||||
public function update(Request $request, string $subject, int $id): RedirectResponse
|
||||
{
|
||||
abort_unless($request->user()->can('localization.translate'), 403);
|
||||
[$record, $config] = $this->resolve($subject, $id);
|
||||
$data = $request->validate(['translations' => ['array'], 'translations.*' => ['array']]);
|
||||
foreach ($data['translations'] ?? [] as $localeCode => $fields) {
|
||||
foreach ($config['fields'] as $field) {
|
||||
$record->setTranslation($field, $localeCode, $fields[$field] ?? null, $request->user()->id);
|
||||
}
|
||||
}
|
||||
|
||||
return back()->with('success', 'Translations saved.');
|
||||
}
|
||||
|
||||
private function resolve(string $subject, int $id): array
|
||||
{
|
||||
$config = config("localization.supported_subjects.$subject");
|
||||
abort_unless(is_array($config), 404);
|
||||
$record = $config['model']::query()->findOrFail($id);
|
||||
|
||||
return [$record, $config];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Localization\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Modules\Localization\Models\Locale;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
final class SetLocale
|
||||
{
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
$sessionKey = (string) config('localization.session_key', 'locale');
|
||||
$fallback = (string) config('localization.default_locale', config('app.locale', 'en'));
|
||||
|
||||
$code = $request->route('locale');
|
||||
|
||||
if (! $code && $request->hasSession()) {
|
||||
$code = $request->session()->get($sessionKey);
|
||||
}
|
||||
|
||||
if (! Schema::hasTable('locales')) {
|
||||
app()->setLocale(is_string($code) && $code !== '' ? $code : $fallback);
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
if (! $code) {
|
||||
$code = Locale::query()
|
||||
->where('is_default', true)
|
||||
->value('code') ?: $fallback;
|
||||
}
|
||||
|
||||
$isActive = Locale::query()
|
||||
->where('code', $code)
|
||||
->where('is_active', true)
|
||||
->exists();
|
||||
|
||||
if ($isActive) {
|
||||
app()->setLocale((string) $code);
|
||||
|
||||
if ($request->hasSession()) {
|
||||
$request->session()->put($sessionKey, $code);
|
||||
}
|
||||
} else {
|
||||
app()->setLocale($fallback);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user