检测 laravel 多语言完整性需四步:一、比对各语言包键名与英文基准的差集;二、检查 requiredfiles 中文件在各 locale 目录下是否存在;三、验证嵌套键路径(如 validation.custom.email.required)可被正确解析;四、通过静态分析识别代码中调用但未定义的翻译键。

如果您在 Laravel 应用中启用多语言支持,但部分界面仍显示原始翻译键(如 welcome.message),则可能是某语言包中缺失对应键值。以下是检测语言文件完整性的具体方法:
一、比对各语言包键名一致性
该方法通过提取所有已注册 locale 的语言文件键列表,并以英文(en)为基准进行差集比对,识别出其他语言中缺失的翻译项。
1、在 tests/Unit/LanguageIntegrityTest.php 中创建测试类,继承 TestCase。
2、从配置中获取全部支持语言: $locales = config('app.locales', ['en', 'zh_CN', 'ja']);。
3、加载英文 validation.php 文件并提取全部键: $enKeys = array_keys(Lang::getLoader()->load('en', 'validation', 'validation'));。
4、遍历其余 locale,对每个语言重复执行加载与键提取操作,并计算与 $enKeys 的差集: $missing = array_diff($enKeys, $otherKeys);。
5、断言差集为空;若非空,则使用 $this->assertEmpty($missing, "缺失键:".implode(', ', $missing)."(在 {$locale} 中)"); 报告问题。
二、扫描全部语言文件目录结构
该方法检查指定语言目录下是否存在预期的语言文件(如 validation.php、pagination.php、auth.php 等),避免因文件未创建导致运行时回退到键名本身。
1、定义标准语言文件清单: $requiredFiles = ['validation', 'pagination', 'auth', 'passwords', 'notifications'];。
2、遍历每个 locale 目录路径:resources/lang/{$locale}/。
3、对每个 $file,构造完整路径:$path = resource_path("lang/{$locale}/{$file}.php");。
4、使用 file_exists($path) 判断文件是否存在;若不存在,抛出失败断言:$this->assertTrue(file_exists($path), "{$locale}/{$file}.php 未找到");。
三、验证嵌套数组键路径可达性
该方法针对包含多层嵌套结构的语言文件(如 validation.nested.rule),确保深层键可被 __() 函数正常解析,防止因键路径断裂返回原始字符串。
1、选取一个含嵌套结构的文件(例如 resources/lang/en/validation.php),确认其含类似 'custom' => ['email' => ['required' => '邮箱必填']] 的结构。
2、在测试中调用:$value = __('validation.custom.email.required', [], 'en');。
3、断言返回值不等于原始键名:$this->assertNotEquals('validation.custom.email.required', $value);。
4、对同一键路径切换 locale(如 zh_CN),再次调用并断言返回中文内容:$this->assertEquals('邮箱必填', __('validation.custom.email.required', [], 'zh_CN'));。
四、静态分析未引用翻译键冗余性
该方法通过正则扫描全部 PHP 和 Blade 模板文件,收集所有被 __()、trans() 或 @lang 调用的翻译键,再反向检查这些键是否在各语言文件中真实存在,识别冗余或拼写错误的键。
1、使用 shell 命令提取全部调用键:grep -r -o "__('[^']*')" app/ resources/views/ | sed "s/__('\([^']*\)')/\1/g" | sort -u > keys_used.txt。
2、编写辅助脚本读取 keys_used.txt,逐行尝试调用:__('key.from.list', [], 'en')。
3、捕获 InvalidArgumentException 异常,记录未定义键:if ($e instanceof InvalidArgumentException) { $unused[] = $key; }。
4、输出所有未定义键列表,并断言其为空:$this->assertEmpty($unused, "以下键未在语言文件中定义:".implode(', ', $unused));。











