Laravel9修改多语言配置报htmlspecialchars参数类型错误解决方法
错误原因
Laravel的__()翻译辅助函数解析键名的规则是{语言文件名}.{数组层级键用点分隔},你模板里写的调用键是post.index.search.placeholder,框架会按这个路径逐层查找:先定位lang/post.php文件,再找该文件返回数组里的index键,接着往下找search.placeholder。
但你修改的post.php里顶层直接就是search数组,根本没有index这一层键。框架找不到匹配的翻译值时,会返回当前路径能查到的最后一级内容——也就是整个search数组。而Blade的{{ }}输出语法默认会调用htmlspecialchars()转义内容,这个函数只接受字符串参数,传入数组就会抛出你看到的类型错误。
至于你把配置改回字符串格式就恢复正常,本质是误打误撞:这时候框架找不到对应翻译,会直接把你传入的完整键名字符串post.index.search.placeholder返回,因为是字符串类型所以不会触发类型错误,但页面上实际显示的是错误的键名,并没有正确读取到翻译文案。
修复方案
根据你自己的文件结构规划二选一即可:
- 如果你不需要按子页面拆分post模块的翻译,直接改模板里的调用路径,删掉多余的
index层级就行:
<input type="text" name="search" placeholder="{{ __('post.search.placeholder') }}"> <!-- 空搜索结果提示 --> <p>{{ __('post.search.null') }}</p>
- 如果你本来就计划按页面拆分翻译,把搜索文案归到post模块的index页面下,说明你文件放错位置了:在
lang目录下新建post子文件夹,把写了search数组配置的文件命名为index.php,放到lang/post/index.php路径下,这时候你原来写的post.index.search.placeholder调用路径是正确的,不用改模板。
排查小技巧:拿不准翻译键返回什么内容的时候,可以临时在模板里写{{ dd(__('你写的翻译键')) }},打印实际返回值就能快速定位层级错误。
内容的提问来源于stack exchange,提问作者Wildan Maulana
相关产品推荐
相关产品推荐

