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'], ]; } }