<?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
*/

class Lang_Generic
{
	protected static $default='ru';
	protected static $current=null;
	protected static $plural=null;
	
	protected static $translate=array();
	private static $cacher=null;
	
	public static function init($lang)
	{
		self::$current=$lang;
		self::_getFromCache();
		if (!count(self::$translate)) {
			$strings=Db::i()->select(
				"SELECT lang, `key` AS ARRAY_KEY, `value`, context
				FROM ?_i18n
				WHERE lang IN (?, ?)
				ORDER BY FIELD(lang, ?, ?)",
				self::$default, self::$current,
				self::$default, self::$current
			);
			foreach ($strings as $key=>$data) {
				if (
					!isset(self::$translate[$key])
					|| !is_array(self::$translate[$key])
					|| !array_key_exists($data['context'], self::$translate[$key])
					|| $data['value']
				) self::$translate[$key][$data['context']]=$data['value'];
			}
			self::_putToCache();
		}
		$class='Lang_'.self::$current;
		if (! class_exists($class)) $class='Lang_ru';
		self::$plural=new $class();
	}
	
	/*
	* проверяет существует ли локализованная версия запрошенной фразы и возвращает ее
	* если нет, то возвращает сам ключ в качестве результата
	* @param string	фраза для перевода
	* @param integer	значение для числительного (пока не реализовано)
	* @return string	локализованная версия, либо ключ
	* @author Loki
	*/
	public static function gettext($key, $context=null)
	{
		$key=trim($key);
		$context=trim($context);
		if(!$key) return false;
		if (array_key_exists($key, self::$translate)
			&& array_key_exists(self::_getContext($context), self::$translate[$key])) {
			if (self::$translate[$key][self::_getContext($context)]) return self::$translate[$key][self::_getContext($context)];
		} else {
			self::_addStringToLang($key, $context);
		}
		return $key;
	}
	
	public static function ngettext($form0, $form1, $form2, $n, $context=null)
	{
		$form=self::$plural->getNum($n);
		return self::gettext(${'form'.$form}, self::_getContext($context));
	}
	
	private static function _addStringToLang($key, $context=null)
	{
		Db::i()->query(
			"INSERT IGNORE INTO ?_i18n (lang, `key`, context)
			VALUES(?, ?, ?)", self::$default, $key, self::_getContext($context)
		);
		//TODO временно для отслеживания строк
		Db::i()->query(
			"INSERT IGNORE INTO ?_i18n (lang, `key`, value, context)
			VALUES(?, ?, ?, ?)", 'ru_tr', $key, translit($key), self::_getContext($context)
		);
		self::$translate[$key][self::_getContext($context)]='';
		self::_putToCache();
	}
	
	public static function updateString($lang, $key, $value, $context=null)
	{
		Db::i()->query(
			"INSERT INTO ?_i18n (`lang`, `key`, `value`, context)
			VALUES(?, ?, ?, ?) ON DUPLICATE KEY
			UPDATE `value`=?", $lang, $key, $value,
			self::_getContext($context), $value
		);
	}
	
	public static function deleteString($lang, $key, $context=null)
	{
		Db::i()->query("DELETE FROM ?_i18n WHERE `lang`=? AND `key`=?", $lang, $key);
	}
	
	private static function _getContext($context)
	{
		if ($context) return $context;
		return 'none';
	}
	
	private static function _putToCache()
	{
		if (!config::get('core.cache')) return false;
		self::_getCacher()->set('lang_'.self::$current, serialize(self::$translate), -1);
	}
	
	private static function _getFromCache()
	{
		if (!config::get('core.cache')) return false;
		if ($data=self::_getCacher()->get('lang_'.self::$current))
			self::$translate=unserialize($data);
	}
	
	public static function getLang($lang)
	{
		$result=array();
		$data=Db::i()->select("SELECT `key`, `value`, context FROM ?_i18n WHERE lang=?", $lang);
		if ($data) foreach ($data as $item) {
			$result[$item['key']][$item['context']]=$item['value'];
		}
		return $result;
	}
	
	public static function getDefaultLang()
	{
		return self::getLang(self::$default);
	}
	
	private static function _getCacher()
	{
		if (!self::$cacher)
			self::$cacher=Cache_Generic::init();
		return self::$cacher;
		
	}
}