Где в Yii2 файлы ошибок 404 и 403(хочется перевести эти страницы)?

В файле error.php в папке views уже перевёл, часть текста.
<div class="site-error">

    <h1><?= Html::encode($this->title) ?></h1>

    <div class="alert alert-danger">
        <?= nl2br(Html::encode($message)) ?>

Но я хочу перевести ещё и эти записи ->
Forbidden (#403)
You are not allowed to access this page.
Not Found (#404)
  • Вопрос задан
  • 4456 просмотров
Решения вопроса 1
cimonlebedev
@cimonlebedev Автор вопроса
Сам разобрался:
vendor\yiisoft\yii2-gii\Module.php
if (Yii::$app instanceof \yii\web\Application && !$this->checkAccess()) {
            throw new ForbiddenHttpException('You are not allowed to access this page.');
        }
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Isolution666
@Isolution666
Full-Stack Developer
Здравствуйте товарищи программисты.
---
Не так страшен код, как его трактуют ))
Подсказку к этому вопросу как ни странно, я нашёл в папке "views/site/"
Файл: error.php
===
Разработчики поняли, что программисты столкнуться с таким вопросом, поэтому оставили подсказки:
<?php

use yii\helpers\Html;

/* @var $this yii\web\View */
/* @var $name string */
/* @var $message string */
/* @var $exception Exception */

$this->title = $name;
?>


Из них мы видим, что переменную <?=$name?>
нам даёт <?=$this->title;?>
А свалился этот нейм на наши головы из класса View !
Проведя рефакторинг, я понял, что за <?=$message;?>
Отвечает языковой пакет Yii2/
А именно. /vendor/yiisoft/yii2/messages/ru/
Если конечно вы в конфиге файла main.php указали русский язык. Там их куча, вы можете в этом убедится, да и сам класс показал, что используется модель подставки сообщений, через конструкцию: <?=Yii::t('yii','значение');?>

Вы спросите, а нахера такой геморрой нужен??

Отвечаю, во-первых, это не геморрой, а очень даже классное решение! Убивает сразу двух зайцев наповал! Мультиязычность - раз, Повторяющиеся элементы - два! Благодаря такому решению не надо ковырять весь код, достаточно заменяющие элементы заменить такой конструкцией, и всё, поменял текст или дизайн кнопки "обновить", сделал это в одном месте, в файле yii.php и всё, дизайн и текст поменялся во всём сайте, а отредактировали один файл!!! Это невероятно удобно. Так и с ошибками и с сообщениями, зачем писать на каждой страничке ручками "ваше сообщение успешно отправлено", если можно прописать значение = перевод. Так вот, в голове кода была ещё одна подсказка /* @var $exception Exception */
и в самом классе ссылка на мануал php7 - php.net/manual/ru/exception.getmessage.php

Таким образом мы имеем:
class HttpException extends UserException
{
    /**
     * @var int HTTP status code, such as 403, 404, 500, etc.
     */
    public $statusCode;


    /**
     * Constructor.
     * @param int $status HTTP status code, such as 404, 500, etc.
     * @param string $message error message
     * @param int $code error code
     * @param \Exception $previous The previous exception used for the exception chaining.
     */
    public function __construct($status, $message = null, $code = 0, \Exception $previous = null)
    {
        $this->statusCode = $status;
        parent::__construct($message, $code, $previous);
    }

    /**
     * @return string the user-friendly name of this exception
     */
    public function getName()
    {
        if (isset(Response::$httpStatuses[$this->statusCode])) {
            return Response::$httpStatuses[$this->statusCode];
        } else {
            return 'Error';
        }
    }
}

Ну так, раз мы можем указать код ошибки, public $statusCode;
То можно тупо и условия поставить, например:
<?=($exception->statusCode == '404') ? $this->title = "Ошибка 404" : ''; ?>
<?=($exception->statusCode == '403') ? $this->title = "Доступ запрещён" : ''; ?>
<?=($exception->statusCode == '500') ? $this->title = "Внутренняя ошибка сервера" : ''; ?>

А текст ошибки под заголовком редактируется в языковом пакете:
/vendor/yiisoft/yii2/messages/ru/yii.php
$message

<?php
return [
...
'Page not found.' => 'Страница не найдена.',
'You are not allowed to perform this action.' => 'Вам не разрешено производить данное действие.',
'An internal server error occurred.' => 'Возникла внутренняя ошибка сервера.',
...
];

Выводится как <?=Yii::t('yii', 'Page not found.');?> и т д...
Но вам выводить ничего не надо, класс сам определит код ошибки и выведет её текст.
Как заменить заголовок ошибки я уже написал выше.

--
Это был полный разбор страницы ошибок, благодарю всех за внимание. Пока :)
Ответ написан
Комментировать
@maxyc_webber
Web-программист
в конфиге приложения

sourceLanguage => en
language => ru

ps читайте документацию
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы