<?php
/*******************************************************************************
 * Copyright (c) 2008 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.
*******************************************************************************/

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";
$langs = mysql_query( "SELECT language_id FROM languages where languages.is_active" );
while( ($lang_row = mysql_fetch_assoc($langs)) != null ) {
	$language_id = $lang_row['language_id'];
    echo "Investigating language " . $language_id . "\n\n";
	$untranslated_strings = mysql_query( "SELECT * from strings where is_active and value <> '' and string_id not in(select string_id from translations where language_id=". $language_id .")" );
	$count = 0;
    while ( ($string_row = mysql_fetch_assoc($untranslated_strings)) != null) {
    	$count++;
    	
    	if($count % 10000 == 0) {
    		echo "Processed " . $count . " strings (language_id=$language_id)... \n";
    	}
    	
		$untranslated_value = $string_row['value'];
		$untranslated_id = $string_row['string_id'];
		
		# This query split in two for added performance.
		# See bug 270485
		$string_ids = "";
		# BINARY the lookup value instead of the field to support an index
		$rs = mysql_query( "SELECT s.string_id FROM strings AS s WHERE s.value = BINARY '" . addslashes($untranslated_value) . "'");
		while ( ($row = mysql_fetch_assoc($rs)) != null) {
			if(strlen($string_ids) > 0) {
				$string_ids .= ",";
			}
			$string_ids .= $row['string_id'];
		}
		$possible_translations = mysql_query( "SELECT 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 ");
       	if ($possible_translations and (($translation_row = mysql_fetch_assoc($possible_translations)) != null)) {
			$translation = $translation_row['value'];
           	$query = "INSERT INTO translations(string_id, language_id, value, userid, created_on, possibly_incorrect) values('". addslashes($untranslated_id) ."','". addslashes($language_id) ."','" . addslashes($translation) . "', '". addslashes($User->userid) ."', NOW(), 1)";
           	echo "\tTranslating ". addslashes($untranslated_id) ." with: " . addslashes($translation) . "\n";
			mysql_query($query);
		}
    }
}
?>
