Перевод exception messages в php

51
публикации

Обычно сообщения исключений в PHP не переводятся автоматически, поскольку они предназначены для разработчика и логирования. Однако, если вам нужно показывать пользователю понятные, локализованные сообщения, есть несколько подходов:

  1. Выбрасывать исключения с ключами перевода:
    Вместо того чтобы задавать сообщение на конкретном языке, используйте идентификаторы (ключи) для сообщений исключений. Например:

    // Вместо:
    throw new \Exception('Invalid input provided');
    
    // Используйте:
    throw new \Exception('exception.invalid_input');
    

    Затем, в ресурсах перевода (например, messages.ru.yaml) определите:

    exception.invalid_input: "Неверный ввод данных"
    
  2. Перевод при обработке исключений:
    В блоке catch полученное сообщение исключения можно передать в компонент перевода, чтобы получить локализованное сообщение:

    try {
        // код, который может выбросить исключение
    } catch (\Exception $e) {
        // Предположим, что $translator – это экземпляр TranslatorInterface
        $localizedMessage = $translator->trans($e->getMessage());
        echo $localizedMessage;
    }
    
  3. Создание собственных классов исключений:
    Можно создать наследников стандартных исключений, добавив в них поддержку параметров для перевода. Например, добавив свойства для передачи плейсхолдеров, которые потом можно использовать в вызове переводчика:

    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;
    }
    

Таким образом, разделяя техническое сообщение исключения (ключ) и локализованное сообщение для пользователя, вы сохраняете удобство разработки и получаете возможность показать понятный интерфейс для пользователя.

Tags
#archive 62 #capsulecms 30 #featurerequest 26 #linux 22 #php 14 #windows 12 #phpstorm 11 #eclipse 8 #font 6 #nginx 5 #bug 5 #oldsite 4 #iosevka 3 #SEO 3 #Цитаты 3 #nano 2 #antipattern 2 #quotes 2 #mvc 2 #symfony 2 #pdf 1 #composer 1 #algorithm 1 #translation 1 #copypaste 1 #sourcetree 1 #mysql 1 #singleton 1 #meld 1 #postgresql 1 #pattern 1 #debian 1 #ideas 1 #qt 1 #strtok 1 #capsulecmsv1 1 #netbeans 1 #movie 1 #puntoswitcher 1 #mariadb 1 #foobar 1 #git 1 #apache 1 #ssh 1 #pidgin 1 #curl 1 #datetimepicker 1 #https 1 #rsync 1 #bootstrap 1 #cmd 1 #iconv 1 #cms 1 #skype 1