Skip to content

Commit

Permalink
Internal: Fix language variable replacement script for Twig and PHP f…
Browse files Browse the repository at this point in the history
…iles - refs BT#21777
  • Loading branch information
christianbeeznest committed Jun 13, 2024
1 parent 8ff5955 commit f9601d4
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 49 deletions.
11 changes: 5 additions & 6 deletions public/main/inc/lib/fileManage.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -89,22 +89,21 @@ function getAllPhpFiles(string $base_path, bool $includeStatic = false): array
if ('.' == substr($item, 0, 1)) {
continue;
}
$special_dirs = [api_get_path(SYS_TEST_PATH), api_get_path(SYS_COURSE_PATH), api_get_path(SYS_LANG_PATH), api_get_path(SYS_ARCHIVE_PATH)];
if (in_array($base_path.$item.'/', $special_dirs)) {
$special_dirs = []; // Modify this array as needed
if (in_array($base_path . $item . '/', $special_dirs)) {
continue;
}
if (is_dir($base_path.$item)) {
$files = array_merge($files, getAllPhpFiles($base_path.$item.'/', $includeStatic));
if (is_dir($base_path . $item)) {
$files = array_merge($files, getAllPhpFiles($base_path . $item . '/', $includeStatic));
} else {
foreach ($extensionsArray as $extension) {
if (substr($item, -strlen($extension)) == $extension) {
$files[] = $base_path.$item;
$files[] = $base_path . $item;
break;
}
}
}
}
$list = null;

return $files;
}
126 changes: 83 additions & 43 deletions tests/scripts/switch_files_to_gettext.php
Original file line number Diff line number Diff line change
@@ -1,90 +1,130 @@
<?php
/* For licensing terms, see /license.txt */
/**
* Script to switch all PHP files in Chamilo to a more Gettext-like syntax.
* Script to switch all language variables in Chamilo to a more Gettext-like syntax.
*/
/**
* Includes and declarations.
*/
die('Remove the "die()" statement on line '.__LINE__.' to execute this script'.PHP_EOL);
require_once __DIR__.'/../../public/main/inc/global.inc.php';
$path = api_get_path(SYS_LANG_PATH).'english';
$path = api_get_path(SYS_PATH) . 'main/lang/english'; // Adjusted path
ini_set('memory_limit', '128M');

/**
* Main code.
*/
$terms = [];
$list = SubLanguageManager::get_lang_folder_files_list($path);

// Verify that the directory content is being read
echo "Reading language files from: $path\n";

foreach ($list as $entry) {
$file = $path.'/'.$entry;
$file = $path . '/' . $entry;
echo "Processing language file: $file\n"; // Add debug message
if (is_file($file)) {
$terms = array_merge($terms, SubLanguageManager::get_all_language_variable_in_file($file, true));
$file_terms = SubLanguageManager::get_all_language_variable_in_file($file, true);
//print_r($file_terms); // Debug: print terms loaded from the file
$terms = array_merge($terms, $file_terms);
}
}

foreach ($terms as $index => $translation) {
$terms[$index] = trim(rtrim($translation, ';'), '"');
}
// get only the array keys (the language variables defined in language files)

// Get only the array keys (the language variables defined in language files)
$defined_terms = array_flip(array_keys($terms));
echo count($defined_terms)." terms were found in language files".PHP_EOL;
echo count($defined_terms) . " terms were found in language files" . PHP_EOL;
//print_r($defined_terms); // Debug: print the terms found

// now get all terms found in all PHP files of Chamilo (this takes some
// time and memory)
// Now get all terms found in all PHP, TPL, and Twig files of Chamilo (this takes some time and memory)
$usedTerms = [];
$l = strlen(api_get_path(SYS_PATH));
$pathfile = api_get_path(SYS_PATH)."main/template/default/gamification/";
$files = getAllPhpFiles($pathfile);
$pathfile = api_get_path(SYS_PATH) . "main/template/default/gamification/my_progress.html.twig";
$files = [$pathfile]; // Process only the specific file for now
$rootLength = strlen(api_get_path(SYS_PATH));
$countFiles = 0;
$countReplaces = 0;

