Integrar el Selector de Idioma en el Menú de Usuario para una Barra Superior de Filament php
Registra un nuevo gancho de renderizado: Comienza registrando un nuevo gancho de renderizado en tu proveedor de panel. Colocaremos el selector en la posición USER_MENU_PROFILE_AFTER para mantener la barra superior limpia, pero puedes registrarlo en cualquier otra posición que desees.
->renderHook( PanelsRenderHook::USER_MENU_PROFILE_AFTER, fn (): View => view('filament.hooks.lang-switcher'), )
Usaremos el componente dropdown de Filament para renderizar la sub-navegación del selector de idioma. Personaliza la interfaz según sea necesario, como agregar banderas para los diferentes idiomas.
En tu archivo filament.hooks.lang-switcher:
<div> <x-filament::dropdown maxHeight="250px" placement="left-start" teleport="true" > <x-slot name="trigger"> <div class="p-2 flex items-center justify-start gap-2"> <x-filament::icon icon="heroicon-o-chevron-left" class="mx-1 h-5 w-5 text-gray-500 dark:text-gray-400" /> Seleccionar idioma </div> </x-slot> <x-filament::dropdown.header class="font-semibold" color="gray" icon="heroicon-o-language" > Seleccionar idioma </x-filament::dropdown.header> <x-filament::dropdown.list> <x-filament::dropdown.list.item :color="(app()->getLocale() === 'en') ? 'primary' : null" icon="heroicon-o-chevron-right" :href="url('lang/en')" tag="a" > Inglés </x-filament::dropdown.list.item> <x-filament::dropdown.list.item :color="(app()->getLocale() === 'es') ? 'primary' : null" icon="heroicon-o-chevron-right" :href="url('lang/es')" tag="a" > Español </x-filament::dropdown.list.item> </x-filament::dropdown.list> </x-filament::dropdown> </div>
Crea una ruta sencilla para capturar el idioma seleccionado y almacenarlo en la sesión:
Route::get('lang/{lang}', function ($lang) { session()->put('current_lang', $lang); return redirect(url()->previousPath()); });
Define un middleware para indicarle a Laravel que debe tomar el idioma desde la sesión:
class SetLang { public function handle(Request $request, Closure $next): Response { return app(StartSession::class) ->handle($request, function ($request) use ($next) { if (! session()->has('current_lang')) { session()->put('current_lang', 'en'); } app()->setLocale(session('current_lang', 'en')); return $next($request); }); } }
Finalmente, registra el middleware dentro del proveedor de panel Filament:
->middleware([ //... SetLang::class, ])
Page loaded in 32.83 ms