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,"
";
$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('#
';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 '
';
if(is_numeric($dbres['id']))
{
// если фраза есть в базе, то вписываем её ID в тэг
$new_text=''.$text." ";
$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=''.$text." ";
$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='#]*>(.*) #U';
$txtChg=''.$item['text'].'';
$txt=preg_replace($pat,$txtChg,$txt); //''. //.''
}
//$txt=preg_replace('#(]*)>| )#','',$txt);
$txt=preg_replace('##U','',$txt);
$txt=str_replace(' ','',$txt);
$txt=preg_replace("#title='([^\']+)'#U","$1",$txt);
#$txt=preg_replace("#()#U","$1$2$3",$txt);
# чистим кнопки от лишних тэгов
$txt=preg_replace('#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...'];
}
/*
]*)>(.*)
*/
}
public function get_translated_filename()
{
return $this->translated_file;
}
}