79 lines
3.0 KiB
PHP
79 lines
3.0 KiB
PHP
<?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'],
|
|
];
|
|
}
|
|
}
|