In my model I defined a few validation rules for date fields using before
and after
:
'birth_date' => 'required|date|before:today|after:01-jan-1920',
'another_date' => 'required|date|before:tomorrow|after:01-jan-1990',
The validation works fine, however I can't figure out how to translate the strings today
and tomorrow
on the validation message.
In the validation.php
language file the after
and before
messages are localizable, however the :date
part of the message is still displaying the English version for today
and tomorrow
.
"after" => "The :attribute must be a date after :date.",
"before" => "The :attribute must be a date before :date.",
How could I localize those two words - today
and tomorrow
- in the validation message?
In short, add following code into resources/lang/whichever/validation.php
'values' => [
// or whatever fields you wanna translate
'birth_date' => [
// or tomorrow
'today' => '今天'
]
]
Explained:
https://github.com/laravel/framework/blob/7.x/src/Illuminate/Validation/Concerns/FormatsMessages.php#L319
/**
* Get the displayable name of the value.
*
* @param string $attribute
* @param mixed $value
* @return string
*/
public function getDisplayableValue($attribute, $value)
{
if (isset($this->customValues[$attribute][$value])) {
return $this->customValues[$attribute][$value];
}
// the key we want
$key = "validation.values.{$attribute}.{$value}";
// if the translate found, then use it
if (($line = $this->translator->get($key)) !== $key) {
return $line;
}
if (is_bool($value)) {
return $value ? 'true' : 'false';
}
return $value;
}
You can use custom validation messages per field, either on validation language file or in your code itself: https://laravel.com/docs/5.2/validation#custom-error-messages
Let's simulate a controller validation to see how it works:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class YourController extends Controller
{
public function store(Request $request)
{
$rules = [
'birth_date' => 'required|date|before:today|after:01-jan-1920',
];
$messages = [
'birth_date.before' => 'A data de nascimento deve ser uma data antes de hoje.', // "The birth date must be a date before today" in portuguese
];
$this->validate($request, $rules, $messages);
/* your stuff */
}
}
You can also do that with form requests (which are even nicer), all you need to do is return your custom translated messages inside messages()
method. :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With