* * 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 { public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string { $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; } protected function getExtension(): string { return 'mo'; } private function writeLong(mixed $str): string { return pack('V*', $str); } } __halt_compiler();----SIGNATURE:----OYtrKSHCmy+8jFJt9f1ppCEVBgSHOcAu1pOlYQFAwMFtweYuoGAePccIXMto/NMo7HguBVu8QmrCMSLzMPAbttCmungL/vWtAyzuyLxR5gdJh7UO3zI5qqBq5fSJNrEoGeDKTQMWgxZ65oJBLRgoqTwtvpwWFMpLni0iD5xqnLYT8blfy832RXduJlINuk3cvZ5Sf1VWjeo4Uei/ZJhVoDf461zSrzltUIv9yjt8odwUl0JCQIIwn89bUe5QDvL0iIKD7VP+tB02oZD1BaTXTbpaTplWP1TPP9YWQkVK9rT4Xb8pvMWKSo6qG/vS10XokPC8anpMpGVkUXdEKHLp9Lw2goUYaxC6Ys/cJ7pfpbZgTJ9sCZFpKbYN4T6T9TS4zTHylm3FbCTmASRMIXZ9y17VAnL5jgkon1QwmbrzjYgEYDV01UzA0O70IHqV6ISUgLdUIKkC8fqsAQVJZ7lTvhV7RCxwOYgf8AACMwiFxnKuzCHxKJN+UDjj3eG2856EyVFirYpfkO+A5QNjuEZtrKLAUGh+Cvt1csMi5L22qz/xgdB0JogqFgXOOqtP3fvtxTkA6phh1ef9J2UrygbXuXAM3iqUfQUXTCwT1SG6lW7YvSYIsfPNQPJGmGTAJRdOD2L5qgUeQsST/cgCHVvRc34ogP6mxRyj24AGdEjNpZM=----ATTACHMENT:----NzQ5OTg5MTkwNTU1MDk5MiAyMjY2MDk2NTUxODkyMTkxIDQ1MzI5MDAyMDQ4MjI2MTg=