craft-forge / filament-language-switcher
Zero-config language switcher for Filament admin panels. Automatically scans available translations, renders dropdown with country flags, persists selection via sessions.
Package info
github.com/craft-forge/filament-language-switcher
pkg:composer/craft-forge/filament-language-switcher
Requires
- php: ^8.1
- filament/filament: ^3.0|^4.0|^5.0
- spatie/laravel-package-tools: ^1.16
- stijnvanouplines/blade-country-flags: ^1.0.6
Requires (Dev)
- orchestra/testbench: ^9.0
- phpunit/phpunit: ^11.5.3
README
A simple and elegant language switcher plugin for Filament admin panels. Automatically detects available Filament translations or allows custom language configuration with optional flag icons. Supports auth pages, cookie persistence, and locale change events.
Demo
Installation
| Plugin Version | Filament Version | PHP Version |
|---|---|---|
| 1.x | 3.x, 4.x, 5.x | > 8.1 |
1. Install the package via Composer:
composer require craft-forge/filament-language-switcher
2. Register the plugin in your Filament panel configuration (e.g. AdminPanelProvider):
use CraftForge\FilamentLanguageSwitcher\FilamentLanguageSwitcherPlugin; public function panel(Panel $panel): Panel { return $panel ->plugins([ FilamentLanguageSwitcherPlugin::make(), ]); }
The plugin will automatically detect available Filament language files and display them in a dropdown menu.
Configuration
Locales
By default, the plugin auto-detects available Filament language files. To define the locale list manually, pass it to locales() - choose one of three formats:
Locale codes - names and flags are resolved automatically from the built-in dictionary (200+ languages):
FilamentLanguageSwitcherPlugin::make() ->locales(['en', 'fr', 'de'])
Full control - specify name and flag per locale. Flag codes reference: https://flagicons.lipis.dev.
FilamentLanguageSwitcherPlugin::make() ->locales([ ['code' => 'en', 'name' => 'English', 'flag' => 'us'], ['code' => 'fr', 'name' => 'Français', 'flag' => 'fr'], ['code' => 'de', 'name' => 'Deutsch', 'flag' => 'de'], ])
Dynamic - load locales at runtime (e.g. from a database):
FilamentLanguageSwitcherPlugin::make() ->locales(fn () => Language::pluck('code')->toArray())
Remember Locale
Store the selected locale in a cookie to persist across browser sessions (e.g. after logout):
FilamentLanguageSwitcherPlugin::make() ->rememberLocale() // forever ->rememberLocale(days: 30) // for 30 days
Custom Render Hook
Change where the language switcher appears in the panel:
use Filament\View\PanelsRenderHook; FilamentLanguageSwitcherPlugin::make() ->renderHook(PanelsRenderHook::USER_MENU_PROFILE_AFTER)
Popular placements:
USER_MENU_BEFORE— before the user menu (default)USER_MENU_PROFILE_AFTER— after user profile in dropdownUSER_MENU_AFTER— after the user menuSIDEBAR_FOOTER— at the bottom of sidebarFOOTER— in the page footer
All available render hooks: https://filamentphp.com/docs/5.x/advanced/render-hooks
Show on Auth Pages
Display the language switcher on login, register, and password reset pages:
FilamentLanguageSwitcherPlugin::make() ->showOnAuthPages()
Hide Flags
Display only language names without flag icons:
FilamentLanguageSwitcherPlugin::make() ->showFlags(false)
Event
The plugin dispatches a LocaleChanged event whenever a user switches locale, providing both the new and previous locale:
use CraftForge\FilamentLanguageSwitcher\Events\LocaleChanged; use Illuminate\Support\Facades\Event; public function boot(): void { Event::listen(LocaleChanged::class, function (LocaleChanged $event) { // auth()->user()->setLocale($event->newLocale); // Log::info("Locale changed from {$event->oldLocale} to {$event->newLocale}"); }); }
License
The MIT License (MIT). Please see License File for more information.



