From 7844aa58940ba649f2d6c34cfcb6fadda496cec7 Mon Sep 17 00:00:00 2001 From: Jon Stovell Date: Fri, 16 Feb 2024 12:38:32 -0700 Subject: [PATCH] Adds support for some missing MessageFormat types in our fallback code Signed-off-by: Jon Stovell --- Sources/Localization/MessageFormatter.php | 86 +++++++++++++++++++++-- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/Sources/Localization/MessageFormatter.php b/Sources/Localization/MessageFormatter.php index aee79ae5c1..590715e451 100644 --- a/Sources/Localization/MessageFormatter.php +++ b/Sources/Localization/MessageFormatter.php @@ -17,6 +17,8 @@ use SMF\Config; use SMF\Lang; +use SMF\Time; +use SMF\User; use SMF\Utils; /** @@ -179,10 +181,86 @@ public static function formatMessage(string $message, array $args = []): string break; - // @todo - // case 'date': - // case 'time': - // break; + case 'ordinal': + $final .= self::formatMessage(Lang::$txt['ordinal'], [$args[$arg_name]]); + break; + + case 'date': + if ($args[$arg_name] instanceof \DateTimeInterface) { + $args[$arg_name] = Time::createFromInterface($args[$arg_name]); + } elseif (is_numeric($args[$arg_name])) { + $args[$arg_name] = new Time('@' . $args[$arg_name], User::getTimezone()); + } elseif (is_string($args[$arg_name])) { + $args[$arg_name] = date_create($args[$arg_name]); + + if ($args[$arg_name] === false) { + $args[$arg_name] = new Time(); + } else { + $args[$arg_name] = Time::createFromInterface($args[$arg_name]); + } + } else { + $args[$arg_name] = new Time(); + } + + // Trying to produce the same output as \IntlDateFormatter + // would require a lot of complex code, so we're just going + // for simple fallbacks here. + switch ($rest) { + case 'full': + case 'long': + $fmt = Time::getDateFormat(); + $relative = true; + break; + + case 'short': + $fmt = 'Y-m-d'; + $relative = false; + + case 'medium': + default: + $fmt = Time::getShortDateFormat(); + $relative = true; + break; + } + + $final .= $args[$arg_name]->format($fmt, $relative); + break; + + case 'time': + if ($args[$arg_name] instanceof \DateTimeInterface) { + $args[$arg_name] = Time::createFromInterface($args[$arg_name]); + } elseif (is_numeric($args[$arg_name])) { + $args[$arg_name] = new Time('@' . $args[$arg_name], User::getTimezone()); + } elseif (is_string($args[$arg_name])) { + $args[$arg_name] = date_create($args[$arg_name]); + + if ($args[$arg_name] === false) { + $args[$arg_name] = new Time(); + } else { + $args[$arg_name] = Time::createFromInterface($args[$arg_name]); + } + } else { + $args[$arg_name] = new Time(); + } + + // Trying to produce the same output as \IntlDateFormatter + // would require a lot of complex code, so we're just going + // for simple fallbacks here. + switch ($rest) { + case 'full': + case 'long': + $fmt = Time::getTimeFormat(); + break; + + case 'short': + case 'medium': + default: + $fmt = Time::getShortTimeFormat(); + break; + } + + $final .= $args[$arg_name]->format($fmt); + break; // @todo // case 'duration':