chinleung/laravel-multilingual-routes
Register multilingual Laravel routes from a single definition. Automatically generates locale-prefixed URLs based on configured locales, with optional default-locale prefixing. Includes middleware to detect request locale and switch the app locale accordingly.
Installation:
composer require chinleung/laravel-multilingual-routes
Add Middleware (in bootstrap/app.php):
$middleware->web(prepend: [DetectRequestLocale::class]);
Configure Locales:
php artisan vendor:publish --provider="ChinLeung\MultilingualRoutes\MultilingualRoutesServiceProvider" --tag="config"
app.locales in .env or config/app.php (e.g., en,fr,es).First Route:
// routes/web.php
Route::multilingual('home', 'HomeController')->name('home');
/home (en), /fr/accueil (fr), etc. (requires resources/lang/fr/routes.php).Route::multilingual('about')->view('about');
resources/views/about.blade.php for all locales./about (en), /fr/a-propos (fr).Route Registration:
Route::multilingual('{resource}', 'Controller')->name('prefix');
resources/lang/{locale}/routes.php for URI translations.Resource Routes:
Route::multilingualResource('posts', 'PostController');
index, store, show, etc., for each locale.posts/{post} → articles/{article}).Locale-Specific Logic:
Route::multilingual('contact')->only(['en', 'fr']); // Exclude other locales
Route::multilingual('support')->except(['es']); // Exclude Spanish
Middleware:
Route::multilingual('admin', 'AdminController')->middleware('auth');
Dynamic Names:
Route::multilingual('blog')->names([
'en' => 'blog',
'fr' => 'journal',
]);
View Data:
Route::multilingual('profile')->view('profile', ['user' => auth()->user()]);
Redirects:
Route::multilingual('old-page')->redirect('new-page');
Signed Routes:
URL::signedLocalizedRoute('unsubscribe', ['user' => 1]);
Locale-Aware Controllers:
public function __invoke(Request $request) {
$locale = app()->getLocale();
// Logic based on locale
}
Fallback Routes:
current_route('fr', route('fallback')); // Fallback if route doesn’t exist in FR
Route Caching:
php artisan route:cache
API Routes:
Route::prefix('api')->group(function () {
Route::multilingual('v1/data', 'DataController');
});
Missing Translations:
Route [fr.test] not defined.resources/lang/fr/routes.php includes all route keys (e.g., test/{test} for resources).Locale Detection Conflicts:
DetectRequestLocale may override app-wide locale.app()->setLocale($locale) in middleware if needed.Route Caching:
route:clear or route:cache.Default Locale Prefix:
en) may not be prefixed (e.g., /home vs /fr/accueil).prefix_default_locale: true.Resource Route Parameters:
{resource} in URIs must match translation keys exactly.posts/{post} → publicaciones/{publicacion}).List All Routes:
php artisan route:list
grep "fr\.").Check Current Route:
dd(current_route()); // Current locale
dd(current_route('fr')); // French version
Test Locale Switching:
app()->setLocale('fr');
Route::getCurrentRoute()->uri; // Should reflect FR translation
Middleware Order:
DetectRequestLocale is first in the web group.Custom URI Generator:
ChinLeung\MultilingualRoutes\RouteGenerator in a service provider.Dynamic Locale Detection:
DetectRequestLocale to support subdomains or query params:
public function handle(Request $request, Closure $next) {
$locale = $request->segment(1) ?? app()->getLocale();
app()->setLocale($locale);
return $next($request);
}
Locale-Specific Middleware:
Route::multilingual('admin')->middleware(['locale' => 'auth:admin']);
middleware with locale-specific logic.Fluent API:
Route::multilingualResource('users')
->only(['index', 'show'])
->middleware('auth')
->names(['en' => 'users', 'fr' => 'utilisateurs']);
Avoid Dynamic Locale Switching:
Use localized_route():
route() + manual locale handling.Minimize Translations:
Disable Caching in Dev:
$this->app->routeMiddlewareGroup('web', [
// ... other middleware
]);
route:cache in config/caching.php.How can I help you explore Laravel packages today?