/** * Set current language * * @param string $lang * @return bool Success */ public static function setLocale($lang = null, $setCookie = false) { $locales = SlConfigure::read('I18n.locales'); if (empty($locales)) { $languages = SlConfigure::read1('I18n.languages'); $langs = array_keys($languages); $locales = array(); $catalogs = array(); if (!$langs) { $langs = array('en'); } App::import('Core', 'l10n'); $l10n = new L10n(); foreach ($langs as $lang_) { $catalog = $l10n->catalog($lang_); if ($catalog) { $catalogs[$lang_] = $catalog; $locales[$lang_] = $catalog['locale']; } } $langs = array_keys($locales); SlConfigure::write('I18n.langs', $langs); SlConfigure::write('I18n.catalogs', $catalogs); SlConfigure::write('I18n.locales', $locales); if (empty($lang)) { $lang = SlCookie::read('I18n.lang'); // guess language based on Accept-Language header if (empty($lang)) { $envLangs = explode(',', env('HTTP_ACCEPT_LANGUAGE')); foreach ($envLangs as $envLang) { list($envLang) = explode(';', $envLang); if (isset($locales[$envLang])) { $lang = $envLang; break; } } if (empty($lang)) { $lang = SlConfigure::read('I18n.lang'); } } // convert locale_id to lang_id $lang_ = array_search($lang, $locales); if ($lang_) { $lang = $lang_; } if (empty($lang) || !isset($locales[$lang])) { $lang = $langs[0]; } } } else { $catalogs = SlConfigure::read('I18n.catalogs'); } if ($lang) { // convert locale_id to lang_id $lang_ = array_search($lang, $locales); if ($lang_) { $lang = $lang_; } if (isset($locales[$lang])) { SlConfigure::write('I18n.lang', $lang); SlConfigure::write('I18n.catalog', $catalogs[$lang]); SlConfigure::write('I18n.locale', $locales[$lang]); Configure::write('Config.language', $locales[$lang]); if ($setCookie) { SlCookie::write('I18n.lang', $lang, false, "+1 year"); } SlConfigure::localeChanged(); return true; } } return false; }