<?php
/*
* @package LabCMS
* @copyright (c) 2006 Alexander Levin aka Loki (loki_angel@mail.ru)
* @support http://labcms.ru
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/
	$mod_template="collect.tpl";
	$lang=Db::i()->selectCell("SELECT `key` FROM ?_langs WHERE lang_id=?", $_GET['var1']);

	$lt=new translator($lang, LabConfig::$cfg['skin']);
	if (LabCMS::i()->no_errors)
	{
		$lt->collect();
	}
	
	class translator
	{
		function __construct($lang, $skin)
		{
			$this->lang=$lang;
			$this->mod_dir=LAB_PATH_MODULES;
			$this->tpl_dir=LAB_PATH_TEMPLATE;
			$this->lang_dir=LAB_PATH_KERNEL.'/languages/'.$this->lang;
			$this->skins=glob($this->tpl_dir.'/*', GLOB_ONLYDIR);;
			
			if (!file_exists($this->lang_dir))
			{
				if (!mkdir($this->lang_dir)) LabCMS::i()->error(sprintf(_m("Не могу создать директорию %s"), $this->lang_dir), true);
			}
			else
			{
				if (!is_writable)
				{
					if (!chmod($this->lang_dir, 0777)) LabCMS::i()->error(sprintf(_m("Директория %s не доступна для записи"), $this->lang_dir), true);
				}
			}
		}
		
		function collect()
		{
			$this->collect_core();
			$this->collect_modules();
		}
		
		function collect_core()
		{
			$this->translate=$lang=array();
			$filename=$this->lang_dir.'/lang.core.php';
			if (file_exists($filename)) include $filename;
			$this->translate=array_merge($this->translate, $lang);
			
			$core_dirs=array('/classes', '', '/functions');
			$files=array();
			foreach($core_dirs as $dir)
			{
				$files=array_merge($files, glob(LAB_PATH_KERNEL.$dir.'/*.php'));
			}
			
			$templates=array();
			foreach($this->skins as $skin)
			{
				$templates=array_merge($templates, glob($skin.'/*.tpl'));
			}
			
			$all_strings=$this->get_strings($files, $templates);
			$is_ok=true;
			if (count($all_strings))
			{
				$is_ok=$this->make_lang_file($all_strings, $this->lang_dir.'/lang.core.php');
			}
			if ($is_ok) Tpl::i()->append('result', 'Обработка ядра закончена. Обработано строк: '.count($all_strings));
			
		}
		
		function collect_modules()
		{
			$modules=glob($this->mod_dir.'/*', GLOB_ONLYDIR);
			foreach($modules as $module)
			{
				$module=basename($module);
				$this->translate=$lang=array();
				$filename=$this->lang_dir.'/lang.'.$module.'.php';
				if (file_exists($filename)) include $filename;
				$this->translate=array_merge($this->translate, $lang);
				$files=glob($this->mod_dir.'/'.$module.'/*.php');
				$templates=array();
				foreach($this->skins as $skin)
				{
					$tpl=glob($skin.'/'.$module.'/*.tpl');
					if (!is_array($tpl)) continue;
					$templates=array_merge($templates, $tpl);
				}

				$all_strings=$this->get_strings($files, $templates);
				$is_ok=true;
				if (count($all_strings))
				{
					$is_ok=$this->make_lang_file($all_strings, $this->lang_dir.'/lang.'.$module.'.php');
				}
				if($is_ok) Tpl::i()->append('result', 'Модуль '.$module.'. Обработано строк: '.count($all_strings));
			}
		}
		
		function get_strings($files=false, $templates=false)
		{
			$all_strings=array();
			if ($files)
			foreach($files as $file)
			{
				$all_strings=array_merge($all_strings, $this->get_php($file));
			}
			if($templates)
			foreach($templates as $tpl)
			{
				$all_strings=array_merge($all_strings, $this->get_tpl($tpl));
			}
			sort($all_strings=array_unique($all_strings));
			return $all_strings;
		}
		
		function get_php($file)
		{
			$text=file_get_contents($file);
			preg_match_all('/\->_\((["|\'])(.+)\\1[\)|,]/Uuis', $text, $strings);
			//preg_match_all('/(?:\$this|\$_lc)\->_\((["|\'])(.+)\\1\)/Uuis', $text, $strings);
			return $strings[2];
		}
		
		function get_tpl($tpl)
		{
			$text=file_get_contents($tpl);
			preg_match_all('/\{t\}(.+)\{\/t\}/Uuis', $text, $strings);
			return $strings[1];
		}
		
		function make_lang_file($all_strings, $filename)
		{
			$data='<?'."\r\n";
			foreach($all_strings as $string)
			{
				$data.='$lang[\''.str_replace("'", "\'", mb_strtolower($string)).'\']="'.($this->translate[mb_strtolower($string)]?str_replace('"', '\"', $this->translate[mb_strtolower($string)]):'').'";'."\r\n";
			}
			if (!is_writable($filename))
			{
				LabCMS::i()->error(_m("Недоступен для записи файл: ")."$filename");
				return false;
			}
			else return file_put_contents($filename, $data);
		}
	}