Как перевести ошибки валидации laravel

Изменение сообщений об ошибках
При необходимости вы можете задать свои сообщения об ошибках проверки ввода вместо изначальных. Для этого есть несколько способов. Во-первых, вы можете передать свои сообщения третьим аргументом метода Validator::make():

$messages = [
  'required' => 'Необходимо указать :attribute.',
];

$validator = Validator::make($input, $rules, $messages);
В этом примере обозначение :attribute будет заменено именем проверяемого поля. Вы можете использовать и другие обозначения. Например:

$messages = [
  'same'    => ':attribute и :other должны совпадать.',
  'size'    => ':attribute должен быть равен :size.',
  'between' => ':attribute должен быть между :min и :max.',
  'in'      => ':attribute должен иметь один из следующих типов: :values',
];

Указание своего сообщения для конкретного атрибута

Иногда вам может понадобиться указать своё сообщения только для конкретного поля. Вы можете сделать это с помощью «точечной» записи. Сначала укажите имя атрибута, а затем правило:

$messages = [
  'email.required' => 'Нам надо знать ваш e-mail!',
];

Указание своих сообщений в языковых файлах

В большинстве случаев вы будете указывать свои сообщения в языковом файле, а не передавать их напрямую в Validator. Для этого добавьте свои сообщения в массив custom в языковом файле resources/lang/xx/validation.php:

PHP
'custom' => [
  'email' => [
    'required' => 'Нам надо знать ваш e-mail!',
  ],
],

Ссылка на доку https://laravel.com/docs/7.x/validation#introduction

In Laravel, majority of validation error messages are good enough:

However, if you change the label, the validation message does not match the label:

Let’s see how we can fix this.


Label and Field Name Mismatch — Translated Form Attributes

As the application grows, you’ll have cases where the field name and label do not match. For example, I have a field called Order Date on the UI but the form has an ordered_at name:

Blade form

<div class="mt-4">

<x-input-label for="ordered_at" :value="__('Order date')"/>

<x-text-input id="ordered_at" class="block mt-1 w-full" type="date" name="ordered_at"

:value="old('ordered_at')"/>

<x-input-error :messages="$errors->get('ordered_at')" class="mt-2"/>

</div>

This will result in the following validation message:

The ordered at field is required.

It is not that user-friendly as our name is Order date. Let’s fix this by adding the attributes method to our Form Request class:

Form Request Class

use Illuminate\Foundation\Http\FormRequest;

class StoreOrderRequest extends FormRequest

{

public function rules(): array

{

return [

'ordered_at' => ['required', 'date'],

// ...

];

}

// ...

public function attributes(): array

{

return [

'ordered_at' => 'order date',

];

}

}

With this, we’ve told that once we have a field named ordered_at — its visual representation should be order date. This will result in the following validation message:

The order date field is required.

To go even further, we can use a translation here:

Form Request Class

// ...

public function attributes(): array

{

return [

'ordered_at' => __('Order date'),

];

}

This will result in: The Order date field is required. — matching the label.


Validating Array of Fields

This one is tricky. You might see something like…

This lesson is only for Premium Members.

Want to access all lessons of this course?

You also get:

  • 49 courses (910 lessons, 46 h 42 min total)

  • Premium tutorials

  • Access to repositories

  • Private Discord

Let’s say that you are writing a Laravel package that involves data validation with custom error messages. Let’s also say that you are interested in allowing your package to be translated into other languages. How would you pass your custom error strings to your validator?

I ran into this issue when working on my Laravel/Sentry 2 bridge package Sentinel. (It is not related to Cartalyst’s Sentinel Package.) This package uses a Validation system inspired by the book Implementing Laravel by Chris Fidao, and in several locations makes use of custom error messages.

When I switched to using language strings instead of strait text I wasn’t quite sure how to pull the custom error messages from the language files and pass them to the Validator. Here is what I landed on:

First we need to make sure that the Package’s namespace is passed to the Translator. Add this line to the Service Provider’s boot function:

