default_locale = $default_locale; $this->session = $session; $this->translator = $translator; $this->enforce_index_php = $enforce_index_php; } /** * This function is called whenever a route was not matching the localized routes. * The purpose is to redirect the user to the localized version of the page. * * @return \Symfony\Component\HttpFoundation\RedirectResponse */ public function addLocalePart(Request $request) { //By default we use the global default locale $locale = $this->default_locale; //Check if a user has set a preferred language setting: $user = $this->getUser(); if (($user instanceof User) && ! empty($user->getLanguage())) { $locale = $user->getLanguage(); } //$new_url = str_replace($request->getPathInfo(), '/' . $locale . $request->getPathInfo(), $request->getUri()); $new_url = $request->getUriForPath('/'.$locale.$request->getPathInfo()); //If either mod_rewrite is not enabled or the index.php version is enforced, add index.php to the string if (($this->enforce_index_php || ! $this->checkIfModRewriteAvailable()) && false === strpos($new_url, 'index.php')) { //Like Request::getUriForPath only with index.php $new_url = $request->getSchemeAndHttpHost().$request->getBaseUrl().'/index.php/'.$locale.$request->getPathInfo(); } return $this->redirect($new_url); } /** * Check if mod_rewrite is available (URL rewriting is possible). * If this is true, we can redirect to /en, otherwise we have to redirect to index.php/en. * When the PHP is not used via Apache SAPI, we just assume that URL rewriting is available. * * @return bool */ public function checkIfModRewriteAvailable() { if (! \function_exists('apache_get_modules')) { //If we can not check for apache modules, we just hope for the best and assume url rewriting is available //If you want to enforce index.php versions of the url, you can override this via ENV vars. return true; } //Check if the mod_rewrite module is loaded return \in_array('mod_rewrite', apache_get_modules(), false); } }