TimeTrex/tools/i18n/translate.php

175 lines
5.7 KiB
PHP
Raw Permalink Normal View History

2022-12-13 07:10:06 +01:00
<?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 );
}
}
}
?>