<?php
// translator ready
// addnews ready
// mail ready

function translator_setup(){
	//Determine what language to use
	if (defined("TRANSLATOR_IS_SET_UP")) return;
	define("TRANSLATOR_IS_SET_UP",true);

	global $language, $session;
	$language = "";
	if (isset($session['user']['prefs']['language'])) {
		$language = $session['user']['prefs']['language'];
	}elseif(isset($_COOKIE['language'])){
		$language = $_COOKIE['language'];
	}
	if ($language=="") {
		$language=getsetting("defaultlanguage","en");
	}

	define("LANGUAGE",preg_replace("/[^a-z]/i","",$language));
}

$translation_table = array();
function translate($indata,$namespace=FALSE){
	if (getsetting("enabletranslation", true) == false) return $indata;
	global $session,$translation_table,$translation_namespace;
	if (!$namespace) $namespace=$translation_namespace;
	$outdata = $indata;
	if (!isset($namespace) || $namespace=="")
		tlschema();

	$foundtranslation = false;
	if ($namespace != "notranslate") {
		if (!isset($translation_table[$namespace]) ||
				!is_array($translation_table[$namespace])){
			//build translation table for this page hit.
			$translation_table[$namespace] =
				translate_loadnamespace($namespace,(isset($session['tlanguage'])?$session['tlanguage']:false));
		}
	}

	if (is_array($indata)){
		//recursive translation on arrays.
		$outdata = array();
		while (list($key,$val)=each($indata)){
			$outdata[$key] = translate($val,$namespace);
		}
	}else{
		if ($namespace != "notranslate") {
			if (isset($translation_table[$namespace][$indata])) {
				$outdata = $translation_table[$namespace][$indata];
				$foundtranslation = true;
				// Remove this from the untranslated texts table if it is
				// in there and we are collecting texts
				// This delete is horrible on very heavily translated games.
				// It has been requested to be removed.
				/*
				if (getsetting("collecttexts", false)) {
					$sql = "DELETE FROM " . db_prefix("untranslated") .
						" WHERE intext='" . addslashes($indata) .
						"' AND language='" . LANGUAGE . "'";
					db_query($sql);
				}
				*/
			} elseif (getsetting("collecttexts", false)) {
				$sql = "INSERT IGNORE INTO " .  db_prefix("untranslated") .  " (intext,language,namespace) VALUES ('" .  addslashes($indata) . "', '" . LANGUAGE . "', " .  "'$namespace')";
				db_query($sql,false);
			}
			tlbutton_push($indata,!$foundtranslation,$namespace);
		} else {
			$outdata = $indata;
		}
	}
	return $outdata;
}

function sprintf_translate(){
	$args = func_get_args();
	$setschema = false;
	// Handle if an array is passed in as the first arg
	if (is_array($args[0])) {
		$args[0] = call_user_func_array("sprintf_translate", $args[0]);
	} else {
		// array_shift returns the first element of an array and shortens this array by one...
		if (is_bool($args[0]) && array_shift($args)) {
			tlschema(array_shift($args));
			$setschema = true;
		}
		$args[0] = str_replace("`%","`%%",$args[0]);
		$args[0] = translate($args[0]);
		if ($setschema) {
			tlschema();
		}
 	}
	reset($args);
	each($args);//skip the first entry which is the output text
	while (list($key,$val)=each($args)){
		if (is_array($val)){
			//When passed a sub-array this represents an independant
			//translation to happen then be inserted in the master string.
			$args[$key]=call_user_func_array("sprintf_translate",$val);
		}
	}
	ob_start();
	$return = call_user_func_array("sprintf",$args);
	$err = ob_get_contents();
	ob_end_clean();
	if ($err > ""){
		$args['error'] = $err;
		debug($err);
	}
	return $return;
}

function translate_inline($in,$namespace=FALSE){
	$out = translate($in,$namespace);
	rawoutput(tlbutton_clear());
	return $out;
}

