【发布时间】:2019-05-21 19:02:52
【问题描述】:
如何翻译“给定的数据无效”。到 Laravel 5.6? 谢谢
【问题讨论】:
-
如何输出数据?当验证失败时,它会返回错误,你会得到
The given data was invalid。你用它做什么?你能把它包装在一个trans()函数中并从那里的文件中获取翻译吗?
标签: laravel validation
如何翻译“给定的数据无效”。到 Laravel 5.6? 谢谢
【问题讨论】:
The given data was invalid。你用它做什么?你能把它包装在一个trans() 函数中并从那里的文件中获取翻译吗?
标签: laravel validation
在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.
编码愉快~! :)
【讨论】:
if ($exception instanceof \Illuminate\Validation\ValidationException) - 正如下面 Luka Sh 所指出的
“给定的数据无效。”是硬编码的
文件: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
【讨论】:
正如上面已经提到的 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 不改名字有什么意义?
在 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);
}
这就是享受
【讨论】:
抱歉回复晚了,我找到了一个在 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.
希望对以后的参考有所帮助。
最好的问候
【讨论】:
遗憾的是,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 响应中的消息字符串(根据需要)。
【讨论】: