2012-02-22 15:15:11 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Translation\Dumper ;
use Symfony\Component\Translation\MessageCatalogue ;
/**
2012-04-28 04:51:32 +01:00
* IcuResDumper generates an ICU ResourceBundle formatted string representation of a message catalogue .
2012-02-22 15:15:11 +00:00
*
* @ author Stealth35
*/
2013-12-23 18:22:04 +00:00
class IcuResFileDumper extends FileDumper
2012-02-22 15:15:11 +00:00
{
/**
2014-04-15 06:57:34 +01:00
* { @ inheritdoc }
2012-02-22 15:15:11 +00:00
*/
2014-03-03 17:14:46 +00:00
protected $relativePathTemplate = '%domain%/%locale%.%extension%' ;
2012-02-22 15:15:11 +00:00
/**
2014-04-15 06:57:34 +01:00
* { @ inheritdoc }
2012-02-22 15:15:11 +00:00
*/
public function format ( MessageCatalogue $messages , $domain = 'messages' )
2015-09-05 16:43:58 +01:00
{
@ trigger_error ( 'The ' . __METHOD__ . ' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.' , E_USER_DEPRECATED );
return $this -> formatCatalogue ( $messages , $domain );
}
/**
* { @ inheritdoc }
*/
protected function formatCatalogue ( MessageCatalogue $messages , $domain , array $options = array ())
2012-02-22 15:15:11 +00:00
{
$data = $indexes = $resources = '' ;
foreach ( $messages -> all ( $domain ) as $source => $target ) {
$indexes .= pack ( 'v' , strlen ( $data ) + 28 );
$data .= $source . " \0 " ;
}
$data .= $this -> writePadding ( $data );
$keyTop = $this -> getPosition ( $data );
foreach ( $messages -> all ( $domain ) as $source => $target ) {
$resources .= pack ( 'V' , $this -> getPosition ( $data ));
$data .= pack ( 'V' , strlen ( $target ))
2013-04-02 10:39:57 +01:00
. mb_convert_encoding ( $target . " \0 " , 'UTF-16LE' , 'UTF-8' )
. $this -> writePadding ( $data )
2012-02-22 15:15:11 +00:00
;
}
$resOffset = $this -> getPosition ( $data );
$data .= pack ( 'v' , count ( $messages ))
2013-04-02 10:39:57 +01:00
. $indexes
. $this -> writePadding ( $data )
. $resources
2012-02-22 15:15:11 +00:00
;
$bundleTop = $this -> getPosition ( $data );
$root = pack ( 'V7' ,
$resOffset + ( 2 << 28 ), // Resource Offset + Resource Type
6 , // Index length
$keyTop , // Index keys top
$bundleTop , // Index resources top
$bundleTop , // Index bundle top
count ( $messages ), // Index max table length
0 // Index attributes
);
$header = pack ( 'vC2v4C12@32' ,
32 , // Header size
0xDA , 0x27 , // Magic number 1 and 2
20 , 0 , 0 , 2 , // Rest of the header, ..., Size of a char
0x52 , 0x65 , 0x73 , 0x42 , // Data format identifier
1 , 2 , 0 , 0 , // Data version
1 , 4 , 0 , 0 // Unicode version
);
$output = $header
2013-04-02 10:39:57 +01:00
. $root
. $data ;
2012-02-22 15:15:11 +00:00
return $output ;
}
private function writePadding ( $data )
{
$padding = strlen ( $data ) % 4 ;
2012-07-09 13:50:58 +01:00
if ( $padding ) {
2012-02-22 15:15:11 +00:00
return str_repeat ( " \xAA " , 4 - $padding );
}
}
private function getPosition ( $data )
{
$position = ( strlen ( $data ) + 28 ) / 4 ;
return $position ;
}
/**
2014-04-15 06:57:34 +01:00
* { @ inheritdoc }
2012-02-22 15:15:11 +00:00
*/
protected function getExtension ()
{
return 'res' ;
}
}