让我们假设我的模型中有这个规则:
public $rules = [
'a_date' => 'after:today',
'b_date' => 'before:today',
];
我在project\resources\lang\en\validation.php
:
'after' => 'The :attribute must be a date after :date.',
'before' => 'The :attribute must be a date before :date.',
我将它们翻译成project\resources\lang\some-language\validation.php
'after' => ':attribute *somelanguage* :date.',
'before' => ':attribute *somelanguage* :date.',
但是当我在我的应用程序中遇到验证错误时,我看到这样的字符串:
*field* *some language* today
(例如俄语:Поле a_date должно быть раньше чем today
)
所以问题是:如何以及在何处将此today
(以及任何其他类似之类的预定词)替换为所需的本地化?
PS:我可以使用文档https://laravel.com/docs/5.2/validation#localization中所述的自定义验证,但它仅适用于某些字段,我希望每当我在任何字段中使用它时都替换today
答案 0 :(得分:0)
在lang文件中创建一个数组(在我的例子中是title.php
):
'time_periods' => [
'yesterday' => 'вчера',
'now' => 'сейчас',
'today' => 'сегодня',
'tomorrow' => 'завтра',
],
然后在CustomValidator
类中添加以下代码:
所有这些代码都使用此数组的键替换某些规则中的参数和lang文件数组中的值。首先,它将英语替换者更改为本地化替换者,然后使用它替换验证消息中的实际占位符(:date
)。
class CustomValidator extends Validator {
public function replaceBefore($message, $attribute, $rule, $parameters) {
$parameter_translated = str_replace(
array_keys(trans('title.time_periods')),
array_values(trans('title.time_periods')),
$parameters[0]
);
return str_replace(':date', $parameter_translated, $message);
}
// this method does the same but for 'after' rule
public function replaceAfter($message, $attribute, $rule, $parameters) {
$parameter_translated = str_replace(array_keys(trans('title.time_periods')), array_values(trans('title.time_periods')), $parameters[0]);
return str_replace(':date', $parameter_translated, $message);
}
}
如果您不想CustomValidator
,请使用此方法(取自the documentation,请参阅:'定义错误消息'部分):
创建自定义验证规则时,有时可能需要 定义错误消息的自定义占位符替换。你可能会这样做 所以通过创建一个如上所述的自定义验证器,然后制作一个 调用Validator外观上的replacer方法。你可以这样做 在服务提供商的启动方法中:
/** * Bootstrap any application services. * * @return void */ public function boot() { Validator::extend(...); Validator::replacer('foo', function($message, $attribute, $rule, $parameters) { return str_replace(...); }); }