
Laravel 的 __() 辅助函数仅支持对字符串型翻译项进行占位符替换,若传入路径指向数组(如 'key.b.c'),将因 strtr() 接收数组而报错;必须精确指定到含占位符的字符串键(如 'key.b.c.0.text')。
laravel 的 `__()` 辅助函数仅支持对字符串型翻译项进行占位符替换,若传入路径指向数组(如 `'key.b.c'`),将因 `strtr()` 接收数组而报错;必须精确指定到含占位符的字符串键(如 `'key.b.c.0.text'`)。
在 Laravel 本地化系统中,__() 函数底层调用 strtr() 进行参数替换,而 strtr() 要求第一个参数必须是字符串。当你写 __('key.b.c', [...]) 时,Laravel 会尝试从语言文件中取出 key.b.c 对应的值——但根据你的翻译结构,该路径实际对应的是一个嵌套数组(含 title 和 text 的子数组),而非字符串,因此触发 strtr() expects parameter 1 to be string, array given 错误。
✅ 正确做法:路径必须精确指向最终的字符串字段。例如,你的翻译结构为:
// resources/lang/en/messages.php
return [
'key' => [
'b' => [
'c' => [
[
'title' => 'Extract ',
'text' => ':num_replace some text',
],
],
],
],
];那么要替换 :num_replace,需明确访问到 text 字段。由于 c 是索引数组(含一个元素),正确路径应为:
$result = __('key.b.c.0.text', [
'num_replace' => $num > 0
? number_format($totalModelsPositionsCount)
: ''
]);⚠️ 注意事项:
- Laravel 的 __() 不支持对数组整体做占位符替换,它只处理单个翻译字符串;
- 若需动态渲染整个数组结构(如遍历多条带占位符的消息),应分别调用 __() 处理每个字符串字段;
- 建议在复杂嵌套场景中,将翻译键设计得更扁平(如 'key.b.c.item_1.text'),或改用 trans() + 手动 str_replace() / sprintf() 实现灵活控制;
- 使用 dd(__('key.b.c.0.text')) 可快速验证路径是否返回字符串,避免运行时错误。
总结:Laravel 本地化占位符机制本质是「字符串模板引擎」,一切路径终点必须是字符串——这是设计约束,而非缺陷。精准定位键路径,是安全使用 __() 替换功能的前提。


















