Обычно сообщения исключений в PHP не переводятся автоматически, поскольку они предназначены для разработчика и логирования. Однако, если вам нужно показывать пользователю понятные, локализованные сообщения, есть несколько подходов:
-
Выбрасывать исключения с ключами перевода:
Вместо того чтобы задавать сообщение на конкретном языке, используйте идентификаторы (ключи) для сообщений исключений. Например:// Вместо: throw new \Exception('Invalid input provided'); // Используйте: throw new \Exception('exception.invalid_input');
Затем, в ресурсах перевода (например, messages.ru.yaml) определите:
exception.invalid_input: "Неверный ввод данных"
-
Перевод при обработке исключений:
В блоке catch полученное сообщение исключения можно передать в компонент перевода, чтобы получить локализованное сообщение:try { // код, который может выбросить исключение } catch (\Exception $e) { // Предположим, что $translator – это экземпляр TranslatorInterface $localizedMessage = $translator->trans($e->getMessage()); echo $localizedMessage; }
-
Создание собственных классов исключений:
Можно создать наследников стандартных исключений, добавив в них поддержку параметров для перевода. Например, добавив свойства для передачи плейсхолдеров, которые потом можно использовать в вызове переводчика:class MyException extends \Exception { private array $parameters; public function __construct(string $messageKey, array $parameters = [], int $code = 0, \Throwable $previous = null) { parent::__construct($messageKey, $code, $previous); $this->parameters = $parameters; } public function getParameters(): array { return $this->parameters; } } // Использование: throw new MyException('exception.invalid_input', ['%field%' => 'email']);
А затем при обработке:
try { // ... } catch (MyException $e) { $localizedMessage = $translator->trans($e->getMessage(), $e->getParameters()); echo $localizedMessage; }
Таким образом, разделяя техническое сообщение исключения (ключ) и локализованное сообщение для пользователя, вы сохраняете удобство разработки и получаете возможность показать понятный интерфейс для пользователя.