. * */ namespace SP; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); /** * Class Language para el manejo del lenguaje utilizado por la aplicación * * @package SP */ class Language { /** * Lenguaje del usuario * * @var string */ public static $userLang = ''; /** * Lenguaje global de la Aplicación * * @var string */ public static $globalLang = ''; /** * Establecer el lenguaje a utilizar * * @param bool $force Forzar la detección del lenguaje para los inicios de sesión */ public static function setLanguage($force = false) { $lang = Session::getLocale(); if (empty($lang) || $force === true) { $Language = new Language(); self::$userLang = $Language->getUserLang(); self::$globalLang = $Language->getGlobalLang(); $lang = self::$userLang ?: self::$globalLang; Session::setLocale($lang); } self::setLocales($lang); } /** * Devuelve el lenguaje del usuario * * @return bool */ private function getUserLang() { return (Session::getUserId() > 0) ? UserPreferences::getPreferences(Session::getUserId())->getLang() : ''; } /** * Establece el lenguaje de la aplicación. * Esta función establece el lenguaje según esté definido en la configuración o en el navegador. */ private function getGlobalLang() { $browserLang = $this->getBrowserLang(); $configLang = Config::getValue('sitelang'); // Establecer a en_US si no existe la traducción o no es español if (!$configLang && !$this->checkLangFile($browserLang) && stripos($browserLang, 'es_') === false ) { $lang = 'en_US'; } else { $lang = $configLang ?: $browserLang; } return $lang; } /** * Devolver el lenguaje que acepta el navegador * * @return mixed */ private function getBrowserLang() { return str_replace('-', '_', substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 5)); } /** * Comprobar si el archivo de lenguaje existe * * @param string $lang El lenguaje a comprobar * @return bool */ private function checkLangFile($lang) { return file_exists(LOCALES_PATH . DIRECTORY_SEPARATOR . $lang); } /** * Establecer las locales de gettext * * @param string $lang El lenguaje a utilizar */ private static function setLocales($lang) { $lang .= '.utf8'; putenv('LANG=' . $lang); setlocale(LC_MESSAGES, $lang); setlocale(LC_ALL, $lang); bindtextdomain('messages', LOCALES_PATH); textdomain('messages'); bind_textdomain_codeset('messages', 'UTF-8'); } /** * Devolver los lenguajes disponibles * * @return array */ public static function getAvailableLanguages() { return array( 'Español' => 'es_ES', 'Català' => 'ca_ES', 'English' => 'en_US', 'Deutsch' => 'de_DE', 'Magyar' => 'hu_HU', 'Français' => 'fr_FR', 'русский' => 'ru_RU', 'Nederlands' => 'nl_NL' ); } }