You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.3 KiB
82 lines
2.3 KiB
<?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\Loader\MoFileLoader; |
|
use Symfony\Component\Translation\MessageCatalogue; |
|
|
|
/** |
|
* MoFileDumper generates a gettext formatted string representation of a message catalogue. |
|
* |
|
* @author Stealth35 |
|
*/ |
|
class MoFileDumper extends FileDumper |
|
{ |
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = []) |
|
{ |
|
$sources = $targets = $sourceOffsets = $targetOffsets = ''; |
|
$offsets = []; |
|
$size = 0; |
|
|
|
foreach ($messages->all($domain) as $source => $target) { |
|
$offsets[] = array_map('strlen', [$sources, $source, $targets, $target]); |
|
$sources .= "\0".$source; |
|
$targets .= "\0".$target; |
|
++$size; |
|
} |
|
|
|
$header = [ |
|
'magicNumber' => MoFileLoader::MO_LITTLE_ENDIAN_MAGIC, |
|
'formatRevision' => 0, |
|
'count' => $size, |
|
'offsetId' => MoFileLoader::MO_HEADER_SIZE, |
|
'offsetTranslated' => MoFileLoader::MO_HEADER_SIZE + (8 * $size), |
|
'sizeHashes' => 0, |
|
'offsetHashes' => MoFileLoader::MO_HEADER_SIZE + (16 * $size), |
|
]; |
|
|
|
$sourcesSize = \strlen($sources); |
|
$sourcesStart = $header['offsetHashes'] + 1; |
|
|
|
foreach ($offsets as $offset) { |
|
$sourceOffsets .= $this->writeLong($offset[1]) |
|
.$this->writeLong($offset[0] + $sourcesStart); |
|
$targetOffsets .= $this->writeLong($offset[3]) |
|
.$this->writeLong($offset[2] + $sourcesStart + $sourcesSize); |
|
} |
|
|
|
$output = implode('', array_map([$this, 'writeLong'], $header)) |
|
.$sourceOffsets |
|
.$targetOffsets |
|
.$sources |
|
.$targets |
|
; |
|
|
|
return $output; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
protected function getExtension() |
|
{ |
|
return 'mo'; |
|
} |
|
|
|
private function writeLong($str) |
|
{ |
|
return pack('V*', $str); |
|
} |
|
}
|
|
|