Initial commit

This commit is contained in:
Ronald Huynen
2026-03-23 21:37:59 +01:00
commit 2547717edb
2193 changed files with 972171 additions and 0 deletions

View File

@@ -0,0 +1,157 @@
<?php
/**
* Find all translation strings in PHP and Blade files that are not in en.json
*/
echo "=== COMPREHENSIVE TRANSLATION STRING SCANNER ===\n\n";
// Load current en.json
$enFile = 'resources/lang/en.json';
$existing = json_decode(file_get_contents($enFile), true);
echo "Current en.json has " . count($existing) . " keys\n\n";
// Find all PHP and Blade files
$files = [];
$directories = ['app', 'resources/views'];
foreach ($directories as $dir) {
if (!is_dir($dir)) continue;
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir)
);
foreach ($iterator as $file) {
if ($file->isFile()) {
$ext = $file->getExtension();
if ($ext === 'php' || $ext === 'blade') {
$files[] = $file->getPathname();
}
}
}
}
echo "Scanning " . count($files) . " files (PHP + Blade)...\n\n";
// Find all translation calls
$foundStrings = [];
$patterns = [
'/__\(\s*[\'"]([^\'"]+)[\'"]\s*\)/', // __('string')
'/__\(\s*"([^"]+)"\s*\)/', // __("string")
'/trans\(\s*[\'"]([^\'"]+)[\'"]\s*\)/', // trans('string')
'/@lang\(\s*[\'"]([^\'"]+)[\'"]\s*\)/', // @lang('string')
'/\{\{\s*__\(\s*[\'"]([^\'"]+)[\'"]\s*\)\s*\}\}/', // {{ __('string') }}
'/\{\{\s*trans\(\s*[\'"]([^\'"]+)[\'"]\s*\)\s*\}\}/', // {{ trans('string') }}
];
$totalFound = 0;
foreach ($files as $file) {
$content = file_get_contents($file);
$relativePath = str_replace(getcwd() . '/', '', $file);
foreach ($patterns as $pattern) {
if (preg_match_all($pattern, $content, $matches)) {
foreach ($matches[1] as $string) {
// Skip if it's a variable or complex expression
if (strpos($string, '$') !== false) continue;
if (strpos($string, '{') !== false) continue;
if (strpos($string, '.') === 0) continue;
if (empty(trim($string))) continue;
$totalFound++;
if (!isset($foundStrings[$string])) {
$foundStrings[$string] = [
'string' => $string,
'files' => []
];
}
$foundStrings[$string]['files'][] = $relativePath;
}
}
}
}
echo "Found " . $totalFound . " translation calls\n";
echo "Found " . count($foundStrings) . " unique translation strings\n\n";
// Find missing strings
$missing = [];
foreach ($foundStrings as $string => $info) {
if (!isset($existing[$string])) {
$missing[$string] = $info;
}
}
echo "Missing from en.json: " . count($missing) . " strings\n";
echo str_repeat('=', 100) . "\n\n";
if (count($missing) > 0) {
echo "Missing translation strings:\n";
echo str_repeat('-', 100) . "\n";
// Group by first occurrence file
foreach ($missing as $string => $info) {
$firstFile = $info['files'][0];
$fileCount = count($info['files']);
$fileInfo = $fileCount > 1 ? " (used in $fileCount files)" : "";
echo sprintf("%-60s %s%s\n",
substr($string, 0, 60),
basename($firstFile),
$fileInfo
);
}
echo "\n" . str_repeat('=', 100) . "\n\n";
// Automatically add them
echo "Adding " . count($missing) . " new keys to en.json...\n";
// Add missing strings to en.json
foreach ($missing as $string => $info) {
$existing[$string] = $string; // Use the string itself as the value
}
// Sort alphabetically
ksort($existing);
// Backup first
copy($enFile, $enFile . '.backup');
// Save to file
file_put_contents(
$enFile,
json_encode($existing, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . PHP_EOL
);
echo "\n✓ Added " . count($missing) . " new keys to en.json\n";
echo "✓ Backup created: en.json.backup\n";
echo "✓ Total keys in en.json: " . count($existing) . "\n\n";
// Save detailed report
$report = "Missing translation strings found:\n\n";
foreach ($missing as $string => $info) {
$report .= "Key: $string\n";
$report .= "Used in:\n";
foreach ($info['files'] as $file) {
$report .= " - $file\n";
}
$report .= "\n";
}
file_put_contents('/tmp/missing-translations-report.txt', $report);
echo "Detailed report saved to: /tmp/missing-translations-report.txt\n\n";
echo "Next steps:\n";
echo "1. Review the new keys in en.json and edit values if needed\n";
echo "2. Run: ./translate-new-keys.sh\n";
echo "3. Clear cache: php artisan config:clear && php artisan cache:clear\n";
} else {
echo "✓ All translation strings are already in en.json!\n";
echo "\nSummary:\n";
echo " - Scanned " . count($files) . " files\n";
echo " - Found " . $totalFound . " translation calls\n";
echo " - All " . count($foundStrings) . " unique strings are in en.json\n";
}