PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.5
Independent Analytics – WordPress Analytics Plugin v2.15.5
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 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / vendor / symfony / translation / Loader / PoFileLoader.php
independent-analytics / vendor / symfony / translation / Loader Last commit date
ArrayLoader.php 1 month ago CsvFileLoader.php 1 month ago FileLoader.php 1 month ago IcuDatFileLoader.php 1 month ago IcuResFileLoader.php 1 month ago IniFileLoader.php 1 month ago JsonFileLoader.php 1 month ago LoaderInterface.php 1 month ago MoFileLoader.php 1 month ago PhpFileLoader.php 1 month ago PoFileLoader.php 1 month ago QtFileLoader.php 1 month ago XliffFileLoader.php 1 month ago YamlFileLoader.php 1 month ago
PoFileLoader.php
138 lines
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 /**
14 * @copyright Copyright (c) 2010, Union of RAD https://github.com/UnionOfRAD/lithium
15 * @copyright Copyright (c) 2012, Clemens Tolboom
16 * @internal
17 */
18 class PoFileLoader extends FileLoader
19 {
20 /**
21 * Parses portable object (PO) format.
22 *
23 * From https://www.gnu.org/software/gettext/manual/gettext.html#PO-Files
24 * we should be able to parse files having:
25 *
26 * white-space
27 * # translator-comments
28 * #. extracted-comments
29 * #: reference...
30 * #, flag...
31 * #| msgid previous-untranslated-string
32 * msgid untranslated-string
33 * msgstr translated-string
34 *
35 * extra or different lines are:
36 *
37 * #| msgctxt previous-context
38 * #| msgid previous-untranslated-string
39 * msgctxt context
40 *
41 * #| msgid previous-untranslated-string-singular
42 * #| msgid_plural previous-untranslated-string-plural
43 * msgid untranslated-string-singular
44 * msgid_plural untranslated-string-plural
45 * msgstr[0] translated-string-case-0
46 * ...
47 * msgstr[N] translated-string-case-n
48 *
49 * The definition states:
50 * - white-space and comments are optional.
51 * - msgid "" that an empty singleline defines a header.
52 *
53 * This parser sacrifices some features of the reference implementation the
54 * differences to that implementation are as follows.
55 * - No support for comments spanning multiple lines.
56 * - Translator and extracted comments are treated as being the same type.
57 * - Message IDs are allowed to have other encodings as just US-ASCII.
58 *
59 * Items with an empty id are ignored.
60 *
61 * {@inheritdoc}
62 */
63 protected function loadResource(string $resource) : array
64 {
65 $stream = \fopen($resource, 'r');
66 $defaults = ['ids' => [], 'translated' => null];
67 $messages = [];
68 $item = $defaults;
69 $flags = [];
70 while ($line = \fgets($stream)) {
71 $line = \trim($line);
72 if ('' === $line) {
73 // Whitespace indicated current item is done
74 if (!\in_array('fuzzy', $flags)) {
75 $this->addMessage($messages, $item);
76 }
77 $item = $defaults;
78 $flags = [];
79 } elseif ('#,' === \substr($line, 0, 2)) {
80 $flags = \array_map('trim', \explode(',', \substr($line, 2)));
81 } elseif ('msgid "' === \substr($line, 0, 7)) {
82 // We start a new msg so save previous
83 // TODO: this fails when comments or contexts are added
84 $this->addMessage($messages, $item);
85 $item = $defaults;
86 $item['ids']['singular'] = \substr($line, 7, -1);
87 } elseif ('msgstr "' === \substr($line, 0, 8)) {
88 $item['translated'] = \substr($line, 8, -1);
89 } elseif ('"' === $line[0]) {
90 $continues = isset($item['translated']) ? 'translated' : 'ids';
91 if (\is_array($item[$continues])) {
92 \end($item[$continues]);
93 $item[$continues][\key($item[$continues])] .= \substr($line, 1, -1);
94 } else {
95 $item[$continues] .= \substr($line, 1, -1);
96 }
97 } elseif ('msgid_plural "' === \substr($line, 0, 14)) {
98 $item['ids']['plural'] = \substr($line, 14, -1);
99 } elseif ('msgstr[' === \substr($line, 0, 7)) {
100 $size = \strpos($line, ']');
101 $item['translated'][(int) \substr($line, 7, 1)] = \substr($line, $size + 3, -1);
102 }
103 }
104 // save last item
105 if (!\in_array('fuzzy', $flags)) {
106 $this->addMessage($messages, $item);
107 }
108 \fclose($stream);
109 return $messages;
110 }
111 /**
112 * Save a translation item to the messages.
113 *
114 * A .po file could contain by error missing plural indexes. We need to
115 * fix these before saving them.
116 */
117 private function addMessage(array &$messages, array $item)
118 {
119 if (!empty($item['ids']['singular'])) {
120 $id = \stripcslashes($item['ids']['singular']);
121 if (isset($item['ids']['plural'])) {
122 $id .= '|' . \stripcslashes($item['ids']['plural']);
123 }
124 $translated = (array) $item['translated'];
125 // PO are by definition indexed so sort by index.
126 \ksort($translated);
127 // Make sure every index is filled.
128 \end($translated);
129 $count = \key($translated);
130 // Fill missing spots with '-'.
131 $empties = \array_fill(0, $count + 1, '-');
132 $translated += $empties;
133 \ksort($translated);
134 $messages[$id] = \stripcslashes(\implode('|', $translated));
135 }
136 }
137 }
138