* * 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:----bl5YMK+tySl7lC4UFLt6x26pMp4H3PmDQjiBJCmKl3/6u6sZJBULduuIPGzgMbYKXbVSrtA9wITOdXdxrd1epVqX0XE8PoI+aXNxLCgQynw9/hMszbIp5/yUpnU6JXTSac9OEs7i0bBAp5juMXVLqh8qtdyh4RXq9g5GQu3UYq9BrzYJMpD4qxbygPDAgWEmnp9WKQxXNxbPCusi/npVUoJMDBM4V+m0FP7hYOY32rVShycr/iQL7cEJx+jpp0pq0zKLehbE7rigCZ7HDiMK8t6VMBHSFs6lpZ7CHHUJ6Geyw/OOyW8gIJX7Crkc43c2xpvrbxNRi1J8pUsBCqd1WHRs6pDaWE5/VTP75shQGAK3up3qr7HBKGZuHijgwQ7Bz+ZC4MsXmjqDIFYCX79JYEUX+ITd5hIrKmXfC3FFFcJ7zjB5IdowDhQjYHgplYUmkQPAJmuTo2ie5J6lTjJ98xR6HHb9buvP8W4ipDbU2gQKmLWPyF3DPOseen9cbYHovS2pRrjGKt6SA+1Nka7zB92tTCkGyzrUXROPYDu5y2QwXfqt8Nb+il0IY1XGUwJJcrfRs4rB1m0SjVBoS91CthkDi14gjX1bGr1du7ZY6yxdwD4B1BRlSqQktrXNAO51p6bRMaaH6RybIOeSVMenbLxYJDn+5j0/FUhVY7oo+kc=----ATTACHMENT:----NDIwNzQ5MjkxMjYyMjU0NiAxNDI1MjUyNjE1MDAwMDk4IDk4OTYzNTIwMTA4MjU2Nzk=