Недавно я узнал про довольно интересный инструмент, встроенный в РНР. Оказывается, в языке нативно поддерживается универсальный формат шаблонов для сообщений, ICU Message Format. В частности, он используется в Symfony Translation Component  и в системе интернационализации фреймворка Yii 2. Однако этот функционал доступен и сам по себе, в чистом РНР. И может использоваться не только для создания многоязычных сайтов, но и в качестве простенького шаблонизатора, например для email-рассылок. Данный функционал является частью стандартного модуля php-intl, то есть доступен "из коробки" и реализуется с помощью класса MessageFormatter. По сути, это такой printf() на стероидах, с добавлением оператора ветвления и некоторых других возможностей. В самом базовом варианте форматтер используется для простой замены плейсхолдеров: Как видно, поддерживаются как нумерованные, так и именованные плейсхолдеры.  Но, разумеется, ради таких простых замен не стоило и затеваться, в этом случае проще использовать обычный sprintf(). ICU message formatter используется из-за развитых возможностей форматирования, и — в частности — с учётом локали: На этом примере видно, что плейсхолдер может содержать от одного до трех аргументов, и в общем виде вызывается, как где argNameOrNumber — это имя или номер плейсхолдера, argType — его тип, и argStyle — дополнительные настройки.  Установка модуля intl не должна вызывать сложностей, это стандартное sudo apt install php-intl, либо раскомментировать extension=intl в php.ini под Windows. Перед началом работы зададим режим выброса исключений, чтобы сразу видеть ошибки, которые неизбежно будут возникать при экспериментах с форматами: Для получения готовых сообщений можно либо сначала создать формат и затем применить его, либо сделать все в одном вызове. Также можно использовать как объектный, так и процедурный интерфейсы. Я буду использовать в статье функцию msgfmt_format_message(), чтобы код примеров был короче и не вызывал горизонтальный скроллинг. Все три параметра этой функции обязательные. Первой указывается локаль, дальше строка с форматом сообщения и последним — массив с данными.  К сожалению, внятной документации по этой библиотеке я не нашел. Приходится собирать по крохам и экспериментировать методом тыка, выясняя, как примеры из официальной документации применить к РНР.  К примеру, список из 10 основных типов я взял в статье по Yii::t(), ссылка на которую дана выше. Первые 4 из них требуют обязательного наличия всех трех параметров, а остальные позволяют обойтись двумя. Дополнительные настройки, насколько я понял, делятся на два типа: обычные и начинающиеся с двойного двоеточия, которые называются скелетонами. Обычных настроек  всегда немного, например для date и time поддерживаются четыре:  short, medium, long, full, а для number — три: integer, currency, percent. Но вот скелетонов может быть сколько угодно, причем они могут быть составными, как в последнем примере (group-off отключает разбивку по тысячам): К слову, отдельные числа можно форматировать и с помощью другого класса этого же модуля, NumberFormatter: Интересным типом, относящимся к форматированию чисел,  является spellout, который выводит число прописью:  Но самой, пожалуй, интересной возможностью форматтера является встроенный оператор ветвления (аналогичный конструкции switch), который представлен в нескольких вариантах: plural , для образования множественного числа select, обычно используется для склонения по родам selectordinal для перечислений (поддержка русского языка ограничена) В шаблонах игнорируются пробельные символы, и благодаря этому их можно форматировать для удобства восприятия сложных конструкций: выведет Мария Ивановна Заподдубная будет счастлива видеть вас на дне рождения, которое состоится 1 мая 2023 г. в 18:00 в кафе "Голубка" по адресу улица Садовая, дом 2. выведет  Также поддерживаются вложенные конструкции, например в каждую ветку select можно добавить свой plural, но если честно, то я не смог придумать жизненный пример, и поэтому просто скопирую из документации:  Сделано довольно занятно, одинарными кавычками. Любой текст, заключенный в них, интерпретируется, как есть. Чтобы экранировать саму кавычку, её надо удвоить: Часто попадаются невнятные сообщения об ошибках. "Creating message formatter failed" и думай сам, что там не так. Но, справедливости ради, некоторые ошибки наоборот, вполне информативные, например "pattern syntax error (parse error at offset 21". Отсутствие структурированной документации и примеров использования.  Ну и необходимость подключать расширение PHP, если оно ещё не подключено. Как видно из приведенных выше примеров, данный механизм позволяет легко решать стандартные задачи, связанные со склонениями и перечислениями в русском (и других языках), а также форматировать текст с учётом локали, причем без подключения дополнительных библиотек. Некоторым минусом является отсутствие примеров конкретно для РНР, но я надеюсь что данная публикация немного восполнит этот пробел.   Если у вас есть опыт использования данной библиотеки, то прошу поделиться им в комментариях. В частности, очень хочется научиться выводить римские цифры не отдельным классом, а прямо через MessageFormatter. Официальная документация ICU Документация модуля intl  Уже упоминавшееся руководство по Yii::t Неплохой туториал по базовым форматам Ещё один И ещё