Laravel验证中动态嵌套多语言属性的翻译问题求助
解决Laravel嵌套属性验证的翻译问题
针对你使用title.*验证多语言字段时遇到的翻译提示异常问题,这里提供两种可行的解决方案:
方案一:嵌套数组配置属性翻译
直接在validation.php的attributes节点中用嵌套数组定义title的子字段翻译,避免重复定义键名导致的语法错误:
'attributes' => [ 'title' => [ 'en' => 'English Title', 'fa' => 'Farsi Title', 'es' => 'Spanish Title', ], ],
配置完成后,title.en的验证提示会自动替换为"English Title is required.",直接对应子字段的翻译内容。
方案二:自定义属性解析逻辑
如果需要实现"TITLE ENGLISH"这类拼接式的翻译格式,可通过自定义验证消息替换器实现:
- 先在
validation.php中保留基础属性翻译:
'attributes' => [ 'title' => 'TITLE', 'en' => 'ENGLISH', 'fa' => 'FARSI', 'es' => 'SPANISH', ],
- 在
App\Providers\AppServiceProvider的boot方法中添加自定义替换规则:
use Illuminate\Support\Facades\Validator; public function boot() { Validator::replacer('required', function ($message, $attribute, $rule, $parameters) { $parts = explode('.', $attribute); // 仅处理title.xx格式的嵌套属性 if (count($parts) === 2 && $parts[0] === 'title') { $title = __('validation.attributes.title'); $lang = __('validation.attributes.' . $parts[1]); $attribute = "{$title} {$lang}"; } return str_replace(':attribute', $attribute, $message); }); }
配置后,title.en的验证提示会变为你预期的"TITLE ENGLISH is required."。
你之前尝试的'title.en' => 'ENGLISH TITLE'配置无效,是因为Laravel处理通配符*生成的字段时,默认优先解析嵌套数组结构的属性定义,而非直接识别点连接的键名,因此该方式无法被系统正确读取。
内容的提问来源于stack exchange,提问作者Kowalski
相关产品推荐
相关产品推荐

