public function preferredLang($lang = null)
{
/* Check if we have a language set in the session */
if ($GLOBALS['session']->exists('horde', 'language')) {
return basename($GLOBALS['session']->get('horde', 'language'));
}
/* If language pref exists, we should use that. */
if (isset($GLOBALS['prefs']) && ($language = $GLOBALS['prefs']->getValue('language'))) {
return basename($language);
}
/* Check if the user selected a language from the login screen */
if (!empty($lang) && $this->nlsconfig->validLang($lang)) {
return basename($lang);
}
/* Try browser-accepted languages. */
if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
/* The browser supplies a list, so return the first valid one. */
$browser_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
foreach ($browser_langs as $lang) {
/* Strip quality value for language */
if (($pos = strpos($lang, ';')) !== false) {
$lang = substr($lang, 0, $pos);
}
$lang = $this->_mapLang(trim($lang));
if ($this->nlsconfig->validLang($lang)) {
return basename($lang);
}
/* In case there's no full match, save our best guess. Try
* ll_LL, followed by just ll. */
if (!isset($partial_lang)) {
$ll_LL = Horde_String::lower(substr($lang, 0, 2)) . '_' . Horde_String::upper(substr($lang, 0, 2));
if ($this->nlsconfig->validLang($ll_LL)) {
$partial_lang = $ll_LL;
} else {
$ll = $this->_mapLang(substr($lang, 0, 2));
if ($this->nlsconfig->validLang($ll)) {
$partial_lang = $ll;
}
}
}
}
if (isset($partial_lang)) {
return basename($partial_lang);
}
}
/* Use site-wide default, if one is defined */
return $this->nlsconfig->curr_default ? basename($this->nlsconfig->curr_default) : 'en_US';
}