hamed
hamed

Reputation: 207

Localization in laravel

I designed a site with Laravel. now I want add new language to it.I read laravel document . It was good but I have a problem.suppose I have a page that show detail of products so I have a route like mysite.com/product/id that get product's id and show it.also I have a method in controller like

public function showProduct($id){
  ...
}

If I add new Language , the route will change to this: mysite/en/product/id now I must change my method because now two parameter send my method.something like this :

public function showProduct($lang,$id){
  ...
}

So two problems arise:

  1. I must change all method in my site which is time consuming
  2. I do not need language parameter in methods because I set $locan via middleware pay attention that I do not want remove for example en from my URL (because of SEO)

Upvotes: 1

Views: 853

Answers (2)

Teoman Tıngır
Teoman Tıngır

Reputation: 2866

Open your RouteServiceProvider and say that language parameter actually is not a parameter, it's a global prefix.

protected function mapWebRoutes()
{
    Route::group([
        'middleware' => 'web',
        'namespace' => $this->namespace,
        'prefix' => Request::segment(1) // but also you need a middleware about that for making controls..
    ], function ($router) {
        require base_path('routes/web.php');
    });
}

here is sample language middleware, but it's need to be improve

public function handle($request, Closure $next)
{
    $langSegment = $request->segment(1);
    // no need for admin side right ?
    if ($langSegment === "admin")
        return $next($request);
    // if it's home page, get language but if it's not supported, then fallback locale gonna run
    if (is_null($langSegment)) {
        app()->setLocale($request->getPreferredLanguage((config("app.locales"))));
        return $next($request);
    }
    // if first segment is language parameter then go on
    if (strlen($langSegment) == 2)
        return $next($request);
    else
    // if it's not, then you may want to add locale language parameter or you may want to abort 404    
        return redirect(url(config("app.locale") . "/" . implode($request->segments())));

}

So in your controller, or in your routes. you don't have deal with language parameter

Upvotes: 1

Erubiel
Erubiel

Reputation: 2972

Something like

Route::group(['prefix' => 'en'], function () {
    App::setLocale('en');
    //Same routes pointing to the same methods...
});

Or

Route::group(['prefix' => 'en', 'middleware' => 'yourMiddleware'], function () {
    //Same routes pointing to the same methods...
});

Upvotes: 0

Related Questions