diff --git a/main/admin/statistics/statistics.lib.php b/main/admin/statistics/statistics.lib.php index 49bb468889..5e132d0689 100644 --- a/main/admin/statistics/statistics.lib.php +++ b/main/admin/statistics/statistics.lib.php @@ -249,25 +249,39 @@ class Statistics switch($type) { case 'month': + $months = api_get_months_long(); $period = get_lang('PeriodMonth'); - $sql = "SELECT DATE_FORMAT( login_date, '%Y %b' ) AS stat_date , count( login_id ) AS number_of_logins FROM ".$table." GROUP BY stat_date ORDER BY login_date "; + $sql = "SELECT DATE_FORMAT( login_date, '%Y-%m' ) AS stat_date , count( login_id ) AS number_of_logins FROM ".$table." GROUP BY stat_date ORDER BY login_date "; break; case 'hour': $period = get_lang('PeriodHour'); $sql = "SELECT DATE_FORMAT( login_date, '%H' ) AS stat_date , count( login_id ) AS number_of_logins FROM ".$table." GROUP BY stat_date ORDER BY stat_date "; break; case 'day': + $week_days = api_get_week_days_long(); $period = get_lang('PeriodDay'); - $sql = "SELECT DATE_FORMAT( login_date, '%a' ) AS stat_date , count( login_id ) AS number_of_logins FROM ".$table." GROUP BY stat_date ORDER BY DATE_FORMAT( login_date, '%w' ) "; + $sql = "SELECT DATE_FORMAT( login_date, '%w' ) AS stat_date , count( login_id ) AS number_of_logins FROM ".$table." GROUP BY stat_date ORDER BY DATE_FORMAT( login_date, '%w' ) "; break; } $res = api_sql_query($sql,__FILE__,__LINE__); $result = array(); while($obj = Database::fetch_object($res)) { - $result[$obj->stat_date] = $obj->number_of_logins; + $stat_date = $obj->stat_date; + switch($type) + { + case 'month': + $stat_date = explode('-', $stat_date); + $stat_date[1] = $months[$stat_date[1] - 1]; + $stat_date = implode(' ', $stat_date); + break; + case 'day': + $stat_date = $week_days[$stat_date]; + break; + } + $result[$stat_date] = $obj->number_of_logins; } - Statistics::print_stats(get_lang('Logins').' ('.$period.')',$result,true); + Statistics::print_stats(get_lang('Logins').' ('.$period.')', $result, true); } /** * Print the number of recent logins diff --git a/main/inc/global.inc.php b/main/inc/global.inc.php index ddbd0f7813..7b1e5fcc3a 100644 --- a/main/inc/global.inc.php +++ b/main/inc/global.inc.php @@ -60,44 +60,6 @@ EOM; die($error_message_php_version); } -if (!function_exists('mb_strlen')) -{ - $error_message_mbstring = << - - - PHP extension "mbstring" has not been installed! - - - - - - -


- The Dokeos system needs PHP extension mbstring to be installed.
- See http://php.net/manual/en/book.mbstring.php for more information

-
- - - - -EOM; - header('Content-Type: text/html; charset=UTF-8'); - die($error_message_mbstring); -} - // Determine the directory path where this current file lies // This path will be useful to include the other intialisation files diff --git a/main/inc/lib/internationalization.lib.php b/main/inc/lib/internationalization.lib.php new file mode 100644 index 0000000000..b9b1f30463 --- /dev/null +++ b/main/inc/lib/internationalization.lib.php @@ -0,0 +1,305 @@ + array(), true => array()); + } + + // Looking up into the cache for existing translation. + if (isset($cache[$language][$dltt][$variable])) { + // There is a previously saved translation, returning it. + return $cache[$language][$dltt][$variable]; + } + + // There is no saved translation, we have to extract it. + + // If the language files have been reloaded, then the language + // variables should be accessed as local ones. + $seek_local_variables = false; + + // We reload the language variables when the requested language is different to + // the language of the interface or when the server is in testing mode. + if ($language != $language_interface_initial_value || api_get_setting('server_type') == 'test') { + $seek_local_variables = true; + global $language_files; + $langpath = api_get_path(SYS_CODE_PATH).'lang/'; + + if (isset ($language_files)) { + if (!is_array($language_files)) { + @include $langpath.$language.'/'.$language_files.'.inc.php'; + } else { + foreach ($language_files as $index => $language_file) { + @include $langpath.$language.'/'.$language_file.'.inc.php'; + } + } + } + } + + $ot = '[='; //opening tag for missing vars + $ct = '=]'; //closing tag for missing vars + if (api_get_setting('hide_dltt_markup') == 'true') { + $ot = ''; + $ct = ''; + } + + // Translation mode for production servers. + + if (api_get_setting('server_type') != 'test') { + if (!$seek_local_variables) { + $lvv = isset ($GLOBALS['lang'.$variable]) ? $GLOBALS['lang'.$variable] : (isset ($GLOBALS[$variable]) ? $GLOBALS[$variable] : $ot.$variable.$ct); + } else { + @eval('$lvv = $'.$variable.';'); + if (!isset($lvv)) { + @eval('$lvv = $lang'.$variable.';'); + if (!isset($lvv)) { + $lvv = $ot.$variable.$ct; + } + } + } + if (!is_string($lvv)) { + $cache[$language][$dltt][$variable] = $lvv; + return $lvv; + } + $lvv = str_replace("\\'", "'", $lvv); + $lvv = _get_lang_purify($lvv, $language); + $cache[$language][$dltt][$variable] = $lvv; + return $lvv; + } + + // Translation mode for test/development servers. + + if (!is_string($variable)) { + $cache[$language][$dltt][$variable] = $ot.'get_lang(?)'.$ct; + return $cache[$language][$dltt][$variable]; + } + @ eval ('$langvar = $'.$variable.';'); // Note (RH): $$var doesn't work with arrays, see PHP doc + if (isset ($langvar) && is_string($langvar) && strlen($langvar) > 0) { + $langvar = str_replace("\\'", "'", $langvar); + $langvar = _get_lang_purify($langvar, $language); + $cache[$language][$dltt][$variable] = $langvar; + return $langvar; + } + @ eval ('$langvar = $lang'.$variable.';'); + if (isset ($langvar) && is_string($langvar) && strlen($langvar) > 0) { + $langvar = str_replace("\\'", "'", $langvar); + $langvar = _get_lang_purify($langvar, $language); + $cache[$language][$dltt][$variable] = $langvar; + return $langvar; + } + if (!$dltt) { + $cache[$language][$dltt][$variable] = $ot.$variable.$ct; + return $cache[$language][$dltt][$variable]; + } + if (!is_array($language_files)) { + $language_file = $language_files; + } else { + $language_file = implode('.inc.php', $language_files); + } + $cache[$language][$dltt][$variable] = + $ot.$variable.$ct."#"; + return $cache[$language][$dltt][$variable]; +} + +/** + * Gets the current interface language. + * @param bool $purified (optional) When it is true, a purified (refined) language value will be returned, for example 'french' instead of 'french_unicode'. + * @return string The current language of the interface. + */ +function api_get_interface_language($purified = false) { + global $language_interface; + if (empty($language_interface)) { + return 'english'; + } + if ($purified) { + return api_refine_language_id($language_interface); + } + return $language_interface; +} + + +/** + * ---------------------------------------------------------------------------- + * Date and time formats + * ---------------------------------------------------------------------------- + */ + +/** + * Returns formated date/time format correspondent to a given language. + * @author Patrick Cool , Ghent University + * @author Christophe Gesche + * originally inspired from from PhpMyAdmin + * @author Ivan Tcholakov, 2009, code refactoring, adding support for predefined date/time formats. + * @param string/int $date_format The date pattern. See the php-manual about the function strftime(). + * Note: For $date_format the following integer constants may be used for using predefined date/time + * formats in the Dokeos system: TIME_NO_SEC_FORMAT, DATE_FORMAT_SHORT, DATE_FORMAT_LONG, DATE_TIME_FORMAT_LONG. + * @param int $time_stamp (optional) Time as an integer value. The default value -1 means now, the function time() is called internally. + * @param string $language (optional) Language indentificator. If it is omited, the current interface language is assumed. + * @return string Returns the formatted date. + * @link http://php.net/manual/en/function.strftime.php + */ +function api_format_date($date_format, $time_stamp = -1, $language = null) { + if ($time_stamp == -1) { + $time_stamp = time(); + } + if (is_int($date_format)) { + switch ($date_format) { + case TIME_NO_SEC_FORMAT: + $date_format = get_lang('timeNoSecFormat', '', $language); + break; + case DATE_FORMAT_SHORT: + $date_format = get_lang('dateFormatShort', '', $language); + break; + case DATE_FORMAT_LONG: + $date_format = get_lang('dateFormatShort', '', $language); + break; + case DATE_TIME_FORMAT_LONG: + $date_format = get_lang('dateTimeFormatLong', '', $language); + break; + default: + $date_format = get_lang('dateTimeFormatLong', '', $language); + } + } + // We replace %a %A %b %B masks of date format with translated strings. + $translated = &_api_get_day_month_names($language); + $date_format = str_replace(array('%A', '%a', '%B', '%b'), + array($translated['days_long'][(int)strftime('%w', $time_stamp)], + $translated['days_short'][(int)strftime('%w', $time_stamp)], + $translated['months_long'][(int)strftime('%m', $time_stamp) - 1], + $translated['months_short'][(int)strftime('%m', $time_stamp) - 1]), + $date_format); + return strftime($date_format, $time_stamp); +} + +/** + * Returns an array of translated week days in short names. + * @param string $language (optional) Language indentificator. If it is omited, the current interface language is assumed. + * @return string Returns an array of week days (short names). + * Example: api_get_week_days_short('english') means array('Sun', 'Mon', ... 'Sat'). + * Note: For all languges returned days are in the English order. + */ +function api_get_week_days_short($language = null) { + $days = &_api_get_day_month_names($language); + return $days['days_short']; +} + +/** + * Returns an array of translated week days. + * @param string $language (optional) Language indentificator. If it is omited, the current interface language is assumed. + * @return string Returns an array of week days. + * Example: api_get_week_days_long('english') means array('Sunday, 'Monday', ... 'Saturday'). + * Note: For all languges returned days are in the English order. + */ +function api_get_week_days_long($language = null) { + $days = &_api_get_day_month_names($language); + return $days['days_long']; +} + +/** + * Returns an array of translated months in short names. + * @param string $language (optional) Language indentificator. If it is omited, the current interface language is assumed. + * @return string Returns an array of months (short names). + * Example: api_get_months_short('english') means array('Jan', 'Feb', ... 'Dec'). + */ +function api_get_months_short($language = null) { + $months = &_api_get_day_month_names($language); + return $months['months_short']; +} + +/** + * Returns an array of translated months. + * @param string $language (optional) Language indentificator. If it is omited, the current interface language is assumed. + * @return string Returns an array of months. + * Example: api_get_months_long('english') means array('January, 'February' ... 'December'). + */ +function api_get_months_long($language = null) { + $months = &_api_get_day_month_names($language); + return $months['months_long']; +} + + +/** + * ---------------------------------------------------------------------------- + * Functions for internal use behind this API. + * ---------------------------------------------------------------------------- + */ + +require_once dirname(__FILE__).'/internationalization_internal.lib.php'; diff --git a/main/inc/lib/internationalization_internal.lib.php b/main/inc/lib/internationalization_internal.lib.php new file mode 100644 index 0000000000..9a936f55ee --- /dev/null +++ b/main/inc/lib/internationalization_internal.lib.php @@ -0,0 +1,79 @@ + array(), true => array()); - } - - // Looking up into the cache for existing translation. - if (isset($cache[$language][$dltt][$variable])) { - // There is a previously saved translation, returning it. - return $cache[$language][$dltt][$variable]; - } - - // There is no saved translation, we have to extract it. - - // If the language files have been reloaded, then the language - // variables should be accessed as local ones. - $seek_local_variables = false; - - // We reload the language variables when the requested language is different to - // the language of the interface or when the server is in testing mode. - if ($language != $language_interface_initial_value || api_get_setting('server_type') == 'test') { - $seek_local_variables = true; - global $language_files; - $langpath = api_get_path(SYS_CODE_PATH).'lang/'; - - if (isset ($language_files)) { - if (!is_array($language_files)) { - @include $langpath.$language.'/'.$language_files.'.inc.php'; - } else { - foreach ($language_files as $index => $language_file) { - @include $langpath.$language.'/'.$language_file.'.inc.php'; - } - } - } - } - - $ot = '[='; //opening tag for missing vars - $ct = '=]'; //closing tag for missing vars - if (api_get_setting('hide_dltt_markup') == 'true') { - $ot = ''; - $ct = ''; - } - - // Translation mode for production servers. - - if (api_get_setting('server_type') != 'test') { - if (!$seek_local_variables) { - $lvv = isset ($GLOBALS['lang'.$variable]) ? $GLOBALS['lang'.$variable] : (isset ($GLOBALS[$variable]) ? $GLOBALS[$variable] : $ot.$variable.$ct); - } else { - @eval('$lvv = $'.$variable.';'); - if (!isset($lvv)) { - @eval('$lvv = $lang'.$variable.';'); - if (!isset($lvv)) { - $lvv = $ot.$variable.$ct; - } - } - } - if (!is_string($lvv)) { - $cache[$language][$dltt][$variable] = $lvv; - return $lvv; - } - $lvv = str_replace("\\'", "'", $lvv); - $lvv = get_lang_to_system_encoding($lvv, $language); - $cache[$language][$dltt][$variable] = $lvv; - return $lvv; - } - - // Translation mode for test/development servers. - - if (!is_string($variable)) { - $cache[$language][$dltt][$variable] = $ot.'get_lang(?)'.$ct; - return $cache[$language][$dltt][$variable]; - } - @ eval ('$langvar = $'.$variable.';'); // Note (RH): $$var doesn't work with arrays, see PHP doc - if (isset ($langvar) && is_string($langvar) && strlen($langvar) > 0) { - $langvar = str_replace("\\'", "'", $langvar); - $langvar = get_lang_to_system_encoding($langvar, $language); - $cache[$language][$dltt][$variable] = $langvar; - return $langvar; - } - @ eval ('$langvar = $lang'.$variable.';'); - if (isset ($langvar) && is_string($langvar) && strlen($langvar) > 0) { - $langvar = str_replace("\\'", "'", $langvar); - $langvar = get_lang_to_system_encoding($langvar, $language); - $cache[$language][$dltt][$variable] = $langvar; - return $langvar; - } - if (!$dltt) { - $cache[$language][$dltt][$variable] = $ot.$variable.$ct; - return $cache[$language][$dltt][$variable]; - } - if (!is_array($language_files)) { - $language_file = $language_files; - } else { - $language_file = implode('.inc.php',$language_files); - } - $cache[$language][$dltt][$variable] = - $ot.$variable.$ct."#"; - return $cache[$language][$dltt][$variable]; -} - -// Coverting encoding of a translated string to the system's encoding. -// This is needed when the system has been set to use UTF-8 encoding -// with non-UTF-8 language files and vice versa. -// Also htmlentities are converted into normal characters. -// This API function is for internal use. Only get_lang should call it. -function & get_lang_to_system_encoding(& $string, $language) { - $charset = api_get_system_encoding(); - if (api_is_utf8($charset)) { - if (!api_is_valid_utf8($string)) { - $string = api_utf8_encode($string, api_get_non_utf8_encoding($language)); - } - } else { - if (api_is_valid_utf8($string)) { - $string = api_utf8_decode($string, $charset); - } - } - $string = api_html_entity_decode($string, ENT_QUOTES, $charset); - return $string; -} - -/** - * Gets the current interface language - * @param bool $purified When it is true, a purified (refined) language value will be returned, for example 'french' instead of 'french_unicode'. - * @return string The current language of the interface - */ -function api_get_interface_language($purified = false) { - global $language_interface; - if (empty($language_interface)) { - return 'english'; - } - if ($purified) { - return api_refine_language_id($language_interface); - } - return $language_interface; -} - /* ============================================================================== USER PERMISSIONS ============================================================================== */ + /** * Check if current user is a platform administrator * @return boolean True if the user has platform admin rights, diff --git a/main/inc/lib/multibyte_string_functions.lib.php b/main/inc/lib/multibyte_string_functions.lib.php index 7da84efa69..f479244dfc 100644 --- a/main/inc/lib/multibyte_string_functions.lib.php +++ b/main/inc/lib/multibyte_string_functions.lib.php @@ -9,7 +9,7 @@ * October 2008 - initial implementation. * May 2009 - refactoring and minor corrections have been implemented. * August 2009 - PCRE-related functions have been added, - * dependancy on mbstring extension has been lowered. + * dependancy on mbstring extension has been removed. * @package dokeos.library * ============================================================================== */ @@ -1149,7 +1149,7 @@ function api_strtolower($string, $encoding = null) { $matched = true; } else { $matched = false; - $properties = _api_utf8_get_letter_case_properties($codepoint, 'upper'); + $properties = &_api_utf8_get_letter_case_properties($codepoint, 'upper'); if (!empty($properties)) { foreach ($properties as $key => $value) { if ($properties[$key]['upper'] == $codepoint && count($properties[$key]['lower'][0]) === 1) { @@ -1215,7 +1215,7 @@ function api_strtoupper($string, $encoding = null) { $matched = true; } else { $matched = false; - $properties = _api_utf8_get_letter_case_properties($codepoint); + $properties = &_api_utf8_get_letter_case_properties($codepoint); $property_count = count($properties); if (!empty($properties)) { foreach ($properties as $key => $value) { diff --git a/main/inc/lib/multibyte_string_functions_internal.lib.php b/main/inc/lib/multibyte_string_functions_internal.lib.php index 29186e42f0..c3b5aa0846 100644 --- a/main/inc/lib/multibyte_string_functions_internal.lib.php +++ b/main/inc/lib/multibyte_string_functions_internal.lib.php @@ -61,13 +61,13 @@ function _api_convert_encoding($string, $to_encoding, $from_encoding) { return $string; } if (!isset($character_map[$to])) { - $character_map[$to] = _api_parse_character_map($to); + $character_map[$to] = &_api_parse_character_map($to); } if ($character_map[$to] === false) { return $string; } if (!isset($character_map[$from])) { - $character_map[$from] = _api_parse_character_map($from); + $character_map[$from] = &_api_parse_character_map($from); } if ($character_map[$from] === false) { return $string; @@ -372,7 +372,7 @@ function _api_html_entity_from_unicode($codepoint) { * @param string $type (optional) The type of initial case to be altered: 'lower' (default) or 'upper'. * @return array Returns an array with properties used to change case of the character. */ -function _api_utf8_get_letter_case_properties($codepoint, $type = 'lower') { +function &_api_utf8_get_letter_case_properties($codepoint, $type = 'lower') { static $config = array(); static $range = array(); if (!isset($range[$codepoint])) { diff --git a/main/inc/lib/text.lib.php b/main/inc/lib/text.lib.php index 9009de4bff..121f68aa7a 100644 --- a/main/inc/lib/text.lib.php +++ b/main/inc/lib/text.lib.php @@ -61,8 +61,9 @@ function make_clickable($string) * @return the formatted date */ -function format_locale_date($date_format, $time_stamp = -1) +function format_locale_date($date_format, $time_stamp = -1, $language = null) { + /* static $initialized = false; static $days_short, $days_long, $months_short, $months_long; @@ -91,7 +92,8 @@ function format_locale_date($date_format, $time_stamp = -1) $date = ereg_replace('%[b]', $months_short[(int)strftime('%m', $time_stamp)-1], $date); return strftime($date, $time_stamp); - + */ + return api_format_date($date_format, $time_stamp, $language); } // end function format_locale_date diff --git a/main/install/index.php b/main/install/index.php index 49501bf829..011df13276 100755 --- a/main/install/index.php +++ b/main/install/index.php @@ -62,46 +62,6 @@ EOM; die($error_message_php_version); } -if (!function_exists('mb_strlen')) { - $error_message_mbstring = << - - - PHP extension "mbstring" has not been installed! - - - - -
- - -


- The Dokeos system needs PHP extension mbstring to be installed.
- See http://php.net/manual/en/book.mbstring.php for more information

-
-
-
- - - - -EOM; - header('Content-Type: text/html; charset=UTF-8'); - die($error_message_mbstring); -} - /* ============================================================================== INIT SECTION diff --git a/main/install/install_functions.inc.php b/main/install/install_functions.inc.php index 30db3e03f9..49a119a6e0 100644 --- a/main/install/install_functions.inc.php +++ b/main/install/install_functions.inc.php @@ -426,8 +426,8 @@ function display_requirements($installType, $badUpdatePath, $updatePath='', $upd '.check_extension('xml', get_lang('Yes'), get_lang('No')).' - Multibyte string '.get_lang('support').' - '.check_extension('mbstring', get_lang('Yes'), get_lang('ExtensionMBStringNotAvailable')).' + Multibyte string '.get_lang('support').' ('.get_lang('Optional').') + '.check_extension('mbstring', get_lang('Yes'), get_lang('ExtensionMBStringNotAvailable'), true).' Iconv '.get_lang('support').' ('.get_lang('Optional').')