@@ -90,6 +90,42 @@ return [
90
90
];
91
91
```
92
92
93
+ ** Important for Resource Routes:** When using ` multilingualResource ` , don't forget to add translations for all resource route segments that contain parameters:
94
+
95
+ ``` php
96
+ Route::multilingualResource('test', 'TestController');
97
+ ```
98
+
99
+ ``` php
100
+ <?php
101
+
102
+ // resources/lang/fr/routes.php
103
+
104
+ return [
105
+ 'test' => 'teste',
106
+ 'test/{test}' => 'teste/{test}'
107
+ ];
108
+ ```
109
+
110
+ This will generate the following:
111
+
112
+ | Method | URI | Name | Action |
113
+ | -----------| ----------------------------| -------------------| -------------------------------------------|
114
+ | GET\| HEAD | test | en.test.index | App\Http\Controllers\TestController@index |
115
+ | GET\| HEAD | test/create | en.test.create | App\Http\Controllers\TestController@create |
116
+ | POST | test | en.test.store | App\Http\Controllers\TestController@store |
117
+ | GET\| HEAD | test/{test} | en.test.show | App\Http\Controllers\TestController@show |
118
+ | GET\| HEAD | test/{test}/edit | en.test.edit | App\Http\Controllers\TestController@edit |
119
+ | PUT | test/{test} | en.test.update | App\Http\Controllers\TestController@update |
120
+ | DELETE | test/{test} | en.test.destroy | App\Http\Controllers\TestController@destroy |
121
+ | GET\| HEAD | fr/teste | fr.test.index | App\Http\Controllers\TestController@index |
122
+ | GET\| HEAD | fr/teste/create | fr.test.create | App\Http\Controllers\TestController@create |
123
+ | POST | fr/teste | fr.test.store | App\Http\Controllers\TestController@store |
124
+ | GET\| HEAD | fr/teste/{test} | fr.test.show | App\Http\Controllers\TestController@show |
125
+ | GET\| HEAD | fr/teste/{test}/edit | fr.test.edit | App\Http\Controllers\TestController@edit |
126
+ | PUT | fr/teste/{test} | fr.test.update | App\Http\Controllers\TestController@update |
127
+ | DELETE | fr/teste/{test} | fr.test.destroy | App\Http\Controllers\TestController@destroy |
128
+
93
129
To retrieve a route, you can use the ` localized_route(string $name, array $parameters, string $locale = null, bool $absolute = true) ` instead of the ` route ` helper:
94
130
95
131
``` php
@@ -106,6 +142,13 @@ current_route('fr'); // Returns the current request's route in French version
106
142
current_route('fr', route('fallback')); // Returns the fallback route if the current route is not registered in French
107
143
```
108
144
145
+ To check if the current route matches a specific route name (without locale prefix), you can use the ` current_route_is(string $name) ` helper:
146
+
147
+ ``` php
148
+ current_route_is('home'); // Returns true if current route is 'en.home', 'fr.home', etc.
149
+ current_route_is('photos.show'); // Returns true if current route is 'en.photos.show', 'fr.photos.show', etc.
150
+ ```
151
+
109
152
### Renaming the routes
110
153
111
154
``` php
@@ -216,6 +259,117 @@ URL::signedLocalizedRoute('unsubscribe', ['user' => 1]);
216
259
URL::temporarySignedLocalizedRoute('unsubscribe', now()->addMinutes(30), ['user' => 1]);
217
260
```
218
261
262
+ ### Multilingual Resource Routes
263
+
264
+ You can also register multilingual resource routes using the ` multilingualResource ` method:
265
+
266
+ ``` php
267
+ Route::multilingualResource('photos', 'PhotoController');
268
+ ```
269
+
270
+ This will generate all the standard resource routes for each configured locale:
271
+
272
+ | Method | URI | Name | Action |
273
+ | -----------| ----------------------------| -------------------| -------------------------------------------|
274
+ | GET\| HEAD | photos | en.photos.index | App\Http\Controllers\PhotoController@index |
275
+ | GET\| HEAD | photos/create | en.photos.create | App\Http\Controllers\PhotoController@create |
276
+ | POST | photos | en.photos.store | App\Http\Controllers\PhotoController@store |
277
+ | GET\| HEAD | photos/{photo} | en.photos.show | App\Http\Controllers\PhotoController@show |
278
+ | GET\| HEAD | photos/{photo}/edit | en.photos.edit | App\Http\Controllers\PhotoController@edit |
279
+ | PUT | photos/{photo} | en.photos.update | App\Http\Controllers\PhotoController@update |
280
+ | DELETE | photos/{photo} | en.photos.destroy | App\Http\Controllers\PhotoController@destroy |
281
+ | GET\| HEAD | fr/photos | fr.photos.index | App\Http\Controllers\PhotoController@index |
282
+ | GET\| HEAD | fr/photos/create | fr.photos.create | App\Http\Controllers\PhotoController@create |
283
+ | POST | fr/photos | fr.photos.store | App\Http\Controllers\PhotoController@store |
284
+ | GET\| HEAD | fr/photos/{photo} | fr.photos.show | App\Http\Controllers\PhotoController@show |
285
+ | GET\| HEAD | fr/photos/{photo}/edit | fr.photos.edit | App\Http\Controllers\PhotoController@edit |
286
+ | PUT | fr/photos/{photo} | fr.photos.update | App\Http\Controllers\PhotoController@update |
287
+ | DELETE | fr/photos/{photo} | fr.photos.destroy | App\Http\Controllers\PhotoController@destroy |
288
+
289
+ #### Limiting resource routes to specific actions
290
+
291
+ ``` php
292
+ Route::multilingualResource('photos', 'PhotoController')->only(['index', 'show']);
293
+ ```
294
+
295
+ #### Excluding specific actions
296
+
297
+ ``` php
298
+ Route::multilingualResource('photos', 'PhotoController')->except(['create', 'edit']);
299
+ ```
300
+
301
+ #### Custom parameter names
302
+
303
+ ``` php
304
+ Route::multilingualResource('photos', 'PhotoController')->parameters([
305
+ 'photos' => 'photo_id'
306
+ ]);
307
+ ```
308
+
309
+ #### Limiting to specific locales
310
+
311
+ ``` php
312
+ Route::multilingualResource('photos', 'PhotoController')->onlyLocales(['fr']);
313
+ Route::multilingualResource('photos', 'PhotoController')->exceptLocales(['en']);
314
+ ```
315
+
316
+ #### Laravel 12.x Resource Features
317
+
318
+ All Laravel 12.x resource route features are supported:
319
+
320
+ ``` php
321
+ // Customize missing model behavior
322
+ Route::multilingualResource('photos', 'PhotoController')
323
+ ->missing(function (Request $request) {
324
+ return Redirect::route('photos.index');
325
+ });
326
+
327
+ // Include soft deleted models
328
+ Route::multilingualResource('photos', 'PhotoController')->withTrashed(['show']);
329
+
330
+ // Apply constraints to specific parameters
331
+ Route::multilingualResource('photos', 'PhotoController')->whereParam('photos', '[0-9]+');
332
+ ```
333
+
334
+ #### Using chainable methods
335
+
336
+ Like regular multilingual routes, you can chain all the same methods:
337
+
338
+ ``` php
339
+ // Set custom name
340
+ Route::multilingualResource('photos', 'PhotoController')->name('gallery');
341
+
342
+ // Add middleware
343
+ Route::multilingualResource('photos', 'PhotoController')->middleware(['auth', 'verified']);
344
+
345
+ // Add route constraints
346
+ Route::multilingualResource('photos', 'PhotoController')->where('photos', '[0-9]+');
347
+
348
+ // Set default parameters
349
+ Route::multilingualResource('photos', 'PhotoController')->defaults(['format' => 'json']);
350
+
351
+ // Exclude specific locales
352
+ Route::multilingualResource('photos', 'PhotoController')->exceptLocales(['en']);
353
+
354
+ // Set different names per locale
355
+ Route::multilingualResource('photos', 'PhotoController')->names([
356
+ 'en' => 'pictures',
357
+ 'fr' => 'images'
358
+ ]);
359
+
360
+ // Chain multiple methods together
361
+ Route::multilingualResource('photos', 'PhotoController')
362
+ ->only(['index', 'show', 'edit'])
363
+ ->exceptLocales(['en'])
364
+ ->name('gallery')
365
+ ->middleware('auth')
366
+ ->parameters(['photos' => 'photo_id'])
367
+ ->withTrashed(['show'])
368
+ ->missing(function (Request $request) {
369
+ return redirect()->route('gallery.index');
370
+ });
371
+ ```
372
+
219
373
## Upgrading from 1.x to 2.x
220
374
221
375
To update from 1.x to 2.x, you simply have to rename the namespace occurrences in your application from ` LaravelMultilingualRoutes ` to ` MultilingualRoutes ` . The most common use case would be the ` DetectRequestLocale ` middleware.
0 commit comments