annotate vendor/symfony/translation/Dumper/IcuResFileDumper.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of the Symfony package.
Chris@0 5 *
Chris@0 6 * (c) Fabien Potencier <fabien@symfony.com>
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Symfony\Component\Translation\Dumper;
Chris@0 13
Chris@0 14 use Symfony\Component\Translation\MessageCatalogue;
Chris@0 15
Chris@0 16 /**
Chris@0 17 * IcuResDumper generates an ICU ResourceBundle formatted string representation of a message catalogue.
Chris@0 18 *
Chris@0 19 * @author Stealth35
Chris@0 20 */
Chris@0 21 class IcuResFileDumper extends FileDumper
Chris@0 22 {
Chris@0 23 /**
Chris@0 24 * {@inheritdoc}
Chris@0 25 */
Chris@0 26 protected $relativePathTemplate = '%domain%/%locale%.%extension%';
Chris@0 27
Chris@0 28 /**
Chris@0 29 * {@inheritdoc}
Chris@0 30 */
Chris@17 31 public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
Chris@0 32 {
Chris@0 33 $data = $indexes = $resources = '';
Chris@0 34
Chris@0 35 foreach ($messages->all($domain) as $source => $target) {
Chris@17 36 $indexes .= pack('v', \strlen($data) + 28);
Chris@0 37 $data .= $source."\0";
Chris@0 38 }
Chris@0 39
Chris@0 40 $data .= $this->writePadding($data);
Chris@0 41
Chris@0 42 $keyTop = $this->getPosition($data);
Chris@0 43
Chris@0 44 foreach ($messages->all($domain) as $source => $target) {
Chris@0 45 $resources .= pack('V', $this->getPosition($data));
Chris@0 46
Chris@17 47 $data .= pack('V', \strlen($target))
Chris@0 48 .mb_convert_encoding($target."\0", 'UTF-16LE', 'UTF-8')
Chris@0 49 .$this->writePadding($data)
Chris@0 50 ;
Chris@0 51 }
Chris@0 52
Chris@0 53 $resOffset = $this->getPosition($data);
Chris@0 54
Chris@17 55 $data .= pack('v', \count($messages->all($domain)))
Chris@0 56 .$indexes
Chris@0 57 .$this->writePadding($data)
Chris@0 58 .$resources
Chris@0 59 ;
Chris@0 60
Chris@0 61 $bundleTop = $this->getPosition($data);
Chris@0 62
Chris@0 63 $root = pack('V7',
Chris@0 64 $resOffset + (2 << 28), // Resource Offset + Resource Type
Chris@0 65 6, // Index length
Chris@12 66 $keyTop, // Index keys top
Chris@12 67 $bundleTop, // Index resources top
Chris@12 68 $bundleTop, // Index bundle top
Chris@17 69 \count($messages->all($domain)), // Index max table length
Chris@12 70 0 // Index attributes
Chris@0 71 );
Chris@0 72
Chris@0 73 $header = pack('vC2v4C12@32',
Chris@0 74 32, // Header size
Chris@0 75 0xDA, 0x27, // Magic number 1 and 2
Chris@0 76 20, 0, 0, 2, // Rest of the header, ..., Size of a char
Chris@0 77 0x52, 0x65, 0x73, 0x42, // Data format identifier
Chris@0 78 1, 2, 0, 0, // Data version
Chris@0 79 1, 4, 0, 0 // Unicode version
Chris@0 80 );
Chris@0 81
Chris@0 82 return $header.$root.$data;
Chris@0 83 }
Chris@0 84
Chris@0 85 private function writePadding($data)
Chris@0 86 {
Chris@17 87 $padding = \strlen($data) % 4;
Chris@0 88
Chris@0 89 if ($padding) {
Chris@0 90 return str_repeat("\xAA", 4 - $padding);
Chris@0 91 }
Chris@0 92 }
Chris@0 93
Chris@0 94 private function getPosition($data)
Chris@0 95 {
Chris@17 96 return (\strlen($data) + 28) / 4;
Chris@0 97 }
Chris@0 98
Chris@0 99 /**
Chris@0 100 * {@inheritdoc}
Chris@0 101 */
Chris@0 102 protected function getExtension()
Chris@0 103 {
Chris@0 104 return 'res';
Chris@0 105 }
Chris@0 106 }