175 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
require_once( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..'  . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'global.inc.php' );
 | 
						|
require_once( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..'  . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'CLI.inc.php' );
 | 
						|
 | 
						|
use Gettext\Loader\PoLoader;
 | 
						|
use Gettext\Generator\PoGenerator;
 | 
						|
 | 
						|
/*
 | 
						|
 * This script when passed a gettext *.POT, or *.PO file will
 | 
						|
 * attempt to use a online service to translate each string
 | 
						|
 * to the specified language.
 | 
						|
 *
 | 
						|
 * This should hopefully serve as a good STARTING point for further
 | 
						|
 * human transation.
 | 
						|
 *
 | 
						|
 * This file will first create batched input files ready for translation.
 | 
						|
 * It will then load the translated files and create a messages.po file from them.
 | 
						|
 *
 | 
						|
 * Take .PO file and create small HTML batch files for translations
 | 
						|
 * php translate.php -s ../../interface/locale/fr_FR/LC_MESSAGES/messages.po ./tr_batches.html
 | 
						|
 *
 | 
						|
 * Using a web browser to translate the .html file, scroll all the way to the bottom of the file, save it from the Dev Tools.
 | 
						|
 *
 | 
						|
 * Translate HTML batch files back into .PO file
 | 
						|
 * php translate.php -t ../../interface/locale/fr_FR/LC_MESSAGES/messages.po ./tr_batches.html1 fr.po
 | 
						|
 *
 | 
						|
 */
 | 
						|
if ( PHP_SAPI != 'cli' ) {
 | 
						|
	echo "This script can only be called from the Command Line.\n";
 | 
						|
	exit;
 | 
						|
}
 | 
						|
 | 
						|
if ( $argc < 3 || in_array( $argv[1], [ '--help', '-help', '-h', '-?' ] ) ) {
 | 
						|
	$help_output = "Usage: translate.php [OPTIONS] \n";
 | 
						|
	$help_output .= "  Options:\n";
 | 
						|
	$help_output .= "    -s 	[.POT or .PO] [OUT HTML]\n";
 | 
						|
	$help_output .= "    	 	Create a source translation file, suitable to be translated on mass.\n";
 | 
						|
	$help_output .= "    -t 	[.POT or .PO] [IN HTML] [OUTFILE]\n";
 | 
						|
 | 
						|
	echo $help_output;
 | 
						|
} else {
 | 
						|
	//Handle command line arguments
 | 
						|
	$last_arg = count( $argv ) - 1;
 | 
						|
 | 
						|
	if ( in_array( '-s', $argv ) ) {
 | 
						|
		$create_source = true;
 | 
						|
	} else {
 | 
						|
		$create_source = false;
 | 
						|
	}
 | 
						|
 | 
						|
	if ( isset( $argv[$last_arg - 2] ) && $argv[2] != '' ) {
 | 
						|
		if ( !file_exists( $argv[2] ) || !is_readable( $argv[2] ) ) {
 | 
						|
			echo ".POT or .PO File: " . $argv[2] . " does not exists or is not readable!\n";
 | 
						|
		} else {
 | 
						|
			$source_file = $argv[2];
 | 
						|
		}
 | 
						|
 | 
						|
		if ( $create_source == true ) {
 | 
						|
			$outfile = $argv[3];
 | 
						|
			$infile = null;
 | 
						|
		} else {
 | 
						|
			$infile = $argv[3];
 | 
						|
			$outfile = $argv[4];
 | 
						|
		}
 | 
						|
		echo "In File: $infile\n";
 | 
						|
		echo "Out File: $outfile\n";
 | 
						|
 | 
						|
		//import from a .po file:
 | 
						|
		$po = new PoLoader();
 | 
						|
		$po_strings = $po->loadFile( $source_file );
 | 
						|
 | 
						|
		if ( $create_source == true ) {
 | 
						|
			$batch_size = 1000;
 | 
						|
			//$batch_size = 999999;
 | 
						|
			$batch = 0;
 | 
						|
			$prev_batch = 0;
 | 
						|
			$i = 0;
 | 
						|
			$out = null;
 | 
						|
			$max = count( $po_strings->getTranslations() ) - 1;
 | 
						|
			echo "Max: $max\n";
 | 
						|
			foreach ( $po_strings->getTranslations() as $msg_obj ) {
 | 
						|
				//echo "$i. $msgid\n";
 | 
						|
				$msgid = preg_replace('/[\x00-\x1F\x7F]/', '', $msg_obj->getId() );
 | 
						|
				$msgstr = trim( $msg_obj->getTranslation() );
 | 
						|
				if ( $msgid == '#' || $msgstr != '' ) {
 | 
						|
					$i++;
 | 
						|
 | 
						|
					if ( $i < $max ) {
 | 
						|
						continue;
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				if ( $i == 0 || $out == null ) {
 | 
						|
					echo "I = 0 OR Batch = 0\n";
 | 
						|
					$out = "<html>\n";
 | 
						|
					$out .= "<body><pre>\n";
 | 
						|
				}
 | 
						|
 | 
						|
				if ( $i > 0 && ( $i % $batch_size == 0 || $i == $max ) ) {
 | 
						|
					$batch++;
 | 
						|
					echo "New Batch = $batch\n";
 | 
						|
				}
 | 
						|
 | 
						|
				$out .= '<span class="' . htmlentities( $msgid ) . '">' . htmlentities( $msgid ) . "</span><br>\n";
 | 
						|
				//$out .= $i.': '. str_replace('<br>', '(11)', $msgid) ."<br>\n";
 | 
						|
 | 
						|
				if ( $batch != $prev_batch ) {
 | 
						|
					echo "Writing...\n";
 | 
						|
					$out .= "</pre></body>\n";
 | 
						|
					$out .= "</html>\n";
 | 
						|
 | 
						|
					//Write the file.
 | 
						|
					$output_file_name = str_replace( '.', '-'. $batch .'.', dirname( $outfile ) . DIRECTORY_SEPARATOR . basename( $outfile ) );
 | 
						|
					echo "Writing to: ". $output_file_name ."\n";
 | 
						|
					file_put_contents( $output_file_name, $out );
 | 
						|
 | 
						|
					$out = null;
 | 
						|
				}
 | 
						|
 | 
						|
				$prev_batch = $batch;
 | 
						|
				$i++;
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			//Load translated HTML files.
 | 
						|
			echo "Loading Translated File\n";
 | 
						|
 | 
						|
			$file_contents = file_get_contents( $infile );
 | 
						|
			$file_contents = preg_replace( '/<html .*>/iu', '', $file_contents );
 | 
						|
			$file_contents = preg_replace( '/<head>.*<\/head>/iu', '', $file_contents );
 | 
						|
			$file_contents = preg_replace( '/<base.*>/iu', '', $file_contents );
 | 
						|
			$file_contents = preg_replace( '/<\/span>([\s]*)<br>/iu', '</span>', $file_contents );
 | 
						|
			$file_contents = preg_replace( '/<\/span><br>([\s]*)/iu', '</span>', $file_contents );
 | 
						|
			$file_contents = preg_replace( '/<font style="(.*)">/iu', '', $file_contents );
 | 
						|
			$file_contents = preg_replace( '/ :/iu', ':', $file_contents );
 | 
						|
			$file_contents = str_replace( [ '<html>', '</html>', '<body>', '</body>', '<pre>', '</pre>', '</font>' ], '', $file_contents );
 | 
						|
 | 
						|
			$lines = explode( '</span>', $file_contents );
 | 
						|
			//var_dump($lines);
 | 
						|
			if ( is_array( $lines ) ) {
 | 
						|
				echo "Total Lines: " . count( $lines ) . "\n";
 | 
						|
 | 
						|
				$i = 0;
 | 
						|
				foreach ( $lines as $line ) {
 | 
						|
					//Parse the string number
 | 
						|
					if ( preg_match( '/<span class=\"(.*)\">(.*)/i', trim( $line ), $matches ) == true ) {
 | 
						|
						if ( is_array( $matches ) && isset( $matches[1] ) && isset( $matches[2] ) ) {
 | 
						|
							$msgid = html_entity_decode( $matches[1] );
 | 
						|
							$msgstr = preg_replace( '/\s\"\s/iu', '"', html_entity_decode( $matches[2] ) );
 | 
						|
 | 
						|
							echo $i . ". Translating: " . $msgid . "\n";
 | 
						|
							echo "              To: " . $msgstr . "\n";
 | 
						|
							$tmp_translation = $po_strings->find( null, $msgid );
 | 
						|
							if ( $tmp_translation ) {
 | 
						|
								$tmp_translation->translate( $msgstr );
 | 
						|
							} else {
 | 
						|
								echo "Failed to find translation key...\n";
 | 
						|
							}
 | 
						|
						} else {
 | 
						|
							echo "ERROR parsing line!\n";
 | 
						|
						}
 | 
						|
					} else {
 | 
						|
						echo "Failed to match line!\n";
 | 
						|
					}
 | 
						|
 | 
						|
					$i++;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			$po_generator = new PoGenerator();
 | 
						|
			$po_generator->generateFile( $po_strings, $outfile );
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
?>
 |