如何翻译 Laravel 文件中 JSON 的默认验证错误?

How can I translate Laravel's default validation errors in JSON file?

我需要在 JSON 文件中翻译 Laravel 的默认验证错误。问题是如果我想覆盖翻译,比如 resourses/lang/de.json 文件中的 'required' 验证错误,它不起作用。

我必须这样做的原因是我正在使用的短语翻译系统。

有什么想法吗?谢谢!


更新

经过一些研究,现在我知道我的 'problem' 是什么了。 Laravel 使用 trans() 函数翻译验证错误,但如果你想使用 Laravel 的 JSON 翻译,那么你必须使用 __() 函数。好吧,我知道他们为什么这样做,因为验证错误是由 'short keys' 和 JSON 格式化的翻译构成的,如果使用字符串作为键。 但是,如果我仍然想以 JSONish(我知道这是一个未来主义的词)方式翻译默认错误怎么办?在这里按照我的解决方案:

首先你必须创建一个表单请求(https://laravel.com/docs/7.x/validation#creating-form-requests):

php artisan make:request UserUpdateRequest

在新创建的表单请求文件中,您必须覆盖消息函数才能转换验证错误:

namespace App\Http\Requests\v1;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use App\Exceptions\ApiValidationException;

class UserUpdateRequest extends FormRequest
{
     /**
      * Get the validation rules that apply to the request.
      *
      * @return array
      */
     public function rules()
     {
          return [
              'name' => ['required', 'string', 'min:3', 'max:255'],
          ];
     }

     /**
      * Get custom messages for validator errors.
      *
      * @return array
      */
     public function messages()
     {
          return [
              'name.required' => __('The user name is required.'),
              'name.string' => __('The user name must be a string.'),
              'name.min' => __('The user name must be at least three characters.'),
              'name.max' => __('The user name may not be greater than 255 characters.'),
          ];
     }
}

现在我们必须创建翻译文件 (https://laravel.com/docs/7.x/localization#using-translation-strings-as-keys) 并将新的翻译字符串放入其中。

# resourses/lang/de.json

{
    "The user name is required." : "The user name is required.",
    "The user name must be a string." : "The user name must be a string.",
    "The user name must be at least three characters." : "The user name must be at least three characters.",
    "The user name may not be greater than 255 characters." : "The user name may not be greater than 255 characters."
}

仅此而已。 我希望这个翻译过程的描述对其他人有用。

我需要翻译 JSON 文件中 Laravel 的默认验证错误。问题是如果我想覆盖翻译,比如 resourses/lang/de.json 文件中的 'required' 验证错误,它不起作用。

我必须这样做的原因是我正在使用的短语翻译系统。

有什么想法吗?谢谢!


回答

经过一些研究,现在我知道我的 'problem' 是什么了。 Laravel 使用 trans() 函数翻译验证错误,但如果你想使用 Laravel 的 JSON 翻译,那么你必须使用 __() 函数。好吧,我知道他们为什么这样做,因为验证错误是由 'short keys' 和 JSON 格式化的翻译构成的,如果使用字符串作为键。 但是,如果我仍然想以 JSONish(我知道这是一个未来主义的词)方式翻译默认错误怎么办?在这里按照我的解决方案:

首先你必须创建一个表单请求(https://laravel.com/docs/7.x/validation#creating-form-requests):

php artisan make:request UserUpdateRequest

在新创建的表单请求文件中,您必须覆盖消息函数才能转换验证错误:

namespace App\Http\Requests\v1;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use App\Exceptions\ApiValidationException;

class UserUpdateRequest extends FormRequest
{
     /**
      * Get the validation rules that apply to the request.
      *
      * @return array
      */
     public function rules()
     {
          return [
              'name' => ['required', 'string', 'min:3', 'max:255'],
          ];
     }

     /**
      * Get custom messages for validator errors.
      *
      * @return array
      */
     public function messages()
     {
          return [
              'name.required' => __('The user name is required.'),
              'name.string' => __('The user name must be a string.'),
              'name.min' => __('The user name must be at least three characters.'),
              'name.max' => __('The user name may not be greater than 255 characters.'),
          ];
     }
}

现在我们必须创建翻译文件 (https://laravel.com/docs/7.x/localization#using-translation-strings-as-keys) 并将新的翻译字符串放入其中。

# resourses/lang/de.json

{
    "The user name is required." : "The user name is required.",
    "The user name must be a string." : "The user name must be a string.",
    "The user name must be at least three characters." : "The user name must be at least three characters.",
    "The user name may not be greater than 255 characters." : "The user name may not be greater than 255 characters."
}

仅此而已。 我希望这个翻译过程的描述对其他人有用。

根据提供的答案,我进一步挖掘并发现双下划线函数在默认 validation.php 文件中按预期工作!我用 Laravel 5.6.

测试了它

我有一个类似的问题,我需要为用户提供一种方法来为网络应用程序中的所有内容提供翻译,因此我开始测试该解决方案。虽然它按说明工作,但它不再使用占位符属性,因此在我的情况下它的可扩展性不是很好。

我使用双下划线函数进行了测试,要求如下:

  1. locale 和 fallback_locale 在 app.php
  2. 中设置为 'en'
  3. 里面有一个en文件夹resources/lang
  4. en文件夹中有一个validation.php文件
  5. resources/lang 文件夹
  6. 中有一个语言环境 json 文件(如 pt-br.json)
  7. 应用程序使用 App::setlocale()
  8. 动态设置语言环境

在 validation.php 中需要更改的只是使用字符串中的函数,如下所示:

# before
'unique' => 'The :attribute has already been taken.',

#after
'unique' => __('The :attribute has already been taken.'),

并且json文件需要有一个具有相同字符串的字符串键,如下所示:

"The :attribute has already been taken.": ":attribute j\u00e1 existe!"

感谢您让我对这个问题有了更多的思考。我认为 Laravel 应该更好地支持这样的用例。