日期验证 - 如何本地化/翻译字符串"今天"和"明天"



在我的模型中,我使用beforeafter:为日期字段定义了一些验证规则

'birth_date' => 'required|date|before:today|after:01-jan-1920',
'another_date' => 'required|date|before:tomorrow|after:01-jan-1990',

验证工作正常,但是我不知道如何翻译验证消息上的字符串todaytomorrow

validation.php语言文件中,afterbefore消息是可本地化的,但是消息的:date部分仍然显示todaytomorrow的英文版本。

"after"            => "The :attribute must be a date after :date.",
"before"           => "The :attribute must be a date before :date.",

如何本地化验证消息中的todaytomorrow这两个单词?

简而言之,在resources/lang/whichever/validation.php 中添加以下代码

'values' => [
    // or whatever fields you wanna translate
    'birth_date' => [
        // or tomorrow
        'today' => '今天'
    ]
]

解释:

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

您可以在验证语言文件或代码本身中使用每个字段的自定义验证消息:https://laravel.com/docs/5.2/validation#custom-错误消息

让我们模拟一个控制器验证,看看它是如何工作的:

<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateRoutingController;
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 */
    }
}

您也可以使用表单请求(甚至更好)来实现这一点,您所需要做的就是在messages()方法中返回自定义翻译的消息。:)

使用自定义错误消息。

$this->validate(
            $request,
            [
                'phone' => 'required|regex:/^(d[s-]?)?[([s-]{0,2}?d{3}[)]s-]{0,2}?d{3}[s-]?d{4}$/i'
            ],
            [
                'regex' => 'You must enter a valid phone number.',
                'required' => 'You must enter a valid phone number.'
            ]
        );

将"regex"one_answers"required"替换为"before:today"one_answers"before:tomorrow",并替换为自定义错误消息。

进行一些自定义验证可能更有意义,但我认为您应该能够简单地使用Carbon:来做到这一点

$dt = new CarbonCarbon();
$today = $dt->today();
$tomorrow = $dt->tomorrow();
    $rules = [
        ...
        'birth_date' => 'required|date|before:'.$today.'|after:01-jan-1920',
        'another_date' => 'required|date|before:'.$tomorrow.'|after:01-jan-1990'
    ];

相关内容

最新更新