PluginProbe
Independent Analytics – WordPress Analytics Plugin / 2.11.1
Independent Analytics – WordPress Analytics Plugin v2.11.1
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 All 120 releases
independent-analytics / vendor / symfony / translation / Loader / MoFileLoader.php
MoFileLoader.php
116 lines 4.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11 namespace IAWPSCOPED\Symfony\Component\Translation\Loader;
12
13 use IAWPSCOPED\Symfony\Component\Translation\Exception\InvalidResourceException;
14 /**
15 * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
16 * @internal
17 */
18 class MoFileLoader extends FileLoader
19 {
20 /**
21 * Magic used for validating the format of an MO file as well as
22 * detecting if the machine used to create that file was little endian.
23 */
24 public const MO_LITTLE_ENDIAN_MAGIC = 0x950412de;
25 /**
26 * Magic used for validating the format of an MO file as well as
27 * detecting if the machine used to create that file was big endian.
28 */
29 public const MO_BIG_ENDIAN_MAGIC = 0xde120495;
30 /**
31 * The size of the header of an MO file in bytes.
32 */
33 public const MO_HEADER_SIZE = 28;
34 /**
35 * Parses machine object (MO) format, independent of the machine's endian it
36 * was created on. Both 32bit and 64bit systems are supported.
37 *
38 * {@inheritdoc}
39 */
40 protected function loadResource(string $resource)
41 {
42 $stream = \fopen($resource, 'r');
43 $stat = \fstat($stream);
44 if ($stat['size'] < self::MO_HEADER_SIZE) {
45 throw new InvalidResourceException('MO stream content has an invalid format.');
46 }
47 $magic = \unpack('V1', \fread($stream, 4));
48 $magic = \hexdec(\substr(\dechex(\current($magic)), -8));
49 if (self::MO_LITTLE_ENDIAN_MAGIC == $magic) {
50 $isBigEndian = \false;
51 } elseif (self::MO_BIG_ENDIAN_MAGIC == $magic) {
52 $isBigEndian = \true;
53 } else {
54 throw new InvalidResourceException('MO stream content has an invalid format.');
55 }
56 // formatRevision
57 $this->readLong($stream, $isBigEndian);
58 $count = $this->readLong($stream, $isBigEndian);
59 $offsetId = $this->readLong($stream, $isBigEndian);
60 $offsetTranslated = $this->readLong($stream, $isBigEndian);
61 // sizeHashes
62 $this->readLong($stream, $isBigEndian);
63 // offsetHashes
64 $this->readLong($stream, $isBigEndian);
65 $messages = [];
66 for ($i = 0; $i < $count; ++$i) {
67 $pluralId = null;
68 $translated = null;
69 \fseek($stream, $offsetId + $i * 8);
70 $length = $this->readLong($stream, $isBigEndian);
71 $offset = $this->readLong($stream, $isBigEndian);
72 if ($length < 1) {
73 continue;
74 }
75 \fseek($stream, $offset);
76 $singularId = \fread($stream, $length);
77 if (\str_contains($singularId, "\x00")) {
78 [$singularId, $pluralId] = \explode("\x00", $singularId);
79 }
80 \fseek($stream, $offsetTranslated + $i * 8);
81 $length = $this->readLong($stream, $isBigEndian);
82 $offset = $this->readLong($stream, $isBigEndian);
83 if ($length < 1) {
84 continue;
85 }
86 \fseek($stream, $offset);
87 $translated = \fread($stream, $length);
88 if (\str_contains($translated, "\x00")) {
89 $translated = \explode("\x00", $translated);
90 }
91 $ids = ['singular' => $singularId, 'plural' => $pluralId];
92 $item = \compact('ids', 'translated');
93 if (!empty($item['ids']['singular'])) {
94 $id = $item['ids']['singular'];
95 if (isset($item['ids']['plural'])) {
96 $id .= '|' . $item['ids']['plural'];
97 }
98 $messages[$id] = \stripcslashes(\implode('|', (array) $item['translated']));
99 }
100 }
101 \fclose($stream);
102 return \array_filter($messages);
103 }
104 /**
105 * Reads an unsigned long from stream respecting endianness.
106 *
107 * @param resource $stream
108 */
109 private function readLong($stream, bool $isBigEndian) : int
110 {
111 $result = \unpack($isBigEndian ? 'N1' : 'V1', \fread($stream, 4));
112 $result = \current($result);
113 return (int) \substr($result, -8);
114 }
115 }
116