forked from CIT/Vmeda.Online
		
	
		
			
				
	
	
		
			288 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			288 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| // This file is part of Moodle - http://moodle.org/
 | |
| //
 | |
| // Moodle is free software: you can redistribute it and/or modify
 | |
| // it under the terms of the GNU General Public License as published by
 | |
| // the Free Software Foundation, either version 3 of the License, or
 | |
| // (at your option) any later version.
 | |
| //
 | |
| // Moodle is distributed in the hope that it will be useful,
 | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| // GNU General Public License for more details.
 | |
| //
 | |
| // You should have received a copy of the GNU General Public License
 | |
| // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
| /**
 | |
|  * Script for converting moodle strings to json.
 | |
|  */
 | |
| 
 | |
| // Check we are in CLI.
 | |
| if (isset($_SERVER['REMOTE_ADDR'])) {
 | |
|     exit(1);
 | |
| }
 | |
| define('MOODLE_INTERNAL', 1);
 | |
| define('LANGPACKSFOLDER', '../../moodle-langpacks');
 | |
| define('ASSETSPATH', '../src/assets/lang/');
 | |
| define('CONFIG', '../src/config.json');
 | |
| 
 | |
| $config = file_get_contents(CONFIG);
 | |
| $config = (array) json_decode($config);
 | |
| $config_langs = array_keys(get_object_vars($config['languages']));
 | |
| 
 | |
| // Set languages to do. If script is called using a language it will be used as unique.
 | |
| if (isset($argv[1]) && !empty($argv[1])) {
 | |
|     $forcedetect = false;
 | |
|     $languages = explode(',', $argv[1]);
 | |
| } else {
 | |
|     $forcedetect = true;
 | |
|     $languages = $config_langs;
 | |
| }
 | |
| 
 | |
| // Process the index file, just once.
 | |
| $keys = file_get_contents('langindex.json');
 | |
| $keys = (array) json_decode($keys);
 | |
| 
 | |
