<?php
/*******************************************************************************
 * Copyright (c) 2013 IBM Corporation 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:
 *    Kit Lo (IBM) - [402215] Extract Orion JavaScript files for translation
 *******************************************************************************/

error_reporting(E_ALL); ini_set("display_errors", true);

header("Content-type: text/plain");
include("../../html/global.php");
InitPage("");

$headless = 1;

# See http://wiki.eclipse.org/Babel_/_Large_Contribution_Import_Process
#
# !!  IMPORTANT !!
# Set to 1 unless the translations were authored (and tested/reviewed in context) by professionals
# This doesn't mean all incoming translations will be fuzzy --
# only those that are 'replacing' a non-fuzzy one
$fuzzy = 1;

require(dirname(__FILE__) . "/../file/file.class.php");
require_once("/home/data/httpd/babel.eclipse.org/html/json_encode.php");

$pageTitle = "Babel - Import Translation archive";
$pageKeywords = "import,properties,translation,language,nlpack,pack,eclipse,babel";

$USER = getGenieUser()->userid;

# TODO
$indir = "/tmp/tmp-babel/import";
chdir($indir);
# sub-structure: ./XX/eclipse/plugins/ where XX is the iso code for the language
exec('find . -type f', $lines);
		
# loop through files
foreach ($lines as $line) {
	$line = trim($line);
	# echo $line . "\n";
	if(preg_match("/^\.\/([a-zA-Z0-9._-]+)\/([0-9.]+)\/([a-zA-Z0-9_-]+)\/(.+\.js)$/", $line, $matches)) {
		$PROJECT_ID = $matches[1];
		$VERSION = $matches[2];
		$language = $matches[3];
		$file = $matches[4];
		
		$file_id = 0;
		$language_id = 0;
		
		$SQL = "SELECT F.file_id, L.language_id 
		FROM files AS F, languages AS L WHERE F.is_active = 1 
		AND F.project_id = '" . $PROJECT_ID . "' AND F.version = '" . $VERSION . "'
			AND F.name LIKE '%" . $file . "' AND L.iso_code = '" . $language . "'";
		$rs = mysqli_query($dbh, $SQL);
		if($myrow = mysqli_fetch_assoc($rs)) {
			$file_id 		= $myrow['file_id'];
			$language_id 	= $myrow['language_id'];
			# echo "  Found file: " . $file_id . "\n";
		} 

		if($file_id > 0 && $language_id > 0) {
			# Get the file contents
			$fh      = fopen($line, 'r');
			$size 	 = filesize($line);

			# echo $file . " - file size: " . $size . " language: " . $language . "\n";
			$content = fread($fh, $size);
			# echo $content . "<br/>";
			fclose($fh);
			$file_contents = ereg_replace("\r\n?", "\n", $content);
			$file_contents = preg_replace("/NON-NLS-(.*)/", "", $file_contents);
			$file_contents = preg_replace("/\\/\\/\\$/", "", $file_contents);
			$file_contents = preg_replace("/((.*?(\n))+.*?)define\(/", "define(", $file_contents);
			$file_contents = preg_replace("/define\(((.*?(\n))+.*?)\)\;/", "$1", $file_contents);
			$lines = $json_decode($file_contents, true, 10);
			foreach($lines as $key => $value) {
							# Get the matching string name
							$SQL = "SELECT s.string_id, s.value, tr.value as tr_last, tr.possibly_incorrect as tr_last_fuzzy, trv.value as ever_tr_value
							FROM strings as s
							left join translations as tr on (s.string_id = tr.string_id
	    					and tr.language_id = $language_id
	    					and tr.is_active)
	    					left join translations as trv on (s.string_id = trv.string_id
	    					and trv.language_id = $language_id
	    					and trv.value = '" . addslashes(unescape($value)) . "')
							WHERE s.is_active = 1 AND s.non_translatable <> 1 AND s.file_id = " . $file_id . " AND s.name = '" . $key . "'";
							$rs_string = mysqli_query($dbh, $SQL);
						if ($rs_string) {
							$myrow_string = mysqli_fetch_assoc($rs_string);
							if($myrow_string['string_id'] > 0  				# There is an English string   
								 && $value != ""							# With a non-null English value
								 && $myrow_string['ever_tr_value'] == ""	# That's never been translated to this incoming value
								 && $value != $myrow_string['value']  	# And the proposed translation is different from the English value
								 ) {
								$insert_as_fuzzy = 0;
								if($myrow_string['tr_last'] != "" && $fuzzy == 1 && $myrow_string['tr_last_fuzzy'] == 0) {
									# This incoming translation is replacing an existing value that is *not* marked as fuzzy
									# And the $fuzzy == 1, so we may be replacing a known good value !!
									$insert_as_fuzzy = 1;
								}
								else {
									## Nothing. Insert as non-fuzzy.
									## If this is replacing a fuzzy value, then that's a good thing
								}
								# echo "    Language: " . $language . " - Found string with ID: " . $myrow_string['string_id'] . " value: " . $myrow_string['value'] . " never translated to: " . $value . "\n";
								$SQL = "UPDATE translations set is_active = 0 where string_id = " . $myrow_string['string_id'] . " and language_id = '" . $language_id . "'";
								mysqli_query($dbh, $SQL);
								$SQL = "INSERT INTO translations (translation_id, string_id, language_id, version, value, possibly_incorrect, is_active, userid, created_on)
								VALUES (
									NULL, " . $myrow_string['string_id'] . ", 
									" . $language_id . ", 0, '" . addslashes(unescape($value)) . "', $insert_as_fuzzy, 1, " . $USER . ", NOW()
								)";
								mysqli_query($dbh, $SQL);
								# echo $SQL;
							}
						}
			}
		}
	}
}
echo "Done.\n\n";
?>
