View Single Post
  #3  
Old 07-15-2015, 08:38 AM
 
xgarb xgarb is online now
 

eXpert
  
Join Date: Jul 2004
Location: UK
Posts: 263
 

Default Re: X5 - Setting the language based on user's browser language

I think I have this working. It's just hacks to files in var/ at the moment.

In var/run/classes/XLite/Controller/AControllerAbstract.php
Code:
protected function doActionChangeLanguage() { $code = strval(\XLite\Core\Request::getInstance()->language); if (!empty($code)) { $language = \XLite\Core\Database::getRepo('\XLite\Model\Language')->findOneByCode($code); setcookie('store_language', $code, time()+31536000,"/"); // new line $_COOKIE['store_language'] = $code; // new line if (isset($language) && $language->getEnabled()) { \XLite\Core\Session::getInstance()->setLanguage($language->getCode()); if (\XLite\Core\Auth::getInstance()->isLogged()) { \XLite\Core\Auth::getInstance()->getProfile()->setLanguage($language->getCode()); \XLite\Core\Database::getEM()->flush(); } } } $this->setReturnURL($this->getReferrerURL()); }


In... var/run/classes/XLite/Core/Session.php
New Method:
Code:
/** * Browser language preferences * */ public function browserLang($l=['en'],$u){return $l[array_keys($l,substr(explode(',',$u?:$_SERVER['HTTP_ACCEPT_LANGUAGE'])[0],0,2))[0]]?:$l[0];}

New method:
Code:
/** * language cooookies! * */ public function getLanguageCookie() { $store_language_codes = array('en','es','fr','de','it') ; $cookieLanguageCode = NULL; // -- If cookie is set if ( in_array(strtolower($_COOKIE[store_language]), $store_language_codes) ) { $cookieLanguageCode = strtolower($_COOKIE[store_language]) ; } return $cookieLanguageCode; }

Totally rewritten method...

Code:
/** * Get language * * @return \XLite\Model\Language */ public function getLanguage() { if (!isset($this->language)){ $langCookie = $this->getLanguageCookie(); if (!empty($langCookie)){ $this->language = \XLite\Core\Database::getRepo('XLite\Model\Language') ->findOneByCode($this->getLanguageCookie()); } elseif (empty($langCookie)) { //no cookie set so best guess from browser $bestLanguageOption = $this->browserLang(['en','es','fr','de','it']); $this->language = \XLite\Core\Database::getRepo('XLite\Model\Language') ->findOneByCode($bestLanguageOption); } } return $this->language; }

Probably could be made nicer.
__________________
Core version: 5.5.xx
Reply With Quote