public function handleRequest(SS_HTTPRequest $request, DataModel $model = null) { self::$is_at_root = true; $this->setDataModel($model); $this->pushCurrent(); $this->init(); if ($language = $request->param('Language')) { if (Config::inst()->get('MultilingualRootURLController', 'UseLocaleURL')) { if (Config::inst()->get('MultilingualRootURLController', 'UseDashLocale')) { //Language is missing a dash 404 if (strpos($language, '-') === false) { //Locale not found 404 if ($response = ErrorPage::response_for(404)) { return $response; } else { $this->httpError(404, 'The requested page could not be found.'); } return $this->response; } $locale = explode('-', $language); $locale[1] = strtoupper($locale[1]); //Make sure that the language is all lowercase if ($language == implode('-', $locale)) { //Locale not found 404 if ($response = ErrorPage::response_for(404)) { return $response; } else { $this->httpError(404, 'The requested page could not be found.'); } return $this->response; } $locale = implode('_', $locale); } else { $locale = $language; } } else { if (strpos($request->param('Language'), '_') !== false) { //Locale not found 404 if ($response = ErrorPage::response_for(404)) { return $response; } else { $this->httpError(404, 'The requested page could not be found.'); } return $this->response; } else { $locale = i18n::get_locale_from_lang($language); } } if (in_array($locale, Translatable::get_allowed_locales())) { Cookie::set('language', $language); Translatable::set_current_locale($locale); i18n::set_locale($locale); if (!DB::isActive() || !ClassInfo::hasTable('SiteTree')) { $this->response = new SS_HTTPResponse(); $this->response->redirect(Director::absoluteBaseURL() . 'dev/build?returnURL=' . (isset($_GET['url']) ? urlencode($_GET['url']) : null)); return $this->response; } $request->setUrl($language . '/' . self::get_homepage_link() . '/'); $request->match('$Language/$URLSegment//$Action', true); $controller = new MultilingualModelAsController(); $result = $controller->handleRequest($request, $model); $this->popCurrent(); return $result; } else { //URL Param Locale is not allowed so redirect to default $this->redirect(Controller::join_links(Director::baseURL(), Config::inst()->get('MultilingualRootURLController', 'UseLocaleURL') ? Translatable::default_locale() : Translatable::default_lang()) . '/', 301); $this->popCurrent(); return $this->response; } } //No Locale Param so detect browser language and redirect if ($locale = self::detect_browser_locale()) { if (Config::inst()->get('MultilingualRootURLController', 'UseLocaleURL')) { if (Config::inst()->get('MultilingualRootURLController', 'UseDashLocale')) { $language = str_replace('_', '-', strtolower($locale)); } else { $language = $locale; } } else { $language = i18n::get_lang_from_locale($locale); } Cookie::set('language', $language); $this->redirect(Controller::join_links(Director::baseURL(), $language) . '/', 301); $this->popCurrent(); return $this->response; } if (Config::inst()->get('MultilingualRootURLController', 'UseLocaleURL')) { if (Config::inst()->get('MultilingualRootURLController', 'UseDashLocale')) { $language = str_replace('_', '-', strtolower(Translatable::default_locale())); } else { $language = Translatable::default_locale(); } } else { $language = Translatable::default_lang(); } $this->redirect(Controller::join_links(Director::baseURL(), $language . '/'), 301); $this->popCurrent(); return $this->response; }