PluginProbe ʕ •ᴥ•ʔ
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress / trunk
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress vtrunk
4.17.2 4.17.1 4.17.0 4.16.19 4.16.18 4.16.17 4.16.16 trunk 1.0 1.0.1 1.0.2 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5a 1.1.6 1.1.7 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.4 1.4.1 1.4.2 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.7 1.7.1 1.7.2 1.8 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.1.9 2.2.10 2.2.11 2.2.12 2.2.13 2.2.14 2.2.15 2.2.16 2.2.2 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 3.0 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 3.1.19 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 4.0.0 4.0.1 4.0.2 4.0.3 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.13.4 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.15.0 4.15.1 4.15.10 4.15.11 4.15.12 4.15.13 4.15.14 4.15.15 4.15.16 4.15.17 4.15.18 4.15.19 4.15.2 4.15.20 4.15.20.1 4.15.21 4.15.22 4.15.23 4.15.24 4.15.25 4.15.3 4.15.4 4.15.5 4.15.6 4.15.7 4.15.8 4.15.9 4.16.0 4.16.1 4.16.10 4.16.11 4.16.12 4.16.13 4.16.14 4.16.15 4.16.2 4.16.3 4.16.4 4.16.5 4.16.6 4.16.7 4.16.8 4.16.9 4.2.0 4.3.0 4.3.1 4.3.2 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.7.0 4.8.0 4.9.0
wp-user-avatar / third-party / vendor / symfony / translation / Loader / XliffFileLoader.php
wp-user-avatar / third-party / vendor / symfony / translation / Loader Last commit date
ArrayLoader.php 2 months ago CsvFileLoader.php 2 months ago FileLoader.php 2 months ago IcuDatFileLoader.php 2 months ago IcuResFileLoader.php 2 months ago IniFileLoader.php 2 months ago JsonFileLoader.php 2 months ago LoaderInterface.php 2 months ago MoFileLoader.php 2 months ago PhpFileLoader.php 2 months ago PoFileLoader.php 2 months ago QtFileLoader.php 2 months ago XliffFileLoader.php 2 months ago YamlFileLoader.php 2 months ago
XliffFileLoader.php
189 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 ProfilePressVendor\Symfony\Component\Translation\Loader;
12
13 use ProfilePressVendor\Symfony\Component\Config\Resource\FileResource;
14 use ProfilePressVendor\Symfony\Component\Config\Util\Exception\InvalidXmlException;
15 use ProfilePressVendor\Symfony\Component\Config\Util\Exception\XmlParsingException;
16 use ProfilePressVendor\Symfony\Component\Config\Util\XmlUtils;
17 use ProfilePressVendor\Symfony\Component\Translation\Exception\InvalidResourceException;
18 use ProfilePressVendor\Symfony\Component\Translation\Exception\NotFoundResourceException;
19 use ProfilePressVendor\Symfony\Component\Translation\Exception\RuntimeException;
20 use ProfilePressVendor\Symfony\Component\Translation\MessageCatalogue;
21 use ProfilePressVendor\Symfony\Component\Translation\Util\XliffUtils;
22 /**
23 * XliffFileLoader loads translations from XLIFF files.
24 *
25 * @author Fabien Potencier <fabien@symfony.com>
26 */
27 class XliffFileLoader implements LoaderInterface
28 {
29 /**
30 * {@inheritdoc}
31 */
32 public function load($resource, string $locale, string $domain = 'messages')
33 {
34 if (!class_exists(XmlUtils::class)) {
35 throw new RuntimeException('Loading translations from the Xliff format requires the Symfony Config component.');
36 }
37 if (!$this->isXmlString($resource)) {
38 if (!stream_is_local($resource)) {
39 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
40 }
41 if (!file_exists($resource)) {
42 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
43 }
44 if (!is_file($resource)) {
45 throw new InvalidResourceException(sprintf('This is neither a file nor an XLIFF string "%s".', $resource));
46 }
47 }
48 try {
49 if ($this->isXmlString($resource)) {
50 $dom = XmlUtils::parse($resource);
51 } else {
52 $dom = XmlUtils::loadFile($resource);
53 }
54 } catch (\InvalidArgumentException|XmlParsingException|InvalidXmlException $e) {
55 throw new InvalidResourceException(sprintf('Unable to load "%s": ', $resource) . $e->getMessage(), $e->getCode(), $e);
56 }
57 if ($errors = XliffUtils::validateSchema($dom)) {
58 throw new InvalidResourceException(sprintf('Invalid resource provided: "%s"; Errors: ', $resource) . XliffUtils::getErrorsAsString($errors));
59 }
60 $catalogue = new MessageCatalogue($locale);
61 $this->extract($dom, $catalogue, $domain);
62 if (is_file($resource) && class_exists(FileResource::class)) {
63 $catalogue->addResource(new FileResource($resource));
64 }
65 return $catalogue;
66 }
67 private function extract(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain)
68 {
69 $xliffVersion = XliffUtils::getVersionNumber($dom);
70 if ('1.2' === $xliffVersion) {
71 $this->extractXliff1($dom, $catalogue, $domain);
72 }
73 if ('2.0' === $xliffVersion) {
74 $this->extractXliff2($dom, $catalogue, $domain);
75 }
76 }
77 /**
78 * Extract messages and metadata from DOMDocument into a MessageCatalogue.
79 */
80 private function extractXliff1(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain)
81 {
82 $xml = simplexml_import_dom($dom);
83 $encoding = $dom->encoding ? strtoupper($dom->encoding) : null;
84 $namespace = 'urn:oasis:names:tc:xliff:document:1.2';
85 $xml->registerXPathNamespace('xliff', $namespace);
86 foreach ($xml->xpath('//xliff:file') as $file) {
87 $fileAttributes = $file->attributes();
88 $file->registerXPathNamespace('xliff', $namespace);
89 foreach ($file->xpath('.//xliff:trans-unit') as $translation) {
90 $attributes = $translation->attributes();
91 if (!(isset($attributes['resname']) || isset($translation->source))) {
92 continue;
93 }
94 $source = (string) (isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source);
95 if (isset($translation->target) && 'needs-translation' === (string) $translation->target->attributes()['state'] && \in_array((string) $translation->target, [$source, (string) $translation->source], \true)) {
96 continue;
97 }
98 // If the xlf file has another encoding specified, try to convert it because
99 // simple_xml will always return utf-8 encoded values
100 $target = $this->utf8ToCharset((string) ($translation->target ?? $translation->source), $encoding);
101 $catalogue->set($source, $target, $domain);
102 $metadata = ['source' => (string) $translation->source, 'file' => ['original' => (string) $fileAttributes['original']]];
103 if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) {
104 $metadata['notes'] = $notes;
105 }
106 if (isset($translation->target) && $translation->target->attributes()) {
107 $metadata['target-attributes'] = [];
108 foreach ($translation->target->attributes() as $key => $value) {
109 $metadata['target-attributes'][$key] = (string) $value;
110 }
111 }
112 if (isset($attributes['id'])) {
113 $metadata['id'] = (string) $attributes['id'];
114 }
115 $catalogue->setMetadata($source, $metadata, $domain);
116 }
117 }
118 }
119 private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain)
120 {
121 $xml = simplexml_import_dom($dom);
122 $encoding = $dom->encoding ? strtoupper($dom->encoding) : null;
123 $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0');
124 foreach ($xml->xpath('//xliff:unit') as $unit) {
125 foreach ($unit->segment as $segment) {
126 $attributes = $unit->attributes();
127 $source = $attributes['name'] ?? $segment->source;
128 // If the xlf file has another encoding specified, try to convert it because
129 // simple_xml will always return utf-8 encoded values
130 $target = $this->utf8ToCharset((string) ($segment->target ?? $segment->source), $encoding);
131 $catalogue->set((string) $source, $target, $domain);
132 $metadata = [];
133 if (isset($segment->target) && $segment->target->attributes()) {
134 $metadata['target-attributes'] = [];
135 foreach ($segment->target->attributes() as $key => $value) {
136 $metadata['target-attributes'][$key] = (string) $value;
137 }
138 }
139 if (isset($unit->notes)) {
140 $metadata['notes'] = [];
141 foreach ($unit->notes->note as $noteNode) {
142 $note = [];
143 foreach ($noteNode->attributes() as $key => $value) {
144 $note[$key] = (string) $value;
145 }
146 $note['content'] = (string) $noteNode;
147 $metadata['notes'][] = $note;
148 }
149 }
150 $catalogue->setMetadata((string) $source, $metadata, $domain);
151 }
152 }
153 }
154 /**
155 * Convert a UTF8 string to the specified encoding.
156 */
157 private function utf8ToCharset(string $content, ?string $encoding = null): string
158 {
159 if ('UTF-8' !== $encoding && !empty($encoding)) {
160 return mb_convert_encoding($content, $encoding, 'UTF-8');
161 }
162 return $content;
163 }
164 private function parseNotesMetadata(?\SimpleXMLElement $noteElement = null, ?string $encoding = null): array
165 {
166 $notes = [];
167 if (null === $noteElement) {
168 return $notes;
169 }
170 /** @var \SimpleXMLElement $xmlNote */
171 foreach ($noteElement as $xmlNote) {
172 $noteAttributes = $xmlNote->attributes();
173 $note = ['content' => $this->utf8ToCharset((string) $xmlNote, $encoding)];
174 if (isset($noteAttributes['priority'])) {
175 $note['priority'] = (int) $noteAttributes['priority'];
176 }
177 if (isset($noteAttributes['from'])) {
178 $note['from'] = (string) $noteAttributes['from'];
179 }
180 $notes[] = $note;
181 }
182 return $notes;
183 }
184 private function isXmlString(string $resource): bool
185 {
186 return 0 === strpos($resource, '<?xml');
187 }
188 }
189