function translate_mail($in,$to=0){
	global $session;
	tlschema("mail"); // should be same schema like systemmails!
	if (!is_array($in)) $in=array($in);
	//this is done by sprintf_translate.
	//$in[0] = str_replace("`%","`%%",$in[0]);
	if ($to>0){
		$language = db_fetch_assoc(db_query("SELECT prefs FROM ".db_prefix("accounts")." WHERE acctid=$to"));
		$language['prefs'] = unserialize($language['prefs']);
		$session['tlanguage'] = $language['prefs']['language']?$language['prefs']['language']:getsetting("defaultlanguage","en");
	}
	reset($in);
	// translation offered within translation tool here is in language
	// of sender!
	// translation of mails can't be done in language of recipient by
	// the sender via translation tool.

	$out = call_user_func_array("sprintf_translate", $in);

	tlschema();
	unset($session['tlanguage']);
	return $out;
}

function tl($in){
	$out = translate($in);
	return tlbutton_clear().$out;
}

function translate_loadnamespace($namespace,$language=false){
	if ($language===false) $language = LANGUAGE;
	$page = translator_page($namespace);
	$uri = translator_uri($namespace);
	if ($page==$uri)
		$where = "uri = '$page'";
	else
		$where = "(uri='$page' OR uri='$uri')";
	$sql = "
		SELECT intext,outtext
		FROM ".db_prefix("translations")."
		WHERE language='$language'
			AND $where";
/*	debug(nl2br(htmlentities($sql, ENT_COMPAT, getsetting("charset", "ISO-8859-1")))); */
	if (!getsetting("cachetranslations",0)) {
		$result = db_query($sql);
	} else {
		$result = db_query_cached($sql,"translations-".$namespace."-".$language,600);
		//store it for 10 Minutes, normally you don't need to refresh this often
	}
	$out = array();
	while ($row = db_fetch_assoc($result)){
		$out[$row['intext']] = $row['outtext'];
	}
	return $out;
}

$translatorbuttons = array();
$seentlbuttons = array();
function tlbutton_push($indata,$hot=false,$namespace=FALSE){
	global $translatorbuttons;
	global $translation_is_enabled,$seentlbuttons,$session;
	if (!$translation_is_enabled) return;
	if (!$namespace) $namespace="unknown";
	if ($session['user']['superuser'] & SU_IS_TRANSLATOR){
		if (preg_replace("/[ 	\n\r]|`./",'',$indata)>""){
			if (isset($seentlbuttons[$namespace][$indata])){
				$link = "";
			}else{
				$seentlbuttons[$namespace][$indata] = true;
				require_once("lib/sanitize.php");
				$uri = cmd_sanitize($namespace);
				$uri = comscroll_sanitize($uri);
				$link = "translatortool.php?u=".
					rawurlencode($uri)."&t=".rawurlencode($indata);
				$link = "<a href='$link' target='_blank' onClick=\"".
					popup($link).";return false;\" class='t".
					($hot?"hot":"")."'>T</a>";
			}
			array_push($translatorbuttons,$link);
		}
		return true;
	}else{
		//when user is not a translator, return false.
		return false;
	}
}

function tlbutton_pop(){
	global $translatorbuttons,$session;
	if ($session['user']['superuser'] & SU_IS_TRANSLATOR){
		return array_pop($translatorbuttons);
	}else{
		return "";
	}
}

function tlbutton_clear(){
	global $translatorbuttons,$session;
	if ($session['user']['superuser'] & SU_IS_TRANSLATOR){
		$return = tlbutton_pop().join("",$translatorbuttons);
		$translatorbuttons = array();
		return $return;
	}else{
		return "";
	}
}

$translation_is_enabled = true;
function enable_translation($enable=true){
	global $translation_is_enabled;
	$translation_is_enabled = $enable;
}

$translation_namespace = "";
$translation_namespace_stack = array();
function tlschema($schema=false){
	global $translation_namespace,$translation_namespace_stack,$REQUEST_URI;
	if ($schema===false){
		$translation_namespace = array_pop($translation_namespace_stack);
		if ($translation_namespace=="")
			$translation_namespace = translator_uri($REQUEST_URI);
	}else{
		array_push($translation_namespace_stack,$translation_namespace);
		$translation_namespace = $schema;
	}
}

function translator_check_collect_texts()
{
	$tlmax = getsetting("tl_maxallowed",0);

	if (getsetting("permacollect", 0)) {
		savesetting("collecttexts", 1);
	} elseif ($tlmax && getsetting("OnlineCount", 0) <= $tlmax) {
		savesetting("collecttexts", 1);
	} else {
		savesetting("collecttexts", 0);
	}
}

?>