Работа с emoji

Дата обновления перевода 2025-08-25

Работа с emoji

7.1

Компонент emoji был представлен в Symfony 7.1.

Symfony предоставляет несколько утилит для работы с символами и последовательностями эмодзи из набора данных Unicode CLDR. Они доступны через компонент Emoji, который вы должны предварительно установить в вашем приложении:

1
$ composer require symfony/emoji

Note

Если вы устанавливаете этот компонент вне приложения Symfony, вам нужно подключить файл vendor/autoload.php в вашем коде для включения механизма автозагрузки классов, предоставляемых Composer. Детальнее читайте в этой статье.

Данные, необходимые для хранения транслитерации всех эмодзи ( 5,000) на всех языках, занимают значительный объем дискового пространства.

Если вам нужно сэкономить место на диске (например, из-за того, что вы разворачиваете систему на каком-то сервисе с жесткими ограничениями по размеру), выполните эту команду
(например, как автоматический скрипт после composer install), чтобы сжать
внутренние файлы данных эмодзи Symfony с помощью расширения PHP zlib:

1
2
# настроить путь к бинарности 'compress', основываясь на установке вашего приложения
$ php ./vendor/symfony/emoji/Resources/bin/compress

Транслитерация эмодзи

Класс EmojiTransliterator предлагает способ перевода эмодзи в их текстовое представление
на всех языках на основе набора данных Unicode CLDR:

1
2
3
4
5
6
7
8
9
10
11
use Symfony\Component\Emoji\EmojiTransliterator;

// Описать эмодзи на английском
$transliterator = EmojiTransliterator::create('en');
$transliterator->transliterate('Menus with 🍕 or 🍝');
// => 'Menus with pizza or spaghetti'

// Описать эмодзи на украинском
$transliterator = EmojiTransliterator::create('uk');
$transliterator->transliterate('Menus with 🍕 or 🍝');
// => 'Menus with піца or спагеті'

Tip

При использовании слаггера из компонента String,
вы можете комбинировать его с EmojiTransliterator для
слаггификации эмодзи .

Транслитерация коротких текстовых кодов эмодзи

Такие сервисы, как GitHub и Slack, позволяют включать эмодзи в ваши сообщения с помощью
коротких текстовых кодов (например, вы можете добавить код :+1: для отображения эмодзи 👍).

Symfony также предоставляет возможность транслитерировать эмодзи в короткие коды и наоборот.
Короткие коды несколько отличаются для каждого сервиса, поэтому вы должны передать название сервиса как аргумент при создании транслитератора.

Транслитерация коротких кодов эмодзи GitHub

Конвертируйте эмодзи в короткие коды GitHub с помощью локали emoji-github:

1
2
3
$transliterator = EmojiTransliterator::create('emoji-github');
$transliterator->transliterate('Teenage 🐢 really love 🍕');
// => 'Teenage :turtle: really love :pizza:'

Конвертируйте короткие коды GitHub в эмодзи с помощью локали github-emoji:

1
2
3
$transliterator = EmojiTransliterator::create('github-emoji');
$transliterator->transliterate('Teenage :turtle: really love :pizza:');
// => 'Teenage 🐢 really love 🍕'

Транслитерация коротких кодов эмодзи Gitlab

Конвертируйте эмодзи в короткие коды Gitlab с помощью локали emoji-gitlab:

1
2
3
$transliterator = EmojiTransliterator::create('emoji-gitlab');
$transliterator->transliterate('Breakfast with 🥝 or 🥛');
// => 'Breakfast with :kiwi: or :milk:'

Конвертируйте короткие коды Gitlab в эмодзи с помощью локали gitlab-emoji:

1
2
3
$transliterator = EmojiTransliterator::create('gitlab-emoji');
$transliterator->transliterate('Breakfast with :kiwi: or :milk:');
// => 'Breakfast with 🥝 or 🥛'

Транслитерация коротких кодов эмодзи Slack

Конвертируйте эмодзи в короткие коды Slack с помощью локали emoji-slack:

1
2
3
$transliterator = EmojiTransliterator::create('emoji-slack');
$transliterator->transliterate('Menus with 🥗 or 🧆');
// => 'Menus with :green_salad: or :falafel:'

Конвертируйте короткие коды Slack в эмодзи с помощью локали slack-emoji:

1
2
3
$transliterator = EmojiTransliterator::create('slack-emoji');
$transliterator->transliterate('Menus with :green_salad: or :falafel:');
// => 'Menus with 🥗 or 🧆'

Транслитерация универсальных коротких кодов эмодзи

Если вы не знаете, какой сервис был использован для генерации коротких кодов, вы можете воспользоваться локалью text-emoji, которая объединяет все коды со всех сервисов:

1
2
3
4
5
6
7
8
9
10
11
$transliterator = EmojiTransliterator::create('text-emoji');

// короткие коды Github
$transliterator->transliterate('Breakfast with :kiwi-fruit: or :milk-glass:');
// короткие коды Gitlab
$transliterator->transliterate('Breakfast with :kiwi: or :milk:');
// короткие коды Slack
$transliterator->transliterate('Breakfast with :kiwifruit: or :glass-of-milk:');

// все примеры выше приводят к одному результату:
// => 'Breakfast with 🥝 or 🥛'

Вы можете превратить эмодзи в короткие коды с помощью локали emoji-text:

1
2
3
$transliterator = EmojiTransliterator::create('emoji-text');
$transliterator->transliterate('Breakfast with 🥝 or 🥛');
// => 'Breakfast with :kiwifruit: or :milk-glass:

Обратная транслитерация эмодзи

Имея текстовое представление эмодзи, вы можете преобразовать его обратно, чтобы получить, собственно, эмодзи благодаря фильтру emojify:

1
2
3
{{ 'I like :kiwi-fruit:'|emojify }} {# renders: I like 🥝 #}
{{ 'I like :kiwi:'|emojify }}       {# renders: I like 🥝 #}
{{ 'I like :kiwifruit:'|emojify }}  {# renders: I like 🥝 #}

По умолчанию emojify использует текстовый каталог , который объединяет текстовые коды эмодзи всех сервисов. Если вы хотите, вы можете выбрать конкретный каталог для использования:

1
2
3
4
{{ 'I :green-heart: this'|emojify }}                  {# отображает: I 💚 this #}
{{ ':green_salad: is nice'|emojify('slack') }}        {# отображает: 🥗 is nice #}
{{ 'My :turtle: has no name yet'|emojify('github') }} {# отображает: My 🐢 has no name yet #}
{{ ':kiwi: is a great fruit'|emojify('gitlab') }}     {# отображает: 🥝 is a great fruit #}

Удаление эмодзи

С помощью EmojiTransliterator можно также удалить все эмодзи из строки, с помощью специальной локали strip:

1
2
3
4
5
use Symfony\Component\Emoji\EmojiTransliterator;

$transliterator = EmojiTransliterator::create('strip');
$transliterator->transliterate('🎉Hey!🥳 🎁Happy Birthday!🎁');
// => 'Hey! Happy Birthday!'