【问题标题】:Translate "The given data was invalid." in Laravel 5.6翻译“给定的数据无效。”在 Laravel 5.6 中
【发布时间】:2019-05-21 19:02:52
【问题描述】:

如何翻译“给定的数据无效”。到 Laravel 5.6? 谢谢

【问题讨论】:

  • 如何输出数据?当验证失败时,它会返回错误,你会得到The given data was invalid。你用它做什么?你能把它包装在一个trans() 函数中并从那里的文件中获取翻译吗?

标签: laravel validation


【解决方案1】:

resources/lang/{lang_code}/validation中查找并替换该消息

   'exists'               => 'The selected :attribute is invalid.',

在此处更改为您的语言而不是 :attribute

添加以下行添加到文件app\Exceptions\Handler.php的render()方法中

if ($exception instanceof ValidationException)
  return response()->json(['message' => 'Your error message here', 'errors' => $exception->validator->getMessageBag()], 422); //type your error code.

编码愉快~! :)

【讨论】:

  • 感谢$validator->getMessageBag()
  • 我需要类的完整路径:if ($exception instanceof \Illuminate\Validation\ValidationException) - 正如下面 Luka Sh 所指出的
【解决方案2】:

“给定的数据无效。”是硬编码的

文件:src/Illuminate/Validation/ValidationException.php

    public function __construct($validator, $response = null, $errorBag = 'default')
    {
   -    parent::__construct('The given data was invalid.');
   +    parent::__construct(__('The given data was invalid.'));
        $this->response = $response;
        $this->errorBag = $errorBag;

来自提交: https://github.com/laravel/framework/pull/22112/commits/b70372fd0031e5fabaee462c913b19b665becaf3

【讨论】:

    【解决方案3】:

    正如上面已经提到的 JsWizard,您可以通过在 app\Exceptions\Handler.php 中添加以下行来处理该特定异常

    只是为了改进他的答案,您需要包含 ValidationException

    use Illuminate\Validation\ValidationException as ValidationException;
    

    然后将以下内容添加到render() 方法中:

    if ($exception instanceof ValidationException) {
    
        return response()->json(['message' => 'YOUR CUSTOM MESSAGE HERE', 'errors' => $exception->validator->getMessageBag()], 422);
    
    }
    

    【讨论】:

    • ValidationException as ValidationException? as ValidationException 不改名字有什么意义?
    【解决方案4】:

    在 laravel 8 app/Exceptions/Handler.php 中只需覆盖如下方法

    /**
     * Convert a validation exception into a JSON response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Validation\ValidationException  $exception
     * @return \Illuminate\Http\JsonResponse
     */
    protected function invalidJson($request, ValidationException $exception)
    {
        return response()->json([
            'message' => __('validation.headermsg'),
            'errors' => $exception->errors(),
        ], $exception->status);
    }
    

    这就是享受

    【讨论】:

    • 并且不要忘记将 \Illuminate\Validation\ValidationException 添加到顶部使用。最好的问候
    【解决方案5】:

    抱歉回复晚了,我找到了一个在 Laravel 5.8 及更高版本中工作的方法。 我希望你还在寻找答案,这是我的。

    正如 Laravel 的官方文档所解释的那样:

    在 AJAX 请求期间使用 validate 方法时,Laravel 不会生成重定向响应。相反,Laravel 会生成一个包含所有验证错误的 JSON 响应。此 JSON 响应将与 422 HTTP 状态代码一起发送。

    因此,您无法翻译响应,因为它是 laravel 核心的一部分并且是硬编码的,并且在响应中做同样的事情不是解决方案。

    所以我建议您对表单使用请求验证方法,然后扩展名为 failedValidation(Validator $validator) 的方法,它是 FormRequest 类的一部分。

    您可以使用工匠控制台创建新的 RequestValidation: php artisan make:request FooRequest

    当您拥有 FooRequest.php 文件时,添加方法 failedValidation 方法和建议的行:

    /**
     * Handle a failed validation attempt.
     *
     * @param  \Illuminate\Contracts\Validation\Validator  $validator
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    protected function failedValidation(Validator $validator)
    {
        /**
         * @var array $response Is our response data.
         */
        $response = [
            "success" => false, // Here I added a new field on JSON response.
            "message" => __("Los datos enviados no son válidos."), // Here I used a custom message.
            "errors" => $validator->errors(), // And do not forget to add the common errors.
        ];
    
        // Finally throw the HttpResponseException.
        throw new HttpResponseException(response()->json($response, 422));
    }
    

    我们 422 响应的结果是:

    I used Postman for the Request, check the response.
    希望对以后的参考有所帮助。

    最好的问候

    【讨论】:

    • 感谢您的提示。我解决了一个错误,包括 Illuminate\Http\Exceptions\HttpResponseException 而不是 Illuminate\Validation\ValidationException
    【解决方案6】:

    遗憾的是,Laravel 团队将此标记为非问题(他们在这类事情上非常固执)。

    我发现绕过这个问题的最干净的方法是添加到app/Exceptions/Handler.php这个代码:

    public function render($request, Throwable $e)
    {
        if ($e instanceof ValidationException)
        {
            if ($request->expectsJson()) {
                return response()->json([
                    'message'=>__($e->getMessage()),
                    'errors'=> $e->errors(),
                ],$e->status);
            }
        }
        return parent::render($request, $e);
    }
    

    然后在resources/lang/[language-code].json中添加翻译;例如,意大利创建一个名为 resources/lang/it.json 的文件,内容如下:

    {
        "The given data was invalid." : "I dati inseriti contengono errori."
    }
    

    代码只会替换 JSON 响应中的消息字符串(根据需要)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 2020-04-16
      • 2019-09-19
      • 2020-07-01
      • 2018-10-31
      • 2011-11-28
      • 2021-05-29
      相关资源
      最近更新 更多