Laravel 5.8 验证本地化 - 不翻译错误消息

Alm*_*itt 1 php validation internationalization laravel laravel-5.8

我有一个应该相对简单的问题,但我已经阅读了这里的文档和多篇文章,但仍然无法弄清楚。:(

\n\n

我正在创建一个具有本地化功能的 Laravel 应用程序(英语和法语)。就本地化而言,页面上的一切都运行良好。然而,当涉及到验证时,我似乎无法翻译错误。

\n\n

这是一些示例代码:

\n\n

请注意,我删除了大部分不相关的代码以使这个示例更清晰。

\n\n

控制器内的验证器

\n\n
 $validator = Validator::make($request->all(), [\n      \'email\' => \'required|email|max:120\',\n ]);\n
Run Code Online (Sandbox Code Playgroud)\n\n

刀刃

\n\n
<div class="form-group">\n    <label for="input-email">@error(\'email\') {{ $errors->first(\'email\') }} @else @lang(\'index.email\') @enderror</label>\n    <input type="email" name="email" placeholder="@lang(\'index.email\')" value="{{ old(\'email\') }}">\n</div>\n
Run Code Online (Sandbox Code Playgroud)\n\n

验证结构

\n\n

资源/语言

\n\n

     zh

\n\n

         验证.php

\n\n

     FR

\n\n

         验证.php

\n\n

fr/validation.php

\n\n
<?php\n\nreturn [\n    \'email\' => \'Veuillez ins\xc3\xa9rer une adresse email valide.\',\n];\n
Run Code Online (Sandbox Code Playgroud)\n\n

en/validation.php

\n\n

\n\n

php\n\nreturn [\n    \'email\' => \'Please insert a valid email address.\',\n];\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试过:\n- 清理缓存:

\n\n
php artisan cache:clear\n
Run Code Online (Sandbox Code Playgroud)\n\n

我注意到的一件事是它似乎总是以英语验证返回。它似乎忽略了 fr/validation.php 文件。

\n\n

有谁知道为什么?有没有办法强制验证器中的区域设置?或者,我在这里错过了什么吗?我非常感谢您的意见、建议和想法!

\n\n

感谢@nakov 的建议。我能够在 config/app.php 文件中强制使用该语言。

\n\n
\'locale\' => \'fr\',\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里,它将更改验证的区域设置,这非常棒。现在的问题是,为什么控制器内的“链接”丢失/损坏?即,知道 applocale 已设置为 FR,为什么它会带回 valid.php 的 EN 版本?我可以在控制器中强制执行此操作吗?

\n\n

以下是我如何通过路由设置来设置区域设置:

\n\n
Route::get(\'/{lang?}\', function($lang = \'en\') {\n    App::setLocale($lang);\n    return view(\'welcome\');\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

#回答

\n\n

感谢@nakov 的所有帮助和建议!

\n\n

因此,问题在于区域设置不会持续存在,因此在验证失败时刷新时会丢失。

\n\n

我是怎么解决的?

\n\n

在控制器内:

\n\n

“使用”该应用程序

\n\n
use Illuminate\\Foundation\\Application;\n
Run Code Online (Sandbox Code Playgroud)\n\n

将其带入您的函数中,在我的例子中它是存储:

\n\n
public function store(Application $app, Request $request)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Blade 中,在隐藏输入中设置区域设置。我将我的命名为“语言”,但您可以随意命名。然后,再次在控制器中将区域设置设置为该语言

\n\n
$app->setLocale($request->language);\n
Run Code Online (Sandbox Code Playgroud)\n\n

宾果游戏!你的问题已经解决了。:) 再次感谢@nakov!

\n\n

谢谢!

\n\n

布拉德

\n

nak*_*kov 5

因此,根据问题下方评论中的讨论,问题在于其他路线中没有保留该语言环境。为了做到这一点,你需要中间件。是一个很好的答案。

快乐编码!:)