Мультиязычность API

Добавление мультиязычности к API. Перевод сообщений валидации и доменных ошибок. Автораспознавание заголовка Accept-Language.

  • 00:00:40 - Подходы к мультиязычности
  • 00:02:52 - Тест на перевод ошибок валидации
  • 00:03:58 - Переводы для валидатора
  • 00:04:57 - Компонент Translation
  • 00:06:56 - Подключение переводчика к валидатору
  • 00:12:08 - Автоматическое переключение языков
  • 00:12:47 - Посредник TranslatorLocale
  • 00:17:25 - Парсинг Accept-Language
  • 00:20:54 - Тест TranslatorLocaleTest
  • 00:23:54 - Рефакторинг с разделением ответственностей
  • 00:25:31 - Посредник LocaleNegotiation
  • 00:29:10 - Плюсы разделения ответственностей по разным классам
  • 00:30:58 - Использование готовых посредников
  • 00:34:22 - Перевод доменных исключений
  • 00:40:50 - Публикация посредников на примере DomainExeptionHandler
Скрытый контент
Комментарии (9)
Arunas
2020-04-06 18:43

Да, очень солидно и интересно, спасибо.

Ответить
Arunas
2020-04-07 07:21

здесь, как понимаю, настройка языка и перевод происходит автоматически (от locale), а что если пользователь из России захочет английский текст - напр. ошибки в английском тексте?

Ответить
Дмитрий Елисеев
2020-04-07 16:44

Язык выбирается автоматически по HTTP-заголовку Accept-Language при запросе API. Так что может либо отправить запрос без заголовка, либо со значением en

Ответить
Arunas
2020-04-08 06:27

спасибо

Ответить
Руслан
2020-04-11 09:13

Дмитрий, спасибо за как всегда очень содержательный и интересный урок!

Хотел узнать, будет ли затронута тема использования GraphQL для ReactJS клиента на базе текущего Slim API? Если в данном проекте это оверхед, то может Ваши критерии когда это актуально, преимущества/недостатки (н-р. легче поддерживать версионирование API, снижение количества запросов к API и др.), рекомендации использовать с Apollo-server или без и пр.

Спасибо.

Ответить
Дмитрий Елисеев
2020-04-18 15:04

Да, поговорим про него.

Ответить
Руслан
2020-04-18 15:25

Супер, спасибо!

Ответить
KonTuzh
2020-04-12 00:42

Дмитрий, спасибо за такое подробное объяснение!

При последней проверке кода psalm на файле ValidationExceptionHandler начал ругаться на отсутствие интерфейса Stringable, который указан в Symfony\Component\Validator\ConstraintViolationInterface в качестве возвращаемого типа данных для метода getMessage. Насколько я понял, этот класс появится/появился в PHP8, а у нас 7.4. Так что пришлось дополнительно поставить пакет symfony/polyfill-php80

Возможно, я забегаю вперед и этот момент еще будет разбираться в будущем... у меня вопрос по локализации самого сайта: меню, статьи и другой контент страниц. Каким образом лучше это организовать в базе данных? Разные таблицы? Разделение на разные записи в одной таблице с различием по полю locale?

Ответить
Дмитрий Елисеев
2020-04-18 15:15

Локализовать сайт не будем.

Для фронтенда можно установить react-localize-redux, добавить переводы и вызывать:

<Translate id="menu.about">About</Translate>

А для бэкенда можно переводимый контент вынести в отдельную коллекцию:

class Post {
    private Id $id;
    private string $slug;
    private Collection<Content> $contents;
    private Status $status;
}

class Content
{
    private string $lang;
    private string $title;
    private string $text;
}
Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий