6a7f65563d74da895542d810dd8a8476d8f479db
[yaffs-website] / vendor / symfony / translation / Dumper / XliffFileDumper.php
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
12 namespace Symfony\Component\Translation\Dumper;
13
14 use Symfony\Component\Translation\MessageCatalogue;
15
16 /**
17  * XliffFileDumper generates xliff files from a message catalogue.
18  *
19  * @author Michel Salib <michelsalib@hotmail.com>
20  */
21 class XliffFileDumper extends FileDumper
22 {
23     /**
24      * {@inheritdoc}
25      */
26     public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
27     {
28         $xliffVersion = '1.2';
29         if (array_key_exists('xliff_version', $options)) {
30             $xliffVersion = $options['xliff_version'];
31         }
32
33         if (array_key_exists('default_locale', $options)) {
34             $defaultLocale = $options['default_locale'];
35         } else {
36             $defaultLocale = \Locale::getDefault();
37         }
38
39         if ('1.2' === $xliffVersion) {
40             return $this->dumpXliff1($defaultLocale, $messages, $domain, $options);
41         }
42         if ('2.0' === $xliffVersion) {
43             return $this->dumpXliff2($defaultLocale, $messages, $domain, $options);
44         }
45
46         throw new \InvalidArgumentException(sprintf('No support implemented for dumping XLIFF version "%s".', $xliffVersion));
47     }
48
49     /**
50      * {@inheritdoc}
51      */
52     protected function format(MessageCatalogue $messages, $domain)
53     {
54         @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
55
56         return $this->formatCatalogue($messages, $domain);
57     }
58
59     /**
60      * {@inheritdoc}
61      */
62     protected function getExtension()
63     {
64         return 'xlf';
65     }
66
67     private function dumpXliff1($defaultLocale, MessageCatalogue $messages, $domain, array $options = array())
68     {
69         $toolInfo = array('tool-id' => 'symfony', 'tool-name' => 'Symfony');
70         if (array_key_exists('tool_info', $options)) {
71             $toolInfo = array_merge($toolInfo, $options['tool_info']);
72         }
73
74         $dom = new \DOMDocument('1.0', 'utf-8');
75         $dom->formatOutput = true;
76
77         $xliff = $dom->appendChild($dom->createElement('xliff'));
78         $xliff->setAttribute('version', '1.2');
79         $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2');
80
81         $xliffFile = $xliff->appendChild($dom->createElement('file'));
82         $xliffFile->setAttribute('source-language', str_replace('_', '-', $defaultLocale));
83         $xliffFile->setAttribute('target-language', str_replace('_', '-', $messages->getLocale()));
84         $xliffFile->setAttribute('datatype', 'plaintext');
85         $xliffFile->setAttribute('original', 'file.ext');
86
87         $xliffHead = $xliffFile->appendChild($dom->createElement('header'));
88         $xliffTool = $xliffHead->appendChild($dom->createElement('tool'));
89         foreach ($toolInfo as $id => $value) {
90             $xliffTool->setAttribute($id, $value);
91         }
92
93         $xliffBody = $xliffFile->appendChild($dom->createElement('body'));
94         foreach ($messages->all($domain) as $source => $target) {
95             $translation = $dom->createElement('trans-unit');
96
97             $translation->setAttribute('id', md5($source));
98             $translation->setAttribute('resname', $source);
99
100             $s = $translation->appendChild($dom->createElement('source'));
101             $s->appendChild($dom->createTextNode($source));
102
103             // Does the target contain characters requiring a CDATA section?
104             $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
105
106             $targetElement = $dom->createElement('target');
107             $metadata = $messages->getMetadata($source, $domain);
108             if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
109                 foreach ($metadata['target-attributes'] as $name => $value) {
110                     $targetElement->setAttribute($name, $value);
111                 }
112             }
113             $t = $translation->appendChild($targetElement);
114             $t->appendChild($text);
115
116             if ($this->hasMetadataArrayInfo('notes', $metadata)) {
117                 foreach ($metadata['notes'] as $note) {
118                     if (!isset($note['content'])) {
119                         continue;
120                     }
121
122                     $n = $translation->appendChild($dom->createElement('note'));
123                     $n->appendChild($dom->createTextNode($note['content']));
124
125                     if (isset($note['priority'])) {
126                         $n->setAttribute('priority', $note['priority']);
127                     }
128
129                     if (isset($note['from'])) {
130                         $n->setAttribute('from', $note['from']);
131                     }
132                 }
133             }
134
135             $xliffBody->appendChild($translation);
136         }
137
138         return $dom->saveXML();
139     }
140
141     private function dumpXliff2($defaultLocale, MessageCatalogue $messages, $domain, array $options = array())
142     {
143         $dom = new \DOMDocument('1.0', 'utf-8');
144         $dom->formatOutput = true;
145
146         $xliff = $dom->appendChild($dom->createElement('xliff'));
147         $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:2.0');
148         $xliff->setAttribute('version', '2.0');
149         $xliff->setAttribute('srcLang', str_replace('_', '-', $defaultLocale));
150         $xliff->setAttribute('trgLang', str_replace('_', '-', $messages->getLocale()));
151
152         $xliffFile = $xliff->appendChild($dom->createElement('file'));
153         $xliffFile->setAttribute('id', $domain.'.'.$messages->getLocale());
154
155         foreach ($messages->all($domain) as $source => $target) {
156             $translation = $dom->createElement('unit');
157             $translation->setAttribute('id', md5($source));
158
159             $segment = $translation->appendChild($dom->createElement('segment'));
160
161             $s = $segment->appendChild($dom->createElement('source'));
162             $s->appendChild($dom->createTextNode($source));
163
164             // Does the target contain characters requiring a CDATA section?
165             $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
166
167             $targetElement = $dom->createElement('target');
168             $metadata = $messages->getMetadata($source, $domain);
169             if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
170                 foreach ($metadata['target-attributes'] as $name => $value) {
171                     $targetElement->setAttribute($name, $value);
172                 }
173             }
174             $t = $segment->appendChild($targetElement);
175             $t->appendChild($text);
176
177             $xliffFile->appendChild($translation);
178         }
179
180         return $dom->saveXML();
181     }
182
183     /**
184      * @param string     $key
185      * @param array|null $metadata
186      *
187      * @return bool
188      */
189     private function hasMetadataArrayInfo($key, $metadata = null)
190     {
191         return null !== $metadata && array_key_exists($key, $metadata) && ($metadata[$key] instanceof \Traversable || is_array($metadata[$key]));
192     }
193 }