首先创建LanguageProcessor类处理多语言文件的校验与同步逻辑,接着通过process-lang.php脚本接收命令行参数调用对应方法,然后在composer.json中定义lang-validate和lang-sync命令,并绑定到post-install-cmd和post-update-cmd事件,实现安装或更新依赖后自动校验语言文件完整性,确保多语言键一致,支持手动执行验证与同步操作,可用于CI/CD流程自动化管理。

编写一个 Composer 脚本来处理多语言文件,核心是利用 Composer 的 scripts 功能,在项目生命周期的特定阶段自动执行自定义 PHP 脚本,完成语言文件的合并、校验或导出等操作。下面是一个实用的实现方案。
1. 定义脚本逻辑(创建处理类)
首先创建一个 PHP 类来处理多语言文件,比如从不同语言目录中读取 JSON 文件并进行一致性检查或合并。
// scripts/LanguageProcessor.php
<?php
class LanguageProcessor
{
private $langDir;
public function __construct($langDir = 'lang')
{
$this->langDir = $langDir;
}
// 检查所有语言文件是否包含相同的键
public function validate()
{
if (!is_dir($this->langDir)) {
echo "语言目录不存在:{$this->langDir}\n";
return false;
}
$files = glob("{$this->langDir}/*.json");
if (empty($files)) {
echo "未找到语言文件。\n";
return false;
}
$base = json_decode(file_get_contents($files[0]), true);
$baseKeys = array_keys($base);
foreach ($files as $file) {
$lang = basename($file, '.json');
$data = json_decode(file_get_contents($file), true);
$missing = array_diff($baseKeys, array_keys($data));
if (!empty($missing)) {
echo "【{$lang}】缺少键: " . implode(', ', $missing) . "\n";
}
}
echo "验证完成。\n";
return true;
}
// 合并新增键到所有语言文件(可扩展)
public function sync()
{
// 实现同步逻辑:提取所有键,填充空值到其他语言
echo "正在同步语言文件...\n";
// 此处可添加合并策略
}
}
2. 创建脚本入口文件
创建一个简单的入口脚本,供 Composer 调用。
// scripts/process-lang.php
<?php
require_once __DIR__ . '/LanguageProcessor.php';
$processor = new LanguageProcessor('lang');
$action = $argv[1] ?? 'validate';
if ($action === 'sync') {
$processor->sync();
} else {
$processor->validate();
}
3. 配置 composer.json 的 scripts
在 composer.json 中注册脚本命令。
{
"scripts": {
"lang-validate": "php scripts/process-lang.php validate",
"lang-sync": "php scripts/process-lang.php sync",
"post-install-cmd": [
"@lang-validate"
],
"post-update-cmd": [
"@lang-validate"
]
}
}
这样每次执行 composer install 或 composer update 后,都会自动校验语言文件完整性。
4. 使用方式
手动运行脚本:
- composer lang-validate:校验语言键是否一致
- composer lang-sync:同步新增翻译键(需实现逻辑)
你也可以把脚本绑定到 CI/CD 流程中,确保多语言内容不会遗漏。
基本上就这些。关键是把语言处理逻辑封装好,再通过 Composer 脚本触发,实现自动化管理。不复杂但容易忽略的是路径和错误处理,建议加上日志或返回非零退出码用于 CI 判断。










