<?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']);
$lang='ru';

$lt=new translator($lang, config::get('core.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));
		} else {
			if (!is_writable($this->lang_dir)) {
				if (!chmod($this->lang_dir, 0777)) {
					LabCMS::i()->error(
						sprintf(
							_m("Директория %s не доступна для записи"),
							$this->lang_dir
						)
					);
				}
			}
		}
		*/
	}
	
	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->insertLangStrings($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->insertLangStrings($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));
		}
		$all_strings = array_unique($all_strings);
		sort($all_strings);
		return $all_strings;
	}
	
	function get_php($file)
	{
		$text=file_get_contents($file);
		preg_match_all('/\->_\((["|\'])(.+)\\1[\)|,]/Uuis', $text, $strings);
		preg_match_all('/\_m\((["|\'])(.+)\\1[\)|,]/Uuis', $text, $strings2);
		$strings+=$strings2;
		//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 insertLangStrings($strings)
	{
		foreach ($strings as $string) {
			Db::i()->query("INSERT IGNORE INTO ?_i18n (lang, `key`) VALUES(?, ?)", $this->lang, $string);
			//TODO добавлять строки надо через Lang_Generic
			//TODO отладочная заглушка, добавляющая записи в язык "транслит"
			/*Db::i()->query(
				"INSERT IGNORE INTO ?_i18n (lang, `key`, value) VALUES(?, ?, ?)",
				'ru_tr', $string, translit($string)
			);*/
		}
		return true;
	}
	
	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);
	}
}