skip to Main Content

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)

2

Answers


  1. 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...
    });
    
    Login or Signup to reply.
  2. 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

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search