Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Translation\Dumper; Chris@0: Chris@17: use Symfony\Component\Translation\Loader\MoFileLoader; Chris@0: use Symfony\Component\Translation\MessageCatalogue; Chris@0: Chris@0: /** Chris@0: * MoFileDumper generates a gettext formatted string representation of a message catalogue. Chris@0: * Chris@0: * @author Stealth35 Chris@0: */ Chris@0: class MoFileDumper extends FileDumper Chris@0: { Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@17: public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = []) Chris@0: { Chris@0: $sources = $targets = $sourceOffsets = $targetOffsets = ''; Chris@17: $offsets = []; Chris@0: $size = 0; Chris@0: Chris@0: foreach ($messages->all($domain) as $source => $target) { Chris@17: $offsets[] = array_map('strlen', [$sources, $source, $targets, $target]); Chris@0: $sources .= "\0".$source; Chris@0: $targets .= "\0".$target; Chris@0: ++$size; Chris@0: } Chris@0: Chris@17: $header = [ Chris@0: 'magicNumber' => MoFileLoader::MO_LITTLE_ENDIAN_MAGIC, Chris@0: 'formatRevision' => 0, Chris@0: 'count' => $size, Chris@0: 'offsetId' => MoFileLoader::MO_HEADER_SIZE, Chris@0: 'offsetTranslated' => MoFileLoader::MO_HEADER_SIZE + (8 * $size), Chris@0: 'sizeHashes' => 0, Chris@0: 'offsetHashes' => MoFileLoader::MO_HEADER_SIZE + (16 * $size), Chris@17: ]; Chris@0: Chris@17: $sourcesSize = \strlen($sources); Chris@0: $sourcesStart = $header['offsetHashes'] + 1; Chris@0: Chris@0: foreach ($offsets as $offset) { Chris@0: $sourceOffsets .= $this->writeLong($offset[1]) Chris@0: .$this->writeLong($offset[0] + $sourcesStart); Chris@0: $targetOffsets .= $this->writeLong($offset[3]) Chris@0: .$this->writeLong($offset[2] + $sourcesStart + $sourcesSize); Chris@0: } Chris@0: Chris@17: $output = implode('', array_map([$this, 'writeLong'], $header)) Chris@0: .$sourceOffsets Chris@0: .$targetOffsets Chris@0: .$sources Chris@0: .$targets Chris@0: ; Chris@0: Chris@0: return $output; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function getExtension() Chris@0: { Chris@0: return 'mo'; Chris@0: } Chris@0: Chris@0: private function writeLong($str) Chris@0: { Chris@0: return pack('V*', $str); Chris@0: } Chris@0: }