thinkphp导出多语言包需手动实现:先写utf-8 bom解决excel乱码,用glob遍历lang文件并include获取数组,递归展开嵌套键为点号格式(如user.login.title),group取数组首层键,再用phpspreadsheet导出为xlsx,注意响应头和编码规范。

导出多语言包为 CSV:用 fputcsv() 但必须处理 UTF-8 BOM
直接 fputcsv() 写入中文会乱码,浏览器下载后 Excel 打开显示方块。根本原因是 PHP 默认不写 BOM,而 Windows Excel 依赖 BOM 识别 UTF-8。
- 必须在
fopen('php://output', 'w')后立刻写入 BOM:fwrite($output, "\xEF\xBB\xBF"); - 表头建议固定三列:
['group', 'key', 'value'],避免翻译工具解析失败 - 遍历语言目录时,用
glob(__DIR__ . '/zh-cn/*.php')比硬编码路径更可靠 - 每个语言文件是返回数组的 PHP 脚本,需
include并捕获返回值,不能file_get_contents
导出嵌套分组语言项:递归展开 $lang 数组时别丢键路径
ThinkPHP 支持类似 'user.login.title' => '登录标题' 的点号嵌套键,但原生 include 后得到的是多维数组,直接 foreach 会漏掉层级信息。
- 写个递归函数,把
['user' => ['login' => ['title' => '登录标题']]]展开成['user.login.title' => '登录标题'] - 注意空数组跳过:
if (is_array($value) && empty($value)) continue;,否则导出会多出无意义行 - group 字段不要硬写成文件名,应取数组第一层键(如
user.php里定义return ['user' => [...]],group 就是user)
导出为 Excel(Xlsx):优先用 PhpSpreadsheet,别碰已停更的 PHPExcel
知识库提到的 PHPExcel 在 2015 年已停止维护,现在 PhpOffice\PhpSpreadsheet 是唯一靠谱选择。TP6/TP8 都兼容 Composer 自动加载。
- 安装命令必须是:
composer require phpoffice/phpspreadsheet,不是phpexcel - 设置单元格值时,
$sheet->setCellValue('A1', $text)对中文安全,但批量写入超 5000 行建议关掉自动计算:$spreadsheet->setCalculationEngine(new \PhpOffice\PhpSpreadsheet\Calculation\Calculation()); - 导出响应头里
Content-Type必须是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,写成application/vnd.ms-excel会导致 Excel 提示“文件格式损坏” - 文件名含中文时,
Content-Disposition要做 RFC5987 编码,简单起见直接用英文名,比如lang_zh-cn.xlsx
return ['a' => 'x', 'b.c' => 'y'] 和 return ['a' => ['b' => 'x']] 两种风格,导出时 group 和 key 字段就无法对齐。动手前先统一规范,比补导出逻辑重要得多。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











