Добавление мультиязычности к API. Перевод сообщений валидации и доменных ошибок. Автораспознавание заголовка Accept-Language.
- 00:00:39 Подходы к мультиязычности
- 00:02:53 Тест на перевод ошибок валидации
- 00:03:59 Переводы для валидатора
- 00:04:58 Компонент Translation
- 00:06:44 Подключение переводчика к валидатору
- 00:11:34 Автоматическое переключение языков
- 00:12:14 Посредник TranslatorLocale
- 00:16:53 Парсинг Accept-Language
- 00:20:23 Тест TranslatorLocaleTest
- 00:23:13 Перевод доменных исключений
- 00:27:43 Повторное использование посредников
- 00:29:32 Публикация посредников на примере DomainExeptionHandler
Скрытый контент (код, слайды, ...) для подписчиков.
Открыть →Чтобы не пропускать новые эпизоды подпишитесь на наш канал @deworkerpro в Telegram
Да, очень солидно и интересно, спасибо.
здесь, как понимаю, настройка языка и перевод происходит автоматически (от locale), а что если пользователь из России захочет английский текст - напр. ошибки в английском тексте?
Язык выбирается автоматически по HTTP-заголовку
Accept-Language
при запросе API. Так что может либо отправить запрос без заголовка, либо со значениемen
спасибо
Дмитрий, спасибо за как всегда очень содержательный и интересный урок!
Хотел узнать, будет ли затронута тема использования GraphQL для ReactJS клиента на базе текущего Slim API? Если в данном проекте это оверхед, то может Ваши критерии когда это актуально, преимущества/недостатки (н-р. легче поддерживать версионирование API, снижение количества запросов к API и др.), рекомендации использовать с Apollo-server или без и пр.
Спасибо.
Да, поговорим про него.
Супер, спасибо!
Дмитрий, спасибо за такое подробное объяснение!
При последней проверке кода psalm на файле ValidationExceptionHandler начал ругаться на отсутствие интерфейса Stringable, который указан в Symfony\Component\Validator\ConstraintViolationInterface в качестве возвращаемого типа данных для метода getMessage. Насколько я понял, этот класс появится/появился в PHP8, а у нас 7.4. Так что пришлось дополнительно поставить пакет symfony/polyfill-php80
Возможно, я забегаю вперед и этот момент еще будет разбираться в будущем... у меня вопрос по локализации самого сайта: меню, статьи и другой контент страниц. Каким образом лучше это организовать в базе данных? Разные таблицы? Разделение на разные записи в одной таблице с различием по полю locale?
Локализовать сайт не будем.
Для фронтенда можно установить
react-localize-redux
, добавить переводы и вызывать:А для бэкенда можно переводимый контент вынести в отдельную коллекцию:
Не проходит psalm (commit Added domain exception translation от 17.03.2020):
Как правильно с ними поступить?
Исправить, как мы сделали это в следующих эпизодах.
Дима, может сталкивались, как можно отключить со стороны приложения автоматическое срабатывание в браузере Google translate (Chrome etc.)? Спасибо большое!
Всегда отключаю вручную через "Никогда не переводить этот сайт". Автоматически не знаю как.
Дмитрий, огромное спасибо за эти серии.
Просмотрел уже 30% из доступных уроков и хочу сказать что вы просто СУПЕР-преподаватель! Объяснения, детали, подача, то как структурирован материал - огромная работа!
Я очень рад что google привел меня на ваш сайт :)
Почему у всех middleware приватные методы статичные? Это оптимизация какая-то?
Это функции, которые не используют текущий объект из
$this
. Поэтому и нет повода их делать динамическими методами, которые привязаны к каждому объекту.Их проще объявить отдельной PHP-функцией снаружи класса или статическим методом внутри класса.
Дмитрий, здравствуйте, в провайдере аутентификации на React вы делаете редирект на форму аутентификации бэкенда через window.location.assign, где нельзя передавать headers, как быть с локализацией?
пока решил через костыль, передавая в строке проксируемого запроса
/api/{ru|en}/authorize
на фронтенде, и там же в nginx подчищая его через rewrite, передавая нужный Accept-LanguageИнтересует как будет Вами реализовано в проекте
Да, либо указывать язык в пути
/ru/authorize
, либо передавать отдельным параметром вроде&lang=ru
, либо оставить как есть, чтобы бэкенд ориентировался по умолчанию на язык браузера.Или войти через: