<?php
/*******************************************************************************
 * Copyright (c) 2008-2012 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Intalio, Inc. - Initial API and implementation
 *    Antoine Toulme - Initial contribution.
 *    Satoru Yoshida - [380524] Performance up proposal for Babel Syncup
 *    Satoru Yoshida - [487636] should not sync up non translatable strings
*******************************************************************************/

// ini_set("memory_limit", "64M");

error_reporting(E_ALL);
ini_set('display_errors', '1');

require(dirname(__FILE__) . "/../system/dbconnection.class.php");
$dbc = new DBConnection();
$dbh = $dbc->connect();

require_once(dirname(__FILE__) . "/../system/backend_functions.php");

if( !function_exists('json_encode') ){
	require("/home/data/httpd/babel.eclipse.org/html/json_encode.php");
	function json_encode($encode){
 		$jsons = new Services_JSON();
		return $jsons->encode($encode);
	}
}

$User = getSyncupUser();

$dbc = new DBConnection();
global $dbh;
$dbh = $dbc->connect();

echo "Connection established. Ready to begin. The syncup user id is: $User->userid\n";

/**
 * Returns possible translation.
 * @param string $untranslated_value
 * @return string
 */
function possible_translation($untranslated_value) {
	global $language_id;
	#candidate may not be found if new line is there.
	$untranslated_value = rtrim($untranslated_value, "\n\r");
	# BINARY the lookup value instead of the field to support an index.
	# is_active is not used in consideration of case to reuse.
	$rs = mysql_query( "SELECT string_id FROM strings WHERE value = BINARY '" . addslashes($untranslated_value) . "' and non_translatable = 0 ");
	if ($rs === false) {
		return NULL;
	}
	$string_ids_tmp = array();
	while ( ($row = mysql_fetch_assoc($rs)) != null) {
		$string_ids_tmp[] = $row['string_id'];
	}
	$string_ids = implode(',',$string_ids_tmp);
	if ($string_ids === '') {
		return NULL;
	}
	#if SQL result has many records, last created record will be used.
	# s.is_active is not used in consideration of case to reuse.
	$rs2 = mysql_query( "SELECT t.created_on, t.value from strings As s inner join translations AS t on s.string_id = t.string_id where s.string_id IN ($string_ids) and t.language_id = '" . $language_id . "' and t.is_active order by created_on DESC");
	if ($rs2 and (($translation_row = mysql_fetch_assoc($rs2)) != null)) {
		return $translation_row['value'];
	}
	return null;
}

$language_result = mysql_query( "SELECT language_id, iso_code, IF(locale <> '', CONCAT(CONCAT(CONCAT(name, ' ('), locale), ')'), name) as name FROM languages WHERE languages.is_active AND languages.language_id<>1 ORDER BY name ASC" );
while( ($language_row = mysql_fetch_assoc($language_result)) != null ) {
	$language_name = $language_row['name'];
	$language_iso = $language_row['iso_code'];
	$language_id = $language_row['language_id'];
	echo "\nInvestigating $language_name ($language_iso) (language_id=$language_id)\n";
	#In performance purpose, the SQL sorts a temporary table, TEMP.
	$untranslated_strings = mysql_query( "SELECT * FROM (SELECT string_id, value from strings where is_active and non_translatable = 0 and value <> '' and string_id not in(select string_id from translations where language_id=$language_id) ) AS TEMP order by value" );
	$count = 0;
	$prev_value = '';
    while ( ($string_row = mysql_fetch_assoc($untranslated_strings)) != null) {
    	$count++;

    	if($count % 10000 == 0) {
    		echo "Processed ", $count, " strings...\n";
    	}

		$untranslated_value = $string_row['value'];
		$untranslated_id = $string_row['string_id'];

		/*
		 * it sets new translation only when new value is detected.
		 * The if statement requires to be sorted by strings.value
		 */
		if ($untranslated_value !== $prev_value) {
			$translation = possible_translation($untranslated_value);
			$prev_value  = $untranslated_value;
		}

       	if ($translation !== null) {
           	$query = "INSERT INTO translations(string_id, language_id, value, userid, created_on) values('". addslashes($untranslated_id) ."','". addslashes($language_id) ."','" . addslashes($translation) . "', '". addslashes($User->userid) ."', NOW())";
           	echo "\tTranslating ", addslashes($untranslated_id), " with: ", addslashes($translation), "\n";
			mysql_query($query);
		}
    }
}
echo "\nDone\n";
?>
