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, ])
Toma tu tiempo para entender cada concepto antes de continuar con el siguiente.
Practica los ejemplos en tu propio entorno de desarrollo para mejor comprensión.
No dudes en revisar los recursos adicionales mencionados en el artículo.
Page loaded in 19.81 ms