Laravel验证规则的本地化'之前'和'之后'使用'今天/明天'等参数

时间:2016-06-02 13:35:43

标签: php validation laravel date laravel-5

让我们假设我的模型中有这个规则:

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

1 个答案:

答案 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(...);
    });
}