180 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
if ( PHP_SAPI != 'cli' ) {
 | 
						|
	echo "This script can only be called from the Command Line.\n";
 | 
						|
	exit;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * String object
 | 
						|
 */
 | 
						|
class PoeditString {
 | 
						|
	public $key;
 | 
						|
	public $value;
 | 
						|
	public $fuzzy;
 | 
						|
	public $comments;
 | 
						|
 | 
						|
	function __construct( $key, $value = '', $fuzzy = false, $comments = [] ) {
 | 
						|
		$this->key = $key;
 | 
						|
		$this->value = $value;
 | 
						|
		$this->fuzzy = $fuzzy;
 | 
						|
		$this->comments = (array)$comments;
 | 
						|
	}
 | 
						|
 | 
						|
	public function __toString() {
 | 
						|
		$str = '';
 | 
						|
		foreach ( $this->comments as $c ) {
 | 
						|
			$str .= "#: $c\n";
 | 
						|
		}
 | 
						|
		if ( $this->fuzzy ) {
 | 
						|
			$str .= "#, fuzzy\n";
 | 
						|
		}
 | 
						|
		$str .= 'msgid "' . str_replace( '"', '\\"', $this->key ) . '"' . "\n";
 | 
						|
		$str .= 'msgstr "' . str_replace( '"', '\\"', $this->value ) . '"' . "\n";
 | 
						|
		$str .= "\n";
 | 
						|
 | 
						|
		return $str;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Parser object
 | 
						|
 */
 | 
						|
class PoeditParser {
 | 
						|
 | 
						|
	protected $file;
 | 
						|
	protected $header = '';
 | 
						|
	protected $strings = [];
 | 
						|
 | 
						|
	protected function _fixQuotes( $str ) {
 | 
						|
		return stripslashes( $str );
 | 
						|
	}
 | 
						|
 | 
						|
	public function __construct( $file ) {
 | 
						|
		$this->file = $file;
 | 
						|
	}
 | 
						|
 | 
						|
	public function parse() {
 | 
						|
		$contents = file_get_contents( $this->file );
 | 
						|
		$parts = preg_split( '#(\r\n|\n){2}#', $contents, -1, PREG_SPLIT_NO_EMPTY );
 | 
						|
		$this->header = array_shift( $parts );
 | 
						|
 | 
						|
		foreach ( $parts as $part ) {
 | 
						|
 | 
						|
			// parse comments
 | 
						|
			$comments = [];
 | 
						|
			preg_match_all( '#^\\#: (.*?)$#m', $part, $matches, PREG_SET_ORDER );
 | 
						|
			foreach ( $matches as $m ) {
 | 
						|
				$comments[] = $m[1];
 | 
						|
			}
 | 
						|
 | 
						|
			$isFuzzy = preg_match( '#^\\#, fuzzy$#im', $part ) ? true : false;
 | 
						|
 | 
						|
			preg_match_all( '# ^ (msgid|msgstr)\ " ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)" $ #ixm', $part, $matches2, PREG_SET_ORDER );
 | 
						|
			$k = null;
 | 
						|
			if ( isset( $matches2[0][2] ) ) {
 | 
						|
				$k = $this->_fixQuotes( $matches2[0][2] );
 | 
						|
			}
 | 
						|
 | 
						|
			$v = !empty( $matches2[1][2] ) ? $this->_fixQuotes( $matches2[1][2] ) : '';
 | 
						|
 | 
						|
			$this->strings[$k] = new PoeditString( $k, $v, $isFuzzy, $comments );
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public function merge( $strings ) {
 | 
						|
		foreach ( (array)$strings as $str ) {
 | 
						|
			if ( !in_array( $str, array_keys( $this->strings ) ) ) {
 | 
						|
				$this->strings[$str] = new PoeditString( $str );
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public function getHeader() {
 | 
						|
		return $this->header;
 | 
						|
	}
 | 
						|
 | 
						|
	public function getStrings() {
 | 
						|
		return $this->strings;
 | 
						|
	}
 | 
						|
 | 
						|
	public function getJSON() {
 | 
						|
		$str = [];
 | 
						|
		foreach ( $this->strings as $s ) {
 | 
						|
			echo "String: Key: " . $s->key . " Value: " . $s->value . "\n";
 | 
						|
			if ( $s->value /*&& strlen($s->value) > 0*/ ) {
 | 
						|
				$str[$s->key] = $s->value;
 | 
						|
			} else {
 | 
						|
				//$str[$s->key] = $s->key; //Don't export strings that haven't been translated to save space.
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return json_encode( $str );
 | 
						|
	}
 | 
						|
 | 
						|
	public function toJSON( $outputFilename, $varName = 'l10n' ) {
 | 
						|
		$str = "$varName = " . $this->getJSON();
 | 
						|
 | 
						|
		return file_put_contents( $outputFilename, $str ) !== false;
 | 
						|
	}
 | 
						|
 | 
						|
	public function save( $filename = null ) {
 | 
						|
		$data = $this->header . "\n\n";
 | 
						|
		foreach ( $this->strings as $str ) {
 | 
						|
			$data .= $str;
 | 
						|
		}
 | 
						|
 | 
						|
		return file_put_contents( $filename ? $filename : $this->file, $data ) !== false;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 *
 | 
						|
 * @param unknown_type $args
 | 
						|
 */
 | 
						|
function buildOptions( $args ) {
 | 
						|
	$options = [
 | 
						|
			'-o' => null,
 | 
						|
			'-i' => null,
 | 
						|
			'-n' => 'l10n',
 | 
						|
	];
 | 
						|
	$len = count( $args );
 | 
						|
	$i = 0;
 | 
						|
	while ( $i < $len ) {
 | 
						|
		if ( preg_match( '#^-[a-z]$#i', $args[$i] ) ) {
 | 
						|
			$options[$args[$i]] = isset( $args[$i + 1] ) ? trim( $args[$i + 1] ) : true;
 | 
						|
			$i += 2;
 | 
						|
		} else {
 | 
						|
			$options[] = $args[$i];
 | 
						|
			$i++;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return $options;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Script entry point
 | 
						|
 *
 | 
						|
 * Usage :
 | 
						|
 * =======
 | 
						|
 * php po2json -i <path/to/file.po> -o <path/to/file.json> {optional} -n <variable name (default is l10n)>
 | 
						|
 *
 | 
						|
 * This script is based on the project jsgettext : http://code.google.com/p/jsgettext/
 | 
						|
 * I've updated it slightly to meet my need
 | 
						|
 */
 | 
						|
$options = buildOptions( $argv );
 | 
						|
 | 
						|
if ( !file_exists( $options['-i'] ) || !is_readable( $options['-i'] ) ) {
 | 
						|
	die( "Invalid input file. Make sure it exists and is readable." . "\n" );
 | 
						|
}
 | 
						|
 | 
						|
$poeditParser = new PoeditParser( $options['-i'] );
 | 
						|
$poeditParser->parse();
 | 
						|
 | 
						|
if ( $poeditParser->toJSON( $options['-o'], $options['-n'] ) ) {
 | 
						|
	$strings = count( $poeditParser->getStrings() );
 | 
						|
	echo "Successfully exported " . $strings . " strings.\n";
 | 
						|
} else {
 | 
						|
	echo "Cannor write to file '{$options['-o']}'.\n";
 | 
						|
}
 |