diff --git a/lib/classes/date.php b/lib/classes/date.php index 139a3951366..28bfb927546 100644 --- a/lib/classes/date.php +++ b/lib/classes/date.php @@ -819,7 +819,17 @@ class core_date { $calendar = IntlGregorianCalendar::createInstance($intltz); $calendar->setGregorianChange(PHP_INT_MIN); - return (new IntlDateFormatter($locale, $date_type, $time_type, $intltz, $calendar, $pattern))->format($timestamp); + // We need to account for invalid locales here in recent PHP versions, and ensure we catch errors and switch + // back to a default value where an invalid locale is provided. + try { + $formatter = new IntlDateFormatter($locale, $date_type, $time_type, $intltz, $calendar, $pattern); + $result = $formatter->format($timestamp); + } catch (Error $e) { + $formatter = new IntlDateFormatter(null, $date_type, $time_type, $intltz, $calendar, $pattern); + $result = $formatter->format($timestamp); + } + + return $result; }; // Same order as https://www.php.net/manual/en/function.strftime.php diff --git a/lib/tests/date_test.php b/lib/tests/date_test.php index cf03bfc2750..7bfe4e4b189 100644 --- a/lib/tests/date_test.php +++ b/lib/tests/date_test.php @@ -787,6 +787,12 @@ final class date_test extends advanced_testcase { "%e %b %Y", " 9 окт. 2024", ], + 'Invalid locale' => [ + 1728487000, + 'xx', + '%B %Y', + 'October 2024', + ], ]; }