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.