// Browse files
foreach ($files as $file) {
if ('vendor' === substr($file, $rootLength, 6) || 'web' === substr($file, $rootLength, 3)) {
continue;
}
//echo 'Analyzing '.$file.PHP_EOL;
$shortFile = substr($file, $l);
//echo 'Analyzing '.$shortFile.PHP_EOL;
echo "Analyzing $file" . PHP_EOL;
$lines = file($file);
$newContent = ''; // Store new file content
$fileModified = false;

// Browse lines inside file $file
foreach ($lines as $line) {
$myTerms = [];
$res = preg_match_all('/get_lang\(([\'"](\\w*)[\'"])\)/m', $line, $myTerms);
foreach ($lines as $lineIndex => $line) {
$lineModified = false;

// Regular expression for {{ 'variable'|get_lang|format() }}
$res = preg_match_all('/\{\{\s*([\'"]\w+[\'"])\s*\|\s*get_lang\s*\|\s*format\s*\((.*?)\)\s*\}\}/m', $line, $myTerms);
if ($res > 0) {
foreach ($myTerms[2] as $term) {
echo "Found term $term - ".print_r($myTerms, 1).PHP_EOL;
if ('lang' == substr($term, 0, 4)) {
$term = substr($term, 4);
echo "Match found for get_lang|format in line: $line" . PHP_EOL;
foreach ($myTerms[1] as $index => $quotedTerm) {
$term = trim($quotedTerm, '\'\"');
if (isset($terms[$term])) {
$translation = $terms[$term];
echo "Replacing $quotedTerm with '$translation'" . PHP_EOL;
$line = str_replace($quotedTerm, "'$translation'", $line);
$lineModified = true;
$countReplaces++;
} else {
echo "Term $term not found in language file" . PHP_EOL; // Debug: term not found
}
if (!empty($terms[$term])) {
}
}

// Regular expression for {{ 'variable'|get_lang }}
$res = preg_match_all('/\{\{\s*([\'"]\w+[\'"])\s*\|\s*get_lang\s*\}\}/m', $line, $myTerms);
if ($res > 0) {
echo "Match found for get_lang in line: $line" . PHP_EOL;
foreach ($myTerms[1] as $index => $quotedTerm) {
$term = trim($quotedTerm, '\'\"');
if (isset($terms[$term])) {
$translation = $terms[$term];
$quotedTerm = $myTerms[1][0];
//echo "Would do sed -i \"s#$quotedTerm#'$translation'#g\" $file here\n";
system("sed -i \"s#$quotedTerm#'$translation'#g\" $file");
echo "Replacing $quotedTerm with '$translation'" . PHP_EOL;
$line = str_replace($quotedTerm, "'$translation'", $line);
$lineModified = true;
$countReplaces++;
} else {
echo "Term $term not found in language file" . PHP_EOL; // Debug: term not found
}
}
} else {
$res = preg_match_all('/\{\{\s*([\'"](\\w*)[\'"])\s*\|get_lang\}\}/m', $line, $myTerms);
if ($res > 0) {
foreach ($myTerms[2] as $term) {
echo "Found term $term".PHP_EOL;
if ('lang' == substr($term, 0, 4)) {
$term = substr($term, 4);
}
if (!empty($terms[$term])) {
$translation = $terms[$term];
$quotedTerm = $myTerms[1][0];
//echo "Would do sed -i \"s#$quotedTerm#'$translation'#g\" $file here\n";
system("sed -i \"s#$quotedTerm#'$translation'#g\" $file");
$countReplaces++;
}
}

// Regular expression for get_lang('variable') or get_lang("variable")
$res = preg_match_all('/get_lang\(([\'"](\w+)[\'"])\)/m', $line, $myTerms);
if ($res > 0) {
echo "Match found for get_lang() in line: $line" . PHP_EOL;
foreach ($myTerms[2] as $index => $term) {
if (isset($terms[$term])) {
$translation = $terms[$term];
$quotedTerm = $myTerms[1][$index];
echo "Replacing $quotedTerm with '$translation'" . PHP_EOL;
$line = str_replace($quotedTerm, "'$translation'", $line);
$lineModified = true;
$countReplaces++;
} else {
echo "Term $term not found in language file" . PHP_EOL; // Debug: term not found
}
}
}

$newContent .= $line; // Add modified line to new content
if ($lineModified) {
$fileModified = true;
}
}

// Write the modified content back to the file if there were modifications
if ($fileModified) {
file_put_contents($file, $newContent);
}

$countFiles++;
flush();
}

echo "Done analyzing $countFiles files, with $countReplaces replacements!\n";

0 comments on commit f9601d4

Please sign in to comment.