public function renderDefault(array $param = array(), $status = 200) { $data = array(); foreach (LangQuery::create()->find() as $lang) { $data[LangUrlForm::LANG_PREFIX . $lang->getId()] = $lang->getUrl(); } $langUrlForm = $this->createForm(AdminForm::LANG_URL, 'form', $data); $this->getParserContext()->addForm($langUrlForm); return $this->render('languages', array_merge($param, array('lang_without_translation' => ConfigQuery::getDefaultLangWhenNoTranslationAvailable(), 'one_domain_per_lang' => ConfigQuery::isMultiDomainActivated())), $status); }
/** * Save the previous URL in session which is based on the referer header or the request, or * the _previous_url request attribute, if defined. * * If the value of _previous_url is "dont-save", the current referrer is not saved. * * @param \Symfony\Component\HttpKernel\Event\PostResponseEvent $event */ public function registerPreviousUrl(PostResponseEvent $event) { $request = $event->getRequest(); if (!$request->isXmlHttpRequest() && $event->getResponse()->isSuccessful()) { $referrer = $request->attributes->get('_previous_url', null); if (null !== $referrer) { // A previous URL (or the keyword 'dont-save') has been specified. if ('dont-save' == $referrer) { // We should not save the current URL as the previous URL $referrer = null; } } else { // The current URL will become the previous URL $referrer = $request->getUri(); } // Set previous URL, if defined if (null !== $referrer) { $session = $request->getSession(); if (ConfigQuery::isMultiDomainActivated()) { $components = parse_url($referrer); $lang = LangQuery::create()->filterByUrl(sprintf("%s://%s", $components["scheme"], $components["host"]), ModelCriteria::LIKE)->findOne(); if (null !== $lang) { $session->setReturnToUrl($referrer); } } else { if (false !== strpos($referrer, $request->getSchemeAndHttpHost())) { $session->setReturnToUrl($referrer); } } } } }
protected function manageLocale(RewritingResolver $rewrittenUrlData, TheliaRequest $request) { $lang = LangQuery::create()->findOneByLocale($rewrittenUrlData->locale); $langSession = $request->getSession()->getLang(); if ($lang != $langSession) { if (ConfigQuery::isMultiDomainActivated()) { $this->redirect(sprintf("%s/%s", $lang->getUrl(), $rewrittenUrlData->rewrittenUrl)); } else { $request->getSession()->setLang($lang); } } }
/** * A simple helper to get the URL based on the language. * * @param string $locale the locale, or null to get the current one * @return null|string the URL for the current language, or null if the "One domain for each lang" feature is disabled. */ protected function getUrlLanguage($locale = null) { // Check if the functionality is activated if (!ConfigQuery::isMultiDomainActivated()) { return null; } // If we don't have a locale value, use the locale value in the session if (!$locale) { $locale = $this->getCurrentEditionLocale(); } return LangQuery::create()->findOneByLocale($locale)->getUrl(); }
/** * @param Request $request * @return null|\Thelia\Model\Lang */ protected function detectLang(Request $request) { $lang = null; //first priority => lang parameter present in request (get or post) if ($request->query->has("lang")) { $lang = LangQuery::create()->findOneByCode($request->query->get("lang")); if (is_null($lang)) { return Lang::getDefaultLanguage(); } //if each lang has its own domain, we redirect the user to the good one. if (ConfigQuery::isMultiDomainActivated()) { //if lang domain is different from actuel domain, redirect to the good one if (rtrim($lang->getUrl(), "/") != $request->getSchemeAndHttpHost()) { // TODO : search if http status 302 is the good one. $redirect = new RedirectResponse($lang->getUrl(), 302); return $redirect; } else { //the user is actually on the good domain, nothing to change return null; } } else { //one domain for all languages, the lang is set into session return $lang; } } //check if lang is not defined. If not we have to search the good one. if (null === $request->getSession()->getLang(false)) { if (ConfigQuery::isMultiDomainActivated()) { //find lang with domain return LangQuery::create()->filterByUrl($request->getSchemeAndHttpHost(), ModelCriteria::LIKE)->findOne(); } //find default lang return Lang::getDefaultLanguage(); } }
/** * @param TheliaRequest $request * @return null|\Thelia\Model\Lang */ protected function detectLang(TheliaRequest $request) { // first priority => lang parameter present in request (get or post) if ($request->query->has("lang")) { // The lang parameter may contains a lang code (fr, en, ru) for Thelia < 2.2, // or a locale (fr_FR, en_US, etc.) for Thelia > 2.2.beta1 $requestedLangCodeOrLocale = $request->query->get("lang"); if (strlen($requestedLangCodeOrLocale) > 2) { $lang = LangQuery::create()->findOneByLocale($requestedLangCodeOrLocale); } else { $lang = LangQuery::create()->findOneByCode($requestedLangCodeOrLocale); } if (is_null($lang)) { return Lang::getDefaultLanguage(); } // if each lang has its own domain, we redirect the user to the proper one. if (ConfigQuery::isMultiDomainActivated()) { $domainUrl = $lang->getUrl(); if (!empty($domainUrl)) { // if lang domain is different from current domain, redirect to the proper one if (rtrim($domainUrl, "/") != $request->getSchemeAndHttpHost()) { // TODO : search if http status 302 is the good one. return new RedirectResponse($domainUrl, 302); } else { //the user is currently on the proper domain, nothing to change return null; } } Tlog::getInstance()->warning("The domain URL for language " . $lang->getTitle() . " (id " . $lang->getId() . ") is not defined."); return Lang::getDefaultLanguage(); } else { // one domain for all languages, the lang has to be set into session return $lang; } } // Next, check if lang is defined in the current session. If not we have to set one. if (null === $request->getSession()->getLang(false)) { if (ConfigQuery::isMultiDomainActivated()) { // find lang with domain return LangQuery::create()->filterByUrl($request->getSchemeAndHttpHost(), ModelCriteria::LIKE)->findOne(); } // At this point, set the lang to the default one. return Lang::getDefaultLanguage(); } return null; }