/**
  * Execute the middleware.
  *
  * @param ExtendedRequest $request
  * @param Response        $response
  * @param callable        $next
  *
  * @return Response
  */
 public function __invoke(ExtendedRequest $request, Response $response, callable $next)
 {
     $router = $this->router;
     $route = $request->getCurrentRoute();
     $locales = $this->locale;
     $locale = $locales->getDefault();
     $lang = $route->getArgument($router->getLanguageIdentifier());
     $lang = ltrim($lang, '/');
     $redirect = false;
     if ($lang) {
         try {
             // Find language in list of available locales and set it as active
             $locale = $locales->findByLanguage($lang);
             $locales->setActive($locale);
             if ($router->isOmitDefaultLanguage() && $locale == $locales->getDefault()) {
                 // Trigger redirect to correct path (as language set in path is default lang and we want to omit it)
                 $redirect = true;
             }
         } catch (Exception $e) {
             // Trigger "notFound" as setActive() throws Exception if $locale is not valid / available
             $next = $this->notFoundHandler;
         }
     } elseif (!$router->isOmitDefaultLanguage()) {
         // Trigger redirect to correct path (as language is not set in path but we don't want to omit default lang)
         $redirect = true;
     }
     // Redirect to route with proper language identifier value set (or omitted)
     if ($redirect) {
         $path = $router->pathFor($route->getName(), $route->getArguments(), $request->getParams(), $locale->getLanguage());
         $uri = $request->getUri()->withPath($path);
         return $response->withRedirect($uri);
     }
     return $next($request, $response);
 }
 /**
  * {@inheritdoc}
  */
 public function register(Container $container)
 {
     /**
      * Add dependency (DI).
      *
      * @param Container $c
      *
      * @return ExtendedRequest
      */
     $container['request'] = function ($c) {
         return ExtendedRequest::createFromEnvironment($c['environment']);
     };
 }