PHP 8.5: Intl: новый класс IntlListFormatter

Новый класс IntlListFormatter в PHP 8.5 упрощает форматирование списков на разных языках. Синтаксис, примеры и таблицы локализаций внутри.

Расширение Intl в PHP 8.5 добавляет новый класс IntlListFormatter. Он обеспечивает форматирование списков с учётом локализации в удобные для чтения списки и-списки, или-списки или единицы.

Новый класс IntlListFormatter следует тем же шаблонам, что и другие классы из расширения Intl; он создаётся с помощью валидной строки локали и использует данные ICU для фактического форматирования.

$formatter = new IntlListFormatter('en-US');
$formatter->format(['Zurich', 'Berlin', 'Amsterdam']);
// Zurich, Berlin, and Amsterdam
$formatter = new IntlListFormatter('nl-NL');
echo $formatter->format(['Zurich', 'Berlin', 'Amsterdam']);
// Zurich, Berlin en Amsterdam
$formatter = new IntlListFormatter('id-ID');
echo $formatter->format(['Zurich', 'Berlin', 'Amsterdam']);
// Zurich, Berlin, dan Amsterdam
$formatter = new IntlListFormatter('ru-RU');
echo $formatter->format(['Zurich', 'Berlin', 'Amsterdam']);
// Zurich, Berlin и Amsterdam

Синопсис класса IntlListFormatter

final class IntlListFormatter {

public const int TYPE_AND = 0;
public const int TYPE_OR = 1;
public const int TYPE_UNITS = 2;

public const int WIDTH_WIDE = 0;
public const int WIDTH_SHORT = 1;
public const int WIDTH_NARROW = 2;

public function __construct(
string $locale,
int $type = IntlListFormatter::TYPE_AND,
int $width = IntlListFormatter::WIDTH_WIDE
) {}

public function format(array $strings): string|false {}

public function getErrorCode(): int {}
public function getErrorMessage(): string {}

}

Константы IntlListFormatter::TYPE_

При создании объекта IntlListFormatter конструктор принимает параметр $type. По умолчанию он равен IntlListFormatter::TYPE_AND. Он может быть:

Константы IntlListFormatter::WIDTH_

Третьим параметром конструктора IntlListFormatter является $width, принимающий одно из значений константы IntlListFormatter::WIDTH_. Значение по умолчанию — IntlListFormatter::WIDTH_WIDE.

Этот параметр контролирует, насколько узким или широким будет список. Возможно, исходный список потребуется скорректировать, чтобы он соответствовал этому параметру.

Не все языковые настройки имеют отдельные короткие или узкие формы. Как видно из примера de-DE ниже, все ширины могут давать одинаковые результаты, если языковая настройка не различает их.

Примеры использования

Форматирование списков в en-US

en-USTYPE_ANDTYPE_ORTYPE_UNITS
WIDTH_WIDEA, B, and CA, B, or CA, B, C
WIDTH_SHORTA, B, & CA, B, or CA, B, C
WIDTH_NARROWA, B, CA, B, or CA B C

Форматирование списков в ru-RU

ru-RUTYPE_ANDTYPE_ORTYPE_UNITS
WIDTH_WIDEА, Б и ВА, Б или ВА Б В
WIDTH_SHORTА, Б и ВА, Б или ВА Б В
WIDTH_NARROWА, Б, ВА, Б или ВА Б В

Форматирование списков в jp-JP

jp-JPTYPE_ANDTYPE_ORTYPE_UNITS
WIDTH_WIDE水、火、木水、火、または木水 火 木
WIDTH_SHORT水、火、木水、火、または木水 火 木
WIDTH_NARROW水、火、木水、火、または木水火木

Форматирование списков в de-DE

de-DETYPE_ANDTYPE_ORTYPE_UNITS
WIDTH_WIDEA, B und CA, B oder CA, B und C
WIDTH_SHORTA, B und CA, B oder CA, B und C
WIDTH_NARROWA, B und CA, B oder CA, B und C

Обработка ошибок

Если вызов format был успешным, метод getErrorCode возвращает int(0), а метод getErrorMessage возвращает "U_ZERO_ERROR".

Если метод IntlListFormatter::format возвращает false, это указывает на ошибку при форматировании. В этом случае методы getErrorCode и getErrorMessage могут предоставить дополнительную информацию.

Влияние на обратную совместимость

Класс PHP IntlListFormatter использует icu::ListFormatter из библиотеки ICU, добавленный в ICU 50.

Начиная с PHP 8.5, расширение Intl требует ICU 57.1 или более поздней версии, поэтому класс IntlListFormatter будет доступен во всех сборках расширения Intl.

Перечислив правила форматирования для различных локалей из CLDR, теоретически можно реализовать полифилл класса IntlListFormatter с помощью пользовательского PHP. Однако для этого потребуется извлечь и сохранить соответствующие данные CLDR для большинства, если не всех, локалей.

Комментарии


Дополнительные материалы

Предыдущая Статья

PHP 8.5: новая Curl-функция curl_multi_get_handles — как она работает