
Laravel 的 __() 辅助函数仅接受字符串形式的翻译键路径,不支持直接对数组结构进行占位符替换;若翻译值为嵌套数组,必须定位到含占位符的最终字符串字段(如 'key.b.c.0.text'),否则会因传入数组而非字符串而触发 strtr() expects parameter 1 to be string 错误。
laravel 的 `__()` 辅助函数仅接受字符串形式的翻译键路径,不支持直接对数组结构进行占位符替换;若翻译值为嵌套数组,必须定位到含占位符的最终字符串字段(如 `'key.b.c.0.text'`),否则会因传入数组而非字符串而触发 `strtr() expects parameter 1 to be string` 错误。
在 Laravel 本地化系统中,__() 函数(即 trans())的设计初衷是解析并返回单个翻译后的字符串,其内部调用 strtr() 进行占位符替换——而 strtr() 要求第一个参数必须是字符串。因此,当你传入 'key.b.c' 时,Laravel 会查找到对应值 [['title' => 'Extract ', 'text' => ':num_replace some text']](一个数组),随后尝试对该数组执行字符串替换,自然抛出类型错误。
✅ 正确做法:精确指向含占位符的字符串字段
你的翻译结构中,占位符 :num_replace 出现在 text 字段内,且该字段位于数组的第一个元素中。因此应使用点号语法完整定位至叶子节点:
// ✅ 正确:定位到具体字符串字段(注意索引 0 和 key 'text')
$result = __('key.b.c.0.text', [
'num_replace' => $num > 0 ? number_format($totalModelsPositionsCount) : ''
]);
// 输出示例(假设 $num=1, $totalModelsPositionsCount=1234.56):
// "1,235 some text"
⚠️ 注意事项:
- Laravel 翻译数组不支持动态索引通配符(如 c.*.text),必须明确指定数组下标(如 0、1 等);
- 若需遍历多条带占位符的数据,应先获取原始数组,再对每项单独调用 __():
$items = trans('key.b.c'); // 获取整个数组 $processed = collect($items)->map(function ($item) use ($num, $totalModelsPositionsCount) { return [ 'title' => __($item['title']), // 若 title 也含占位符 'text' => __($item['text'], [ 'num_replace' => $num > 0 ? number_format($totalModelsPositionsCount) : '' ]) ]; })->toArray(); - 所有占位符必须与翻译字符串中的命名完全一致(包括冒号前缀),且仅支持 :param 格式,不支持 {param} 或 {{param}}。
总结:Laravel 的翻译占位符机制本质是字符串模板渲染,不是数组映射工具。务必确保 __() 的第一个参数最终解析为字符串值——这既是设计约束,也是性能与安全性的保障。











