diff --git a/main/inc/lib/internationalization.lib.php b/main/inc/lib/internationalization.lib.php index 2b89b100b6..1a49b55b8d 100755 --- a/main/inc/lib/internationalization.lib.php +++ b/main/inc/lib/internationalization.lib.php @@ -664,8 +664,11 @@ function api_strtotime($time, $timezone = null) { * * @link http://php.net/manual/en/function.strftime.php */ -function api_format_date($time, $format = null, $language = null) -{ +function api_format_date($time, $format = null, $language = null) { + + $system_timezone = date_default_timezone_get(); + date_default_timezone_set(_api_get_timezone()); + if (is_string($time)) { $time = strtotime($time); } @@ -680,72 +683,116 @@ function api_format_date($time, $format = null, $language = null) if (is_int($format)) { switch ($format) { case DATE_FORMAT_ONLY_DAYNAME: - $datetype = IntlDateFormatter::SHORT; - $timetype = IntlDateFormatter::NONE; + $date_format = get_lang('dateFormatOnlyDayName', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::SHORT; + $timetype = IntlDateFormatter::NONE; + } break; case DATE_FORMAT_NUMBER_NO_YEAR: - $datetype = IntlDateFormatter::SHORT; - $timetype = IntlDateFormatter::NONE; - break; - case DATE_FORMAT_NUMBER: - $datetype = IntlDateFormatter::SHORT; - $timetype = IntlDateFormatter::NONE; + $date_format = get_lang('dateFormatShortNumberNoYear', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::SHORT; + $timetype = IntlDateFormatter::NONE; + } break; + case DATE_FORMAT_NUMBER: + $date_format = get_lang('dateFormatShortNumber', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::SHORT; + $timetype = IntlDateFormatter::NONE; + } + break; case TIME_NO_SEC_FORMAT: - $datetype = IntlDateFormatter::NONE; - $timetype = IntlDateFormatter::SHORT; + $date_format = get_lang('timeNoSecFormat', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::NONE; + $timetype = IntlDateFormatter::SHORT; + } break; case DATE_FORMAT_SHORT: - $datetype = IntlDateFormatter::LONG; - $timetype = IntlDateFormatter::NONE; + $date_format = get_lang('dateFormatShort', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::LONG; + $timetype = IntlDateFormatter::NONE; + } break; case DATE_FORMAT_LONG: - $datetype = IntlDateFormatter::FULL; - $timetype = IntlDateFormatter::NONE; + $date_format = get_lang('dateFormatLong', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::FULL; + $timetype = IntlDateFormatter::NONE; + } break; case DATE_TIME_FORMAT_LONG: - $datetype = IntlDateFormatter::FULL; - $timetype = IntlDateFormatter::SHORT; + $date_format = get_lang('dateTimeFormatLong', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::FULL; + $timetype = IntlDateFormatter::SHORT; + } break; case DATE_FORMAT_LONG_NO_DAY: - $datetype = IntlDateFormatter::FULL; - $timetype = IntlDateFormatter::SHORT; + $date_format = get_lang('dateFormatLongNoDay', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::FULL; + $timetype = IntlDateFormatter::SHORT; + } break; - case DATE_TIME_FORMAT_SHORT: - $datetype = IntlDateFormatter::FULL; - $timetype = IntlDateFormatter::SHORT; + case DATE_TIME_FORMAT_SHORT: + $date_format = get_lang('dateTimeFormatShort', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::FULL; + $timetype = IntlDateFormatter::SHORT; + } break; - case DATE_TIME_FORMAT_SHORT_TIME_FIRST: - $datetype = IntlDateFormatter::FULL; - $timetype = IntlDateFormatter::SHORT; + case DATE_TIME_FORMAT_SHORT_TIME_FIRST: + $date_format = get_lang('dateTimeFormatShortTimeFirst', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::FULL; + $timetype = IntlDateFormatter::SHORT; + } break; case DATE_TIME_FORMAT_LONG_24H: - $datetype = IntlDateFormatter::FULL; - $timetype = IntlDateFormatter::SHORT; + $date_format = get_lang('dateTimeFormatLong24H', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::FULL; + $timetype = IntlDateFormatter::SHORT; + } break; default: - $datetype = IntlDateFormatter::FULL; - $timetype = IntlDateFormatter::SHORT; + $date_format = get_lang('dateTimeFormatLong', '', $language); + if (INTL_INSTALLED) { + $datetype = IntlDateFormatter::FULL; + $timetype = IntlDateFormatter::SHORT; + } } + } else { + $date_format = $format; } - // Use ICU - if (is_null($language)) { - $language = api_get_language_isocode(); - } - - $date_formatter = new IntlDateFormatter( - $language, - $datetype, - $timetype, - date_default_timezone_get() - ); - - $formatted_date = api_to_system_encoding( - $date_formatter->format($time), - 'UTF-8' - ); + if (0) { + //if using PHP 5.3 format dates like: $dateFormatShortNumber, can't be used + // + // Use ICU + if (is_null($language)) { + $language = api_get_language_isocode(); + } + $date_formatter = new IntlDateFormatter($language, $datetype, $timetype, date_default_timezone_get()); + //$date_formatter->setPattern($date_format); + $formatted_date = api_to_system_encoding($date_formatter->format($time), 'UTF-8'); + } else { + // 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 )], + $translated['days_short'][(int)strftime('%w', $time)], + $translated['months_long'][(int)strftime('%m', $time) - 1], + $translated['months_short'][(int)strftime('%m', $time) - 1]), + $date_format); + $formatted_date = api_to_system_encoding(strftime($date_format, $time), 'UTF-8'); + } + date_default_timezone_set($system_timezone); return $formatted_date; }