mirror of
				https://github.com/optim-enterprises-bv/control-pane.git
				synced 2025-10-31 01:47:52 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			364 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			364 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| 
 | ||
| class Localization
 | ||
| {
 | ||
| 	private $language='en';
 | ||
| 	private $translate_arr=array();
 | ||
| 	private $realpath='';
 | ||
| 
 | ||
| 	function __construct($realpath_public)
 | ||
| 	{
 | ||
| #$_COOKIE['lang']='ru';
 | ||
| 		$this->realpath=$realpath_public;
 | ||
| 		(isset($_COOKIE['lang'])) AND $this->language=$_COOKIE['lang'];
 | ||
| 		(!array_key_exists($this->language, Config::$languages)) AND $this->language='en';
 | ||
| 		include($realpath_public.'/lang/'.$this->language.'.php');
 | ||
| 		$this->translate_arr=$lang;
 | ||
| 		
 | ||
| 		/*
 | ||
| 		$n=1;
 | ||
| 		foreach($lang as $eng=>$rus)
 | ||
| 		{
 | ||
| 			echo $n,' — ',$eng,"<br>";
 | ||
| 			$n++;
 | ||
| 		}
 | ||
| 		exit;
 | ||
| 		*/
 | ||
| 		
 | ||
| 		# Если нужно наполнить базу, то нужно убрать комментарий и запустить страницу
 | ||
| 		# с параметром /?go=go
 | ||
| 		/*
 | ||
| 		if($_GET['go']=='go')
 | ||
| 		{
 | ||
| 			#var_dump($lang);
 | ||
| 			#exit;
 | ||
| 			
 | ||
| 			$db=new Db('clonos');
 | ||
| 			if(!$db->isConnected())
 | ||
| 			{
 | ||
| 				print_r(['error'=>true,'error_message'=>'db connection lost!']);
 | ||
| 				exit;
 | ||
| 			}
 | ||
| 
 | ||
| 			foreach($lang as $eng=>$rus)
 | ||
| 			{
 | ||
| 				$dbres=$db->insert("insert into lang_en (text) values (?)",[[$eng, PDO::PARAM_STR]]);
 | ||
| 				if($dbres['error'])
 | ||
| 				{
 | ||
| 					print_r(['error'=>true,'error_message'=>$dbres['info']]);
 | ||
| 					exit;
 | ||
| 				}
 | ||
| 				
 | ||
| 				$new_id=$dbres['lastID'];
 | ||
| 				$dbres=$db->insert("insert into lang_other (en_id,text,lang) values (?,?,?)",[[$new_id],[$rus],['ru']]);
 | ||
| 				if($dbres['error'])
 | ||
| 				{
 | ||
| 					print_r(['error'=>true,'error_message'=>$dbres['info']]);
 | ||
| 					exit;
 | ||
| 				}
 | ||
| 				
 | ||
| 			}
 | ||
| 		}
 | ||
| 		echo 'all ok';
 | ||
| 		exit;
 | ||
| 		*/
 | ||
| 	}
 | ||
| 
 | ||
| 	public function get_lang()
 | ||
| 	{
 | ||
| 		return $this->language;
 | ||
| 	}
 | ||
| 	
 | ||
| 	public function get_path()
 | ||
| 	{
 | ||
| 		return $this->realpath;
 | ||
| 	}
 | ||
| 
 | ||
| 	public function translate($phrase)
 | ||
| 	{
 | ||
| 		return (isset($this->translate_arr[$phrase])) ? $this->translate_arr[$phrase] : $phrase;
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| # для отключения ссылок в меню, чтобы можно было его перевести:
 | ||
| # $('ul.menu').on('click',function(event){return false;});
 | ||
| # доделать со временем
 | ||
| class Translate
 | ||
| {
 | ||
| 	private $locale='';
 | ||
| 	private $language='';
 | ||
| 	private $realpath='';
 | ||
| 	
 | ||
| 	private $translated_file='';
 | ||
| 	/*
 | ||
| 	private $page_file_name='';
 | ||
| 	private $dialog_file_name='';
 | ||
| 	private $json_file_name='';
 | ||
| 	*/
 | ||
| 	
 | ||
| 	function __construct($locale)
 | ||
| 	{
 | ||
| 		
 | ||
| 		$this->locale=$locale;
 | ||
| 		$this->language=$this->locale->get_lang();
 | ||
| 		$this->realpath=$locale->get_path();
 | ||
| 	}
 | ||
| 	
 | ||
| 	public function translate($path,$page,$file_name)
 | ||
| 	{
 | ||
| 		$translate_cache=ClonOS::TRANSLATE_CACHE_NAME;	//'_translate.cache';
 | ||
| 		$backup_dir='back';
 | ||
| 		switch($path)
 | ||
| 		{
 | ||
| 			case 'pages':
 | ||
| 				$full_path=$this->realpath.$path.DIRECTORY_SEPARATOR.$page.DIRECTORY_SEPARATOR;
 | ||
| 				$translate_cache_path=$full_path.$translate_cache.DIRECTORY_SEPARATOR;
 | ||
| 				$backup_path=$full_path.$backup_dir.DIRECTORY_SEPARATOR;
 | ||
| 				$this->translated_file=$translate_cache_path.$this->language.'.index.php';
 | ||
| 				//echo $this->translated_file;exit;
 | ||
| 				break;
 | ||
| 			case 'dialogs':
 | ||
| 				$full_path=$this->realpath.$path.DIRECTORY_SEPARATOR;
 | ||
| 				$translate_cache_path=$full_path.$translate_cache.DIRECTORY_SEPARATOR;
 | ||
| 				$backup_path=$full_path.$backup_dir.DIRECTORY_SEPARATOR;
 | ||
| 				$this->translated_file=$translate_cache_path.$this->language.'.'.$file_name;
 | ||
| 				break;
 | ||
| 			default:
 | ||
| 				$path='system';
 | ||
| 		}
 | ||
| 		
 | ||
| 		if(!is_dir($full_path)) return;
 | ||
| 		
 | ||
| 		if(!is_dir($translate_cache_path))
 | ||
| 		{
 | ||
| 			mkdir($translate_cache_path);
 | ||
| 			$ttxt="This files is cache of translated pages, do not translate it!\n".
 | ||
| 				"If you are a translator, please read the documentation on the translation on the website.\n".
 | ||
| 				"Thank you.";
 | ||
| 			file_put_contents($translate_cache_path.'!dont.touch.files',$ttxt);
 | ||
| 		}
 | ||
| 		
 | ||
| 		$file=$full_path.$file_name;
 | ||
| 
 | ||
| 		$mtime_translate=0;
 | ||
| 		$mtime_orig=filemtime($file);
 | ||
| 		if(file_exists($this->translated_file))
 | ||
| 			$mtime_translate=filemtime($this->translated_file);
 | ||
| 		# $mtime_db_update — дата последней модификации перевода в БД
 | ||
| 		
 | ||
| 		if($mtime_orig<$mtime_translate)
 | ||
| 		{
 | ||
| 			return ['message'=>'translate from cache'];
 | ||
| 		}
 | ||
| 		
 | ||
| 		# при сохранении в БД перевода на язык пользователя, нужно удалять файл кэша
 | ||
| 		# или во временный файл сохранять даты обновления разных языков, а уже там проверять дату
 | ||
| 
 | ||
| 		$db=new Db('clonos');
 | ||
| 		if(!$db->isConnected())	return array('error'=>true,'error_message'=>'db connection lost!');
 | ||
| 
 | ||
| 		if(file_exists($file))
 | ||
| 		{
 | ||
| 			$is_changed=false;
 | ||
| 			$txt=file_get_contents($file);
 | ||
| 			preg_match_all('#<translate([^>]*)>(.*)</translate>#U',$txt,$res,PREG_SET_ORDER);
 | ||
| 			//echo '<pre>';var_dump($res);exit;
 | ||
| 			
 | ||
| 			$ids_arr=[];
 | ||
| 			
 | ||
| 			foreach($res as $item)
 | ||
| 			{
 | ||
| 				$id=-1;
 | ||
| 				//$text='';
 | ||
| 				$update=false;
 | ||
| 				$params=[];
 | ||
| 				$tag=$item[0];
 | ||
| 				$attrs=$item[1];
 | ||
| 				$text=$item[2];
 | ||
| 				
 | ||
| 				if($attrs!='')
 | ||
| 				{
 | ||
| 					// если у тэга есть ID, то проверяем текст и формируем шаблон
 | ||
| 					preg_match_all('#((id)="?([\d]+)"?|update)#',$attrs,$params,PREG_SET_ORDER);
 | ||
| 
 | ||
| 					if(is_array($params))	// && $this->language!='en'
 | ||
| 					{
 | ||
| 						// ИЗМЕНИТЬ КОММЕНТАРИЙ! --- если у пользователя язык интерфейса не английский, то переводим
 | ||
| 						// обрабатываем оригинальный текст и создаём шаблоны разных языков
 | ||
| 						foreach($params as $p)
 | ||
| 						{
 | ||
| 							if(isset($p[2]) && $p[2]=='id')
 | ||
| 							{
 | ||
| 								if(is_numeric($p[3]))
 | ||
| 								{
 | ||
| 									$id=$p[3];
 | ||
| 									$dbres=$db->selectOne("select text from lang_en where id=? and type in (?,?)",[
 | ||
| 										[$id,PDO::PARAM_INT],
 | ||
| 										[$path,PDO::PARAM_STR],
 | ||
| 										['system',PDO::PARAM_STR]
 | ||
| 									]);
 | ||
| 									//var_dump($dbres);
 | ||
| 									if(!empty($dbres))
 | ||
| 									{
 | ||
| 										if($text!=$dbres['text'])
 | ||
| 										{
 | ||
| 											// если оригинальный текст изменился, то обновляем его в базе
 | ||
| 											# временно отключил, пока наполняется основная база. Потом нужно вернуть обратно
 | ||
| 											/*
 | ||
| 											$dbres1=$db->update('update lang_en set text=? where id=? and type=?',[
 | ||
| 												[$text,PDO::PARAM_STR],
 | ||
| 												[$id,PDO::PARAM_INT],
 | ||
| 												[$path,PDO::PARAM_STR]
 | ||
| 											]);
 | ||
| 											if(isset($dbres1['rowCount']))
 | ||
| 											{
 | ||
| 												if($dbres1['rowCount']>0)
 | ||
| 												{
 | ||
| 													$is_changed=true;
 | ||
| 												}
 | ||
| 											}
 | ||
| 											*/
 | ||
| 										}
 | ||
| 										
 | ||
| 									}
 | ||
| 									$ids_arr[]=$id;
 | ||
| 								}
 | ||
| 							}
 | ||
| 							//print_r($ids_arr);exit;
 | ||
| /*							
 | ||
| 							if($p[0]=='update' && $id>0)
 | ||
| 							{
 | ||
| 								echo "\tupdate id: ",$id,"\n";
 | ||
| 							}
 | ||
| */
 | ||
| 						}
 | ||
| 						
 | ||
| 					}else{
 | ||
| 						
 | ||
| 					}
 | ||
| 					//print_r($params);
 | ||
| 				}else{
 | ||
| 					
 | ||
| 
 | ||
| /*
 | ||
| delete FROM "lang_en";
 | ||
| VACUUM;
 | ||
| UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = 'lang_en'
 | ||
| */
 | ||
| 					$dbres=$db->selectOne("select id from lang_en where text=? and type in (?,?)",[
 | ||
| 						[$text,PDO::PARAM_STR],
 | ||
| 						[$path,PDO::PARAM_STR],
 | ||
| 						['system',PDO::PARAM_STR]
 | ||
| 					]);
 | ||
| 					if(isset($dbres['error']) && $dbres['error'])
 | ||
| 					{
 | ||
| 						echo 'error db: ',$dbres['info'];
 | ||
| 						exit;
 | ||
| 					}
 | ||
| 					//echo $text;
 | ||
| 					//var_dump($dbres);
 | ||
| 					//echo '<br>';
 | ||
| 					
 | ||
| 					if(is_numeric($dbres['id']))
 | ||
| 					{
 | ||
| 						// если фраза есть в базе, то вписываем её ID в тэг
 | ||
| 						$new_text='<translate id="'.$dbres['id'].'">'.$text."</translate>";
 | ||
| 						$txt=str_replace($tag,$new_text,$txt);
 | ||
| 						$is_changed=true;
 | ||
| 					}else{
 | ||
| 						if($dbres===false)
 | ||
| 						{
 | ||
| 							// если фразы нет в базе, то добавляем её туда и вписываем новый ID в тэг
 | ||
| 							$dbres=$db->insert("insert into lang_en (text,type) values (?,?)",[[$text, PDO::PARAM_STR],[$path, PDO::PARAM_STR]]);
 | ||
| 							
 | ||
| 							if($dbres['error'])
 | ||
| 								return array('error'=>true,'error_message'=>$dbres['info']);
 | ||
| 							
 | ||
| 							$new_text='<translate id="'.$dbres['lastID'].'">'.$text."</translate>";
 | ||
| 							$txt=str_replace($tag,$new_text,$txt);
 | ||
| 							$is_changed=true;
 | ||
| 							//echo $txt;
 | ||
| 							$ids_arr[]=$dbres['lastID'];
 | ||
| 						}
 | ||
| 					}
 | ||
| 					
 | ||
| 				}
 | ||
| 			}
 | ||
| 			
 | ||
| 			// бэкапим предыдущий файл и сохраняем видоизменённый
 | ||
| 			if($is_changed)
 | ||
| 			{
 | ||
| 				if(!is_dir($backup_path))
 | ||
| 				{
 | ||
| 					mkdir($backup_path);
 | ||
| 				}
 | ||
| 
 | ||
| 				//rename($full_path.$file_name,$full_path.
 | ||
| 				//	$backup_dir.DIRECTORY_SEPARATOR.time().'.'.$file_name);
 | ||
| 				rename($full_path.$file_name,$backup_path.time().'.'.$file_name);
 | ||
| 				file_put_contents($full_path.$file_name,$txt);
 | ||
| 				#echo 'save';
 | ||
| 				#echo $txt;
 | ||
| 				#exit;
 | ||
| 			}
 | ||
| 			
 | ||
| 			// переводим на другие языки
 | ||
| 			$ids_txt=join(',',$ids_arr);
 | ||
| 			$sql="select en_id,text from lang_other where lang=? and en_id in ({$ids_txt})";
 | ||
| 			$res=$db->select($sql,[[$this->language,PDO::PARAM_STR]]);
 | ||
| //			$res=$db->select("select en_id,text from lang_other where lang=? and en_id in (?)",[[$this->language,PDO::PARAM_STR],[[$ids_arr]]]);
 | ||
| 			if(isset($res['error']) && $res['error'])
 | ||
| 			{
 | ||
| 				echo 'db error';
 | ||
| 				exit;
 | ||
| 			}
 | ||
| 			
 | ||
| 			foreach($res as $item)
 | ||
| 			{
 | ||
| 				$pat='#<translate id="'.$item['en_id'].'"[^>]*>(.*)</translate>#U';
 | ||
| 				$txtChg='<span id="trlt-'.$item['en_id'].'">'.$item['text'].'</span>';
 | ||
| 				$txt=preg_replace($pat,$txtChg,$txt);	//'<span id="trlt-'.$item['en_id'].'">'.	//.'</span>'
 | ||
| 			}
 | ||
| 			
 | ||
| 			//$txt=preg_replace('#(<translate([^>]*)>|</translate>)#','',$txt);
 | ||
| 			$txt=preg_replace('#<translate id="([\d]+)">#U','<span id="trlt-$1">',$txt);
 | ||
| 			$txt=str_replace('</translate>','</span>',$txt);
 | ||
| 			
 | ||
| 			$txt=preg_replace("#title='<span.+>([^\']+)</span>'#U","$1",$txt);
 | ||
| 			
 | ||
| 			#$txt=preg_replace("#(<option[^>]+>)<span[^>]+>(.*)</span>#U","$1$2",$txt);
 | ||
| 			$txt=preg_replace("#(<option[^>]+>)<span[^>]+>(.*)</span>(</option>)#U","$1$2$3",$txt);
 | ||
| 			
 | ||
| 			
 | ||
| 			# чистим кнопки от лишних тэгов
 | ||
| 			$txt=preg_replace('#<input type="button" value="(<span[^>]+)>(.*?)</span>"#U','<input type="button" value="$2"',$txt);
 | ||
| 			//echo $txt;
 | ||
| 			//exit;
 | ||
| 			
 | ||
| 			//$this->tanslated_file=$translate_cache_path.$this->language.'.index.php';
 | ||
| 			file_put_contents($this->translated_file,$txt);
 | ||
| 			#echo $txt;
 | ||
| 			#exit;
 | ||
| 
 | ||
| 			//var_dump($res);
 | ||
| 			//echo $ids_txt;
 | ||
| 			
 | ||
| 			
 | ||
| 			
 | ||
| 			
 | ||
| 			return ['message'=>'translated to: '.$this->language];
 | ||
| 		}else{
 | ||
| 			return ['error'=>true,'message'=>'no file...'];
 | ||
| 		}
 | ||
| 
 | ||
| 		/*
 | ||
| 			<translate([^>]*)>(.*)</translate>
 | ||
| 		*/
 | ||
| 	}
 | ||
| 	
 | ||
| 	public function get_translated_filename()
 | ||
| 	{
 | ||
| 		return $this->translated_file;
 | ||
| 	}
 | ||
| } | 