| foreach ($keys as $key => $value) {
 | |
|     $map = new StdClass();
 | |
|     if ($value == 'local_moodlemobileapp') {
 | |
|         $map->file = $value;
 | |
|         $map->string = $key;
 | |
|         $exp = explode('.', $key, 3);
 | |
| 
 | |
|         $type = $exp[0];
 | |
|         if (count($exp) == 3) {
 | |
|             $component = $exp[1];
 | |
|             $plainid = $exp[2];
 | |
|         } else {
 | |
|             $component = 'moodle';
 | |
|             $plainid = $exp[1];
 | |
|         }
 | |
| 
 | |
|         switch($type) {
 | |
|             case 'addon':
 | |
|                 $map->string_local = "mma.$component.$plainid";
 | |
|                 break;
 | |
|             case 'core':
 | |
|                 if ($component == 'moodle') {
 | |
|                     $map->string_local = "mm.core.$plainid";
 | |
|                 } else if ($component == 'mainmenu') {
 | |
|                     $map->string_local = "mm.sidemenu.$plainid";
 | |
|                 } else {
 | |
|                     $map->string_local = "mm.$component.$plainid";
 | |
|                 }
 | |
|                 break;
 | |
|         }
 | |
|     } else {
 | |
|         $exp = explode('/', $value, 2);
 | |
|         $map->file = $exp[0];
 | |
|         if (count($exp) == 2) {
 | |
|             $map->string = $exp[1];
 | |
|         } else {
 | |
|             $exp = explode('.', $key, 3);
 | |
| 
 | |
|             if (count($exp) == 3) {
 | |
|                 $map->string = $exp[2];
 | |
|             } else {
 | |
|                 $map->string = $exp[1];
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     $keys[$key] = $map;
 | |
| }
 | |
| $total = count ($keys);
 | |
| 
 | |
| echo "Total strings to translate $total\n";
 | |
| 
 | |
| $add_langs = array();
 | |
| // Process the languages.
 | |
| foreach ($languages as $lang) {
 | |
|     $ok = build_lang($lang, $keys, $total);
 | |
|     if ($ok) {
 | |
|         $add_langs[$lang] = $lang;
 | |
|     }
 | |
| }
 | |
| 
 | |
| if ($forcedetect) {
 | |
|     echo "\n\n\n";
 | |
| 
 | |
|     $all_languages = glob(LANGPACKSFOLDER.'/*' , GLOB_ONLYDIR);
 | |
|     function get_lang_from_dir($dir) {
 | |
|         return str_replace('_', '-', explode('/', $dir)[3]);
 | |
|     }
 | |
|     $all_languages = array_map('get_lang_from_dir', $all_languages);
 | |
|     $detect_lang = array_diff($all_languages, $languages);
 | |
|     $new_langs = array();
 | |
|     foreach ($detect_lang as $lang) {
 | |
|         $new = detect_lang($lang, $keys, $total);
 | |
|         if ($new) {
 | |
|             $new_langs[$lang] = $lang;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (!empty($new_langs)) {
 | |
|         echo "\n\n\nThe following languages are going to be added\n\n\n";
 | |
|         foreach ($new_langs as $lang) {
 | |
|             $ok = build_lang($lang, $keys, $total);
 | |
|             if ($ok) {
 | |
|                 $add_langs[$lang] = $lang;
 | |
|             }
 | |
|         }
 | |
|         add_langs_to_config($add_langs, $config);
 | |
|     }
 | |
| } else {
 | |
|     add_langs_to_config($add_langs, $config);
 | |
| }
 | |
| 
 | |
| function add_langs_to_config($langs, $config) {
 | |
|     $changed = false;
 | |
|     $config_langs = get_object_vars($config['languages']);
 | |
|     foreach ($langs as $lang) {
 | |
|         if (!isset($config_langs[$lang])) {
 | |
|             $langfoldername = str_replace('-', '_', $lang);
 | |
| 
 | |
|             $string = [];
 | |
|             include(LANGPACKSFOLDER.'/'.$langfoldername.'/langconfig.php');
 | |
|             $config['languages']->$lang = $string['thislanguage'];
 | |
|             $changed = true;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if ($changed) {
 | |
|         $config['languages'] = json_decode( json_encode( $config['languages'] ), true );
 | |
|         ksort($config['languages']);
 | |
|         $config['languages'] = json_decode( json_encode( $config['languages'] ), false );
 | |
|         file_put_contents(CONFIG, json_encode($config, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
 | |
|     }
 | |
| }
 | |
| 
 | |
| function build_lang($lang, $keys, $total) {
 | |
|     $local = 0;
 | |
|     $translations = [];
 | |
|     $langfoldername = str_replace('-', '_', $lang);
 | |
| 
 | |
|     if (!is_dir(LANGPACKSFOLDER.'/'.$langfoldername) || !is_file(LANGPACKSFOLDER.'/'.$langfoldername.'/langconfig.php')) {
 | |
|         echo "Cannot translate $langfoldername, folder not found";
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     $string = [];
 | |
|     include(LANGPACKSFOLDER.'/'.$langfoldername.'/langconfig.php');
 | |
|     $parent = isset($string['parentlanguage']) ? $string['parentlanguage'] : "";
 | |
| 
 | |
|     echo "Processing $lang";
 | |
|     if ($parent != "" && $parent != $lang) {
 | |
|         echo "($parent)";
 | |
|     }
 | |
| 
 | |
| 
 | |
|     // Add the translation to the array.
 | |
|     foreach ($keys as $key => $value) {
 | |
|         $file = LANGPACKSFOLDER.'/'.$langfoldername.'/'.$value->file.'.php';
 | |
|         // Apply translations.
 | |
|         if (!file_exists($file)) {
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         $string = [];
 | |
|         include($file);
 | |
| 
 | |
|         if (!isset($string[$value->string])) {
 | |
|             if ($value->file != 'local_moodlemobileapp' || !isset($string[$value->string_local])) {
 | |
|                 continue;
 | |
|             }
 | |
|             $text = $string[$value->string_local];
 | |
|         } else {
 | |
|             $text = $string[$value->string];
 | |
|         }
 | |
| 
 | |
|         if ($value->file != 'local_moodlemobileapp') {
 | |
|             $text = str_replace('$a->', '$a.', $text);
 | |
|             $text = str_replace('{$a', '{{$a', $text);
 | |
|             $text = str_replace('}', '}}', $text);
 | |
|             // Prevent double.
 | |
|             $text = str_replace(array('{{{', '}}}'), array('{{', '}}'), $text);
 | |
|         } else {
 | |
|             $local++;
 | |
|         }
 | |
| 
 | |
|         $translations[$key] = $text;
 | |
|     }
 | |
| 
 | |
|     // Sort and save.
 | |
|     ksort($translations);
 | |
|     file_put_contents(ASSETSPATH.$lang.'.json', str_replace('\/', '/', json_encode($translations, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)));
 | |
| 
 | |
|     $success = count($translations);
 | |
|     $percentage = floor($success/$total *100);
 | |
|     echo "\t\t$success of $total -> $percentage% ($local local)\n";
 | |
| 
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| function detect_lang($lang, $keys, $total) {
 | |
|     $success = 0;
 | |
|     $local = 0;
 | |
|     $langfoldername = str_replace('-', '_', $lang);
 | |
| 
 | |
|     if (!is_dir(LANGPACKSFOLDER.'/'.$langfoldername) || !is_file(LANGPACKSFOLDER.'/'.$langfoldername.'/langconfig.php')) {
 | |
|         echo "Cannot translate $langfoldername, folder not found";
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     $string = [];
 | |
|     include(LANGPACKSFOLDER.'/'.$langfoldername.'/langconfig.php');
 | |
|     $parent = isset($string['parentlanguage']) ? $string['parentlanguage'] : "";
 | |
|     if (!isset($string['thislanguage'])) {
 | |
|         echo "Cannot translate $langfoldername, name not found";
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     echo "Checking $lang";
 | |
|     if ($parent != "" && $parent != $lang) {
 | |
|         echo "($parent)";
 | |
|     }
 | |
|     $langname = $string['thislanguage'];
 | |
|     echo " ".$langname." -D";
 | |
| 
 | |
|     // Add the translation to the array.
 | |
|     foreach ($keys as $key => $value) {
 | |
|         $file = LANGPACKSFOLDER.'/'.$langfoldername.'/'.$value->file.'.php';
 | |
|         // Apply translations.
 | |
|         if (!file_exists($file)) {
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         $string = [];
 | |
|         include($file);
 | |
| 
 | |
|         if (!isset($string[$value->string])) {
 | |
|             if ($value->file != 'local_moodlemobileapp' || !isset($string[$value->string_local])) {
 | |
|                 continue;
 | |
|             }
 | |
|             $text = $string[$value->string_local];
 | |
|         } else {
 | |
|             $text = $string[$value->string];
 | |
|         }
 | |
| 
 | |
|         if ($value->file == 'local_moodlemobileapp') {
 | |
|             $local++;
 | |
|         }
 | |
| 
 | |
|         $success++;
 | |
|     }
 | |
| 
 | |
|     $percentage = floor($success/$total *100);
 | |
|     echo "\t\t$success of $total -> $percentage% ($local local)";
 | |
|     if (($percentage > 75 && $local > 50) || ($percentage > 50 && $local > 75)) {
 | |
|         echo " \t DETECTED\n";
 | |
|         return true;
 | |
|     }
 | |
|     echo "\n";
 | |
| 
 | |
|     return false;
 | |
| }
 | |
| 
 |