translationKeysUsedInCode(); $this->assertNotEmpty($keys); foreach (array_keys(config('app.available_locales')) as $locale) { if ($locale === 'en') { continue; } $translations = json_decode(File::get(lang_path("{$locale}.json")), true, flags: JSON_THROW_ON_ERROR); $missing = array_values(array_diff($keys, array_keys($translations))); $this->assertSame([], $missing, "Fehlende Übersetzungen in lang/{$locale}.json"); } } public function test_project_translations_are_applied(): void { foreach (File::glob(lang_path('project/*.json')) as $projectFile) { $locale = pathinfo($projectFile, PATHINFO_FILENAME); $project = json_decode(File::get($projectFile), true, flags: JSON_THROW_ON_ERROR); $translations = json_decode(File::get(lang_path("{$locale}.json")), true, flags: JSON_THROW_ON_ERROR); $notApplied = array_keys(array_diff_assoc($project, array_intersect_key($translations, $project))); $this->assertSame([], $notApplied, "lang/project/{$locale}.json nicht übernommen – `sail artisan lang:apply-project` ausführen"); } } /** * @return list */ private function translationKeysUsedInCode(): array { $patterns = [ '/__\(\s*\'((?:[^\'\\\\]|\\\\.)*)\'/', '/__\(\s*"((?:[^"\\\\]|\\\\.)*)"/', '/#\[Title\(\s*\'((?:[^\'\\\\]|\\\\.)*)\'/', ]; $keys = []; foreach ([resource_path('views'), app_path()] as $directory) { foreach (File::allFiles($directory) as $file) { if ($file->getExtension() !== 'php') { continue; } foreach ($patterns as $pattern) { preg_match_all($pattern, $file->getContents(), $matches); foreach ($matches[1] as $key) { $keys[] = stripslashes($key); } } } } return array_values(array_unique($keys)); } }