为此我要做的是在会话中设置用户的语言首选项,并将其保存到 cookie 中以进行长期存储。当用户返回时,我的会话类会查找 cookie 并在新会话中设置语言代码。
这是一个使用 Zend_Session 的例子,并且有语言检测,但是保存和检索语言偏好的部分非常简单,你可以适应任何情况。
<?php
class UserSession extends Zend_Session_Namespace
{
public function __construct($namespace = 'user')
{
Zend_Session::start();
parent::__construct($namespace);
$defaultLanguageCode = 'EN-US';
if (empty($this->languageCode) && isset($_COOKIE['userprefs']))
{
//Fail silently if the prefs json is corrupt
try
{
$prefs = Zend_Json::decode($_COOKIE['userprefs']);
$this->languageCode = $prefs['languageCode'];
}
catch (Exception $e)
{
}
}
//Detect language, and set on session if we support it
if (!isset($this->languageCode))
{
$locale = new Zend_Locale();
$lang = $locale->getLanguage();
//Reformat
$lang = strtoupper(str_replace('_', '-', $lang));
if (!is_null($lang) && $lang != '')
{
$languageCode = $defaultLanguageCode;
$conditions = array(
array('active', '=', 1),
array('code', '=', $lang)
);
$languageFac = Busobj_Language::objFactory($conditions);
$language = $languageFac->getFirst();
if ($language instanceof Busobj_Language)
{
$languageCode = $language->getCode();
}
elseif (strpos($lang, '-') !== false)
{
//If we don't get a hit and there is a region in the code, strip back to the lang and try again
$lang = (substr($lang, strpos($lang, '-')));
$conditions = array(
array('active', '=', 1),
array('code', '=', $lang)
);
$languageFac = Busobj_Language::objFactory($conditions);
$language = $languageFac->getFirst();
if ($language instanceof Busobj_Language)
{
$languageCode = $language->getCode();
}
}
$this->setLanguageCode($languageCode);
}
else
{
$this->setLanguageCode($defaultLanguageCode);
}
}
}
public function sendPrefsCookie()
{
$prefs = array(
'languageCode' => $this->languageCode
);
$prefsJson = Zend_Json::encode($prefs);
setcookie('userprefs', $prefsJson, time() + (60 * 60 * 24 * 365), '/', FW_DOMAIN);
}
public function setLanguageCode($languageCode)
{
$this->languageCode = $languageCode;
$this->sendPrefsCookie();
}
public function __sleep()
{
return array('languageCode');
}
public function __wakeup()
{
}
}