1 // Package Service Provider
2 class SentinelServiceProvider extends ServiceProvider
3 {
4
5 // …
6
7 public function boot()
8 {
9 // …
10
11 // Add the Translator Namespace
12 $this->app[‘translator’]->addNamespace(‘Sentinel’, __DIR__.’/../lang’);
13 }
14
15 }

The addNamespace function informs Laravel’s translator class of the location of our language files and allows for the use of the ‘Sentinel’ namespace when translating language strings. We can now reference the Sentinel Package language strings via the Illuminate\Translation\Translator class:

1 echo Lang::get(‘Sentinel::users.noaccess’)
2
3 // Result:
4 // You are not allowed to do that.

We can also use trans(), which is a helper function that aliases Lang::get().

1 echo trans(‘Sentinel::users.noaccess’)
2
3 // Result:
4 // You are not allowed to do that.

Now we need to feed our custom error message strings to the Validator. This may be different for you, depending on how you handle validation, but the basic idea should remain the same.

1
2 <?php
3
4 namespace Sentinel\Service\Validation;
5
6 use Illuminate\Validation\Factory;
7
8 abstract class AbstractLaravelValidator implements ValidableInterface
9 {
10
11 /**
12 * Validator
13 *
14 * @var \Illuminate\Validation\Factory
15 */
16 protected $validator;
17
18 /**
19 * Custom Validation Messages
20 *
21 * @var Array
22 */
23 protected $messages = array();
24
25 public function __construct(Factory $validator)
26 {
27 $this->validator = $validator;
28
29 // Retrieve Custom Validation Messages & Pass them to the validator.
30 $this->messages = array_dot(trans(‘Sentinel::validation.custom’));
31 }
32
33 // …
34 }

src/Sentinel/Service/Validation/AbstractLaravelValidator.php

Here we are establishing a $messages class member and loading our custom language strings when the abstract validator class is instantiated. The language files use Sentinel::validaton.custom to refer to the array of custom error message strings.

Now all that remains is to pass the messages to the validator when we are attempting to validate data:

1 abstract class AbstractLaravelValidator implements ValidableInterface
2 {
3
4 // …
5
6 /**
7 * Validation passes or fails
8 *
9 * @return boolean
10 */
11 public function passes()
12 {
13 $validator = $this->validator->make($this->data, $this->rules, $this->messages);
14
15 if ($validator->fails() )
16 {
17 $this->errors = $validator->messages();
18 return false;
19 }
20
21 return true;
22 }
23 }

src/Sentinel/Service/Validation/AbstractLaravelValidator.php

The validator takes three arguments:

  1. An array of data to be validated.
  2. An array of the validation rules for that data.
  3. Optional: An array of custom error messages.

The messages array uses the input and names as array keys, and the corresponding value is the desired message text.

Problem solved!

Изменение сообщений об ошибках
При необходимости вы можете задать свои сообщения об ошибках проверки ввода вместо изначальных. Для этого есть несколько способов. Во-первых, вы можете передать свои сообщения третьим аргументом метода Validator::make():

$messages = [
  'required' => 'Необходимо указать :attribute.',
];

$validator = Validator::make($input, $rules, $messages);
В этом примере обозначение :attribute будет заменено именем проверяемого поля. Вы можете использовать и другие обозначения. Например:

$messages = [
  'same'    => ':attribute и :other должны совпадать.',
  'size'    => ':attribute должен быть равен :size.',
  'between' => ':attribute должен быть между :min и :max.',
  'in'      => ':attribute должен иметь один из следующих типов: :values',
];

Указание своего сообщения для конкретного атрибута

Иногда вам может понадобиться указать своё сообщения только для конкретного поля. Вы можете сделать это с помощью «точечной» записи. Сначала укажите имя атрибута, а затем правило:

$messages = [
  'email.required' => 'Нам надо знать ваш e-mail!',
];

Указание своих сообщений в языковых файлах

В большинстве случаев вы будете указывать свои сообщения в языковом файле, а не передавать их напрямую в Validator. Для этого добавьте свои сообщения в массив custom в языковом файле resources/lang/xx/validation.php:

PHP
'custom' => [
  'email' => [
    'required' => 'Нам надо знать ваш e-mail!',
  ],
],

Ссылка на доку https://laravel.com/docs/7.x/validation#introduction

Локализация интерфейса

  • Введение

    • Конфигурирование языка по умолчанию
  • Определение строк перевода

    • Использование коротких ключей
    • Использование строк перевода в качестве ключей
  • Получение строк перевода

    • Замена параметров в строках перевода
    • Плюрализация
  • Переопределение языковых файлов пакета

Введение

Функционал локализации Laravel предоставляют удобный способ извлечения строк разных языков, что позволяет легко поддерживать мультиязычность интерфейса вашего приложения.

Laravel предлагает два способа управления строками перевода. Во-первых, языковые строки могут храниться в файлах в каталоге resources/lang. В этом каталоге могут быть подкаталоги для каждого языка, поддерживаемого приложением. Это подход, который Laravel использует для управления строками перевода собственного функционала, например сообщений об ошибках валидации:

/resources
    /lang
        /en
            messages.php
        /es
            messages.php

Или строки перевода могут быть определены в файлах JSON, которые помещаются в каталог resources/lang. При таком подходе каждый язык, поддерживаемый вашим приложением, будет иметь соответствующий файл JSON в этом каталоге. Этот подход рекомендуется для приложений с большим количеством переводимых строк:

/resources
    /lang
        en.json
        es.json

Мы обсудим каждый подход по управлению строками перевода в этой документации.

Конфигурирование языка по умолчанию

Язык по умолчанию для вашего приложения хранится в параметре locale конфигурационного файла config/app.php. Вы можете изменить это значение в соответствии с потребностями вашего приложения.

Вы можете изменить язык по умолчанию для одного HTTP-запроса во время выполнения, используя метод setLocale фасада App:

use IlluminateSupportFacadesApp;

Route::get('/greeting/{locale}', function ($locale) {
    if (! in_array($locale, ['en', 'es', 'fr'])) {
        abort(400);
    }

    App::setLocale($locale);

    //
});

Вы можете указать «резервный язык», который будет использоваться, когда активный язык не содержит конкретной строки перевода. Как и язык по умолчанию, резервный язык также задается в конфигурационном файле config/app.php:

'fallback_locale' => 'en',

Определение текущего языка

Вы можете использовать методы currentLocale и isLocale фасада App, чтобы определить текущий язык или проверить соответствие указанного языка:

use IlluminateSupportFacadesApp;

$locale = App::currentLocale();

if (App::isLocale('en')) {
    //
}

Определение строк перевода

Использование коротких ключей

Обычно строки перевода хранятся в файлах в каталоге resources/lang. В этом каталоге должен быть подкаталог для каждого языка, поддерживаемого вашим приложением. Это подход, который Laravel использует для управления строками перевода собственного функционала, например сообщений об ошибках валидации:

/resources
    /lang
        /en
            messages.php
        /es
            messages.php

Все языковые файлы возвращают массив строк с ключами. Например:

<?php

// resources/lang/en/messages.php

return [
    'welcome' => 'Welcome to our application!',
];

Для языков, отличающихся территориально, вы должны назвать языковые каталоги в соответствии со стандартом ISO 15897. Например, для британского английского следует использовать «en_GB», а не «en-gb».

Использование строк перевода в качестве ключей

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

По этой причине Laravel предлагает определение строк перевода с использованием переводимой строки в качестве ключа «по умолчанию». Файлы перевода, которые используют строки перевода в качестве ключей, хранятся как файлы JSON в каталоге resources/lang. Например, если ваше приложение имеет испанский перевод, то вы должны создать файл resources/lang/es.json:

{
    "I love programming.": "Me encanta programar."
}

Конфликты ключей и имен файлов

Вы не должны определять строковые ключи перевода, которые конфликтуют с именами файлов перевода. Например, перевод __('Action') для языка NL при условии существования файла nl/action.php и отсутствии файла nl.json приведет к тому, что переводчик Laravel вернет содержимое всего файла nl/action.php.

Получение строк перевода

Вы можете получить строки перевода из ваших языковых файлов с помощью глобального помощника __. Если вы используете «короткие ключи» для определения ваших строк перевода, то вы должны передать файл, содержащий ключ, и сам ключ в функцию __, используя «точечную нотацию». Например, давайте извлечем строку перевода welcome из языкового файла resources/lang/en/messages.php:

echo __('messages.welcome');

Если указанная строка перевода не существует, то функция __ вернет ключ строки перевода. Итак, используя приведенный выше пример, функция __ вернет messages.welcome, если строка перевода не существует.

Если вы используете свои строки перевода в качестве ключей перевода, то вы должны передать перевод вашей строки по умолчанию в функцию __:

echo __('I love programming.');

Опять же, если строка перевода не существует, то функция __ вернет ключ строки перевода, который ей был передан.

Если вы используете шаблонизатор Blade, то вы можете использовать синтаксис {{}} для вывода строки перевода:

{{ __('messages.welcome') }}

Замена параметров в строках перевода

При желании вы можете определить метку-заполнитель в строках перевода. Все заполнители имеют префикс :. Например, вы можете определить приветственное сообщение с именем-заполнителем:

'welcome' => 'Welcome, :name',

Чтобы заменить заполнители при получении строки перевода, вы можете передать массив для замены в качестве второго аргумента функции __:

echo __('messages.welcome', ['name' => 'dayle']);

Если все буквы заполнителя заглавные или заполнитель имеет только первую заглавную букву, то переведенное значение будет с соответствующим регистром:

'welcome' => 'Welcome, :NAME', // Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle

Плюрализация

Плюрализация – сложная задача, поскольку разные языки имеют множество сложных правил плюрализации; однако Laravel может помочь вам переводить строки по-разному в зависимости от правил множественного числа, которые вы определяете. Используя мета-символ |, вы можете различать формы единственного и множественного числа строки:

'apples' => 'There is one apple|There are many apples',

Конечно, множественное число также поддерживается при использовании строк перевода в качестве ключей:

{
    "There is one apple|There are many apples": "Hay una manzana|Hay muchas manzanas"
}

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

'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',

После определения строки перевода, которая имеет параметры множественного числа, вы можете использовать функцию trans_choice для извлечения строки соответствующую указанному «количеству». В этом примере, поскольку количество больше единицы, возвращается форма множественного числа строки перевода:

echo trans_choice('messages.apples', 10);

Вы также можете определить метку-заполнитель в строках множественного числа. Эти заполнители могут быть заменены передачей массива в качестве третьего аргумента функции trans_choice:

'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago',

echo trans_choice('time.minutes_ago', 5, ['value' => 5]);

Если вы хотите отобразить целочисленное значение, переданное в функцию trans_choice, то вы можете использовать встроенный заполнитель :count:

'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',

Переопределение языковых файлов пакета

Некоторые пакеты могут содержать собственные языковые файлы. Вместо того чтобы изменять строки файлов пакета, вы можете переопределить их, поместив файлы в каталог resources/lang/vendor/{package}/{locale}.

Так, например, если вам нужно переопределить строки перевода на английский в messages.php для пакета с именем skyrim/hearthfire, вы должны поместить языковой файл в каталог: resources/lang/vendor/hearthfire/en/messages.php. В этом файле вы должны определять только те строки перевода, которые хотите переопределить. Любые строки перевода, которые вы не меняете, все равно будут загружены из исходных языковых файлов пакета.

Search code, repositories, users, issues, pull requests…

Provide feedback

Saved searches

Use saved searches to filter your results more quickly

Sign up

Понравилась статья? Поделить с друзьями:
  • Как переводится ошибка 404
  • Как отловить ошибку питон
  • Как перевести слово ошибка на английский
  • Как отловить ошибку python
  • Как ошибок много катится слеза