2017-06-28 1 views
0

im en utilisant Laravel 5, et j'ai cet itinéraire:Laravel construire le système d'itinéraire multi-lang

Route::group(['prefix' => '{lang}/', 'middleware' => 'SetLanguage'], function($lang){ 
//element Show 
    Route::get('/'.trans('routes.element-container').'/{slugName}', '[email protected]'); 
}); 

Mon middleware est le suivant:

public function handle($request, Closure $next) 
{ 
    if (in_array($request->lang, config('app.all_langs'))){ 
     //exit("SETTING ON ".$request->lang); 
     App::setLocale($request->lang); 
    }else{ 
     //exit("SETTING ON en"); 
     App::setLocale('en'); 
    } 
    return $next($request); 
} 

Si je Décommentez les deux sortie il fonctionne , mais, la fonction "trans" du côté de la route ne fonctionne pas, semble trans seulement dans la langue par défaut. Pourquoi la fonction «trans» est appelée avant le middleware?

je test avec « avant » et « après », mais pas de travail ...

+0

Pourquoi vous obtenez juste pas la langue de la route dans ElementController @ showByName et traduire là au lieu de traduire sur la déclaration de route? – TheFallen

+0

parce que est route multi-lang, ex: http://www.example.com/en/element-container/element-a http://www.example.com/de/Elemente-Behälter/element -a – MeisterC

+0

Je vois votre problème maintenant. La fonction 'trans()' sera toujours appelée avant le middleware, donc une option que je peux penser est de déclarer le même chemin autant de fois que les langues que vous avez ou d'avoir une méthode de contrôleur qui recevra la langue, traduira la route et rediriger pour corriger la route nommée en fonction de cette langue. – TheFallen

Répondre

0

Si je vous ai bien compris, vous pourriez envisager quelque chose comme ceci:

Route::group(['prefix' => '{lang}/', 'middleware' => 'SetLanguage'], function() { 
    foreach (config('app.all_langs') as $language) { 
     $translatedRoute = trans('routes.element-container', [], $language); 
     Route::get("/$translatedRoute/{slugName}", '[email protected]'); 
    } 
}); 

Mais ce enregistrerai également des itinéraires pour par exemple /de/element-container/element-a.

Alternative:

foreach (config('app.all_langs') as $language) { 
    Route::group(['prefix' => $language, 'middleware' => 'SetLanguage'], function() { 
     $translatedRoute = trans('routes.element-container', [], $language); 
     Route::get("/$translatedRoute/{slugName}", '[email protected]'); 
    }); 
} 

Ce enregistrera /en/element-container/element-a et /de/Elemente-Behälter/element-a, mais pas /de/element-container/element-a

+0

Résolu, mais maintenant ne pas passer "lang" variable au contrôleur et je devais l'obtenir manuellement du contrôleur, en utilisant "Request :: segment (1)": mauvaise méthode .. :( Ici mon itinéraire: foreach (config ('app.all_langs') as $ lang) { App :: setLocale ($ lang); Route :: groupe (['préfixe' => $ lang/*, 'middleware' => 'SetLanguage' * /] , function() { $ translatedRoute = trans ('routes.element-directory'); Route :: get ("/".$ translationRoute."/{slugName} ", ['uses' => 'ElementController @ showByName ']); }); } – MeisterC