aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/symfony/translation/Symfony
diff options
context:
space:
mode:
authorNicolas LÅ“uillet <nicolas.loeuillet@gmail.com>2013-08-03 19:26:54 +0200
committerNicolas LÅ“uillet <nicolas.loeuillet@gmail.com>2013-08-03 19:26:54 +0200
commit4f5b44bd3bd490309eb2ba7b44df4769816ba729 (patch)
tree6cefe170dfe0a5a361cb1e2d1fc4d580a3316d02 /vendor/symfony/translation/Symfony
parent2b840e0cfb63a453bea67a98541f3df9c273c5f5 (diff)
downloadwallabag-4f5b44bd3bd490309eb2ba7b44df4769816ba729.tar.gz
wallabag-4f5b44bd3bd490309eb2ba7b44df4769816ba729.tar.zst
wallabag-4f5b44bd3bd490309eb2ba7b44df4769816ba729.zip
twig implementation
Diffstat (limited to 'vendor/symfony/translation/Symfony')
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/.gitignore4
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/CHANGELOG.md27
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Catalogue/AbstractOperation.php146
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Catalogue/DiffOperation.php49
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Catalogue/MergeOperation.php45
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Catalogue/OperationInterface.php63
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/CsvFileDumper.php63
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/DumperInterface.php31
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/FileDumper.php65
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/IcuResFileDumper.php135
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/IniFileDumper.php45
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/MoFileDumper.php82
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/PhpFileDumper.php40
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/PoFileDumper.php55
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/QtFileDumper.php50
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/XliffFileDumper.php66
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Dumper/YamlFileDumper.php39
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Exception/ExceptionInterface.php23
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Exception/InvalidResourceException.php23
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Exception/NotFoundResourceException.php23
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Extractor/ChainExtractor.php60
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Extractor/ExtractorInterface.php38
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/IdentityTranslator.php74
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Interval.php107
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/LICENSE19
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/ArrayLoader.php70
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/CsvFileLoader.php92
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuDatFileLoader.php54
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuResFileLoader.php84
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/IniFileLoader.php45
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/LoaderInterface.php41
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/MoFileLoader.php179
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/PhpFileLoader.php49
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/PoFileLoader.php178
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/QtFileLoader.php95
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/XliffFileLoader.php163
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/YamlFileLoader.php71
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd2223
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xml.xsd309
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogue.php295
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogueInterface.php172
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/MessageSelector.php82
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/MetadataAwareInterface.php54
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/PluralizationRules.php219
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/README.md35
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTest.php74
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/DiffOperationTest.php60
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php60
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/CsvFileDumperTest.php33
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php37
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/IniFileDumperTest.php32
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/MoFileDumperTest.php31
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/PhpFileDumperTest.php32
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.php31
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/QtFileDumperTest.php32
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php32
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/YamlFileDumperTest.php39
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/IdentityTranslatorTest.php61
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/IntervalTest.php48
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.php67
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IcuDatFileLoaderTest.php72
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IcuResFileLoaderTest.php59
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IniFileLoaderTest.php57
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/LocalizedTestCase.php22
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/MoFileLoaderTest.php67
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/PhpFileLoaderTest.php56
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.php79
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/QtFileLoaderTest.php66
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php113
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/YamlFileLoaderTest.php81
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/MessageCatalogueTest.php212
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/MessageSelectorTest.php80
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.php124
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/TranslatorTest.php306
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty-translation.po3
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.csv0
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.ini0
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.mo0
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.po0
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.yml0
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/encoding.xlf15
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/invalid-xml-resources.xlf23
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/non-valid.xlf11
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/non-valid.yml1
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/plurals.mobin0 -> 74 bytes
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/plurals.po5
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resname.xlf19
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted/resources.dat1
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.resbin0 -> 120 bytes
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.txt3
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.resbin0 -> 124 bytes
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.txt3
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/packagelist.txt2
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/resources.datbin0 -> 352 bytes
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/res/en.resbin0 -> 84 bytes
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources-clean.xlf15
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.csv4
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.ini1
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.mobin0 -> 52 bytes
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.php5
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.po2
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.ts10
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.xlf23
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.yml1
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/valid.csv4
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/withdoctype.xlf12
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Translator.php282
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/TranslatorInterface.php69
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/Writer/TranslationWriter.php73
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/composer.json39
-rw-r--r--vendor/symfony/translation/Symfony/Component/Translation/phpunit.xml.dist29
111 files changed, 8600 insertions, 0 deletions
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/.gitignore b/vendor/symfony/translation/Symfony/Component/Translation/.gitignore
new file mode 100644
index 00000000..44de97a3
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/.gitignore
@@ -0,0 +1,4 @@
1vendor/
2composer.lock
3phpunit.xml
4
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/CHANGELOG.md b/vendor/symfony/translation/Symfony/Component/Translation/CHANGELOG.md
new file mode 100644
index 00000000..b8027ab1
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/CHANGELOG.md
@@ -0,0 +1,27 @@
1CHANGELOG
2=========
3
42.3.0
5-----
6
7 * added classes to make operations on catalogues (like making a diff or a merge on 2 catalogues)
8 * added Translator::getFallbackLocales()
9 * deprecated Translator::setFallbackLocale() in favor of the new Translator::setFallbackLocales() method
10
112.2.0
12-----
13
14 * QtTranslationsLoader class renamed to QtFileLoader. QtTranslationsLoader is deprecated and will be removed in 2.3.
15 * [BC BREAK] uniformized the exception thrown by the load() method when an error occurs. The load() method now
16 throws Symfony\Component\Translation\Exception\NotFoundResourceException when a resource cannot be found
17 and Symfony\Component\Translation\Exception\InvalidResourceException when a resource is invalid.
18 * changed the exception class thrown by some load() methods from \RuntimeException to \InvalidArgumentException
19 (IcuDatFileLoader, IcuResFileLoader and QtFileLoader)
20
212.1.0
22-----
23
24 * added support for more than one fallback locale
25 * added support for extracting translation messages from templates (Twig and PHP)
26 * added dumpers for translation catalogs
27 * added support for QT, gettext, and ResourceBundles
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/AbstractOperation.php b/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/AbstractOperation.php
new file mode 100644
index 00000000..062056b7
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/AbstractOperation.php
@@ -0,0 +1,146 @@
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
12namespace Symfony\Component\Translation\Catalogue;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\MessageCatalogueInterface;
16
17/**
18 * Base catalogues binary operation class.
19 *
20 * @author Jean-François Simon <contact@jfsimon.fr>
21 */
22abstract class AbstractOperation implements OperationInterface
23{
24 /**
25 * @var MessageCatalogueInterface
26 */
27 protected $source;
28
29 /**
30 * @var MessageCatalogueInterface
31 */
32 protected $target;
33
34 /**
35 * @var MessageCatalogue
36 */
37 protected $result;
38
39 /**
40 * @var null|array
41 */
42 private $domains;
43
44 /**
45 * @var array
46 */
47 protected $messages;
48
49 /**
50 * @param MessageCatalogueInterface $source
51 * @param MessageCatalogueInterface $target
52 *
53 * @throws \LogicException
54 */
55 public function __construct(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
56 {
57 if ($source->getLocale() !== $target->getLocale()) {
58 throw new \LogicException('Operated catalogues must belong to the same locale.');
59 }
60
61 $this->source = $source;
62 $this->target = $target;
63 $this->result = new MessageCatalogue($source->getLocale());
64 $this->domains = null;
65 $this->messages = array();
66 }
67
68 /**
69 * {@inheritdoc}
70 */
71 public function getDomains()
72 {
73 if (null === $this->domains) {
74 $this->domains = array_values(array_unique(array_merge($this->source->getDomains(), $this->target->getDomains())));
75 }
76
77 return $this->domains;
78 }
79
80 /**
81 * {@inheritdoc}
82 */
83 public function getMessages($domain)
84 {
85 if (!in_array($domain, $this->getDomains())) {
86 throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
87 }
88
89 if (!isset($this->messages[$domain]['all'])) {
90 $this->processDomain($domain);
91 }
92
93 return $this->messages[$domain]['all'];
94 }
95
96 /**
97 * {@inheritdoc}
98 */
99 public function getNewMessages($domain)
100 {
101 if (!in_array($domain, $this->getDomains())) {
102 throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
103 }
104
105 if (!isset($this->messages[$domain]['new'])) {
106 $this->processDomain($domain);
107 }
108
109 return $this->messages[$domain]['new'];
110 }
111
112 /**
113 * {@inheritdoc}
114 */
115 public function getObsoleteMessages($domain)
116 {
117 if (!in_array($domain, $this->getDomains())) {
118 throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
119 }
120
121 if (!isset($this->messages[$domain]['obsolete'])) {
122 $this->processDomain($domain);
123 }
124
125 return $this->messages[$domain]['obsolete'];
126 }
127
128 /**
129 * {@inheritdoc}
130 */
131 public function getResult()
132 {
133 foreach ($this->getDomains() as $domain) {
134 if (!isset($this->messages[$domain])) {
135 $this->processDomain($domain);
136 }
137 }
138
139 return $this->result;
140 }
141
142 /**
143 * @param string $domain
144 */
145 abstract protected function processDomain($domain);
146}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/DiffOperation.php b/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/DiffOperation.php
new file mode 100644
index 00000000..1672d121
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/DiffOperation.php
@@ -0,0 +1,49 @@
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
12namespace Symfony\Component\Translation\Catalogue;
13
14/**
15 * Diff operation between two catalogues.
16 *
17 * @author Jean-François Simon <contact@jfsimon.fr>
18 */
19class DiffOperation extends AbstractOperation
20{
21 /**
22 * {@inheritdoc}
23 */
24 protected function processDomain($domain)
25 {
26 $this->messages[$domain] = array(
27 'all' => array(),
28 'new' => array(),
29 'obsolete' => array(),
30 );
31
32 foreach ($this->source->all($domain) as $id => $message) {
33 if ($this->target->has($id, $domain)) {
34 $this->messages[$domain]['all'][$id] = $message;
35 $this->result->add(array($id => $message), $domain);
36 } else {
37 $this->messages[$domain]['obsolete'][$id] = $message;
38 }
39 }
40
41 foreach ($this->target->all($domain) as $id => $message) {
42 if (!$this->source->has($id, $domain)) {
43 $this->messages[$domain]['all'][$id] = $message;
44 $this->messages[$domain]['new'][$id] = $message;
45 $this->result->add(array($id => $message), $domain);
46 }
47 }
48 }
49}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/MergeOperation.php b/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/MergeOperation.php
new file mode 100644
index 00000000..0052363e
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/MergeOperation.php
@@ -0,0 +1,45 @@
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
12namespace Symfony\Component\Translation\Catalogue;
13
14/**
15 * Merge operation between two catalogues.
16 *
17 * @author Jean-François Simon <contact@jfsimon.fr>
18 */
19class MergeOperation extends AbstractOperation
20{
21 /**
22 * {@inheritdoc}
23 */
24 protected function processDomain($domain)
25 {
26 $this->messages[$domain] = array(
27 'all' => array(),
28 'new' => array(),
29 'obsolete' => array(),
30 );
31
32 foreach ($this->source->all($domain) as $id => $message) {
33 $this->messages[$domain]['all'][$id] = $message;
34 $this->result->add(array($id => $message), $domain);
35 }
36
37 foreach ($this->target->all($domain) as $id => $message) {
38 if (!$this->source->has($id, $domain)) {
39 $this->messages[$domain]['all'][$id] = $message;
40 $this->messages[$domain]['new'][$id] = $message;
41 $this->result->add(array($id => $message), $domain);
42 }
43 }
44 }
45}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/OperationInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/OperationInterface.php
new file mode 100644
index 00000000..d72378a3
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Catalogue/OperationInterface.php
@@ -0,0 +1,63 @@
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
12namespace Symfony\Component\Translation\Catalogue;
13
14use Symfony\Component\Translation\MessageCatalogueInterface;
15
16/**
17 * Represents an operation on catalogue(s).
18 *
19 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
20 */
21interface OperationInterface
22{
23 /**
24 * Returns domains affected by operation.
25 *
26 * @return array
27 */
28 public function getDomains();
29
30 /**
31 * Returns all valid messages after operation.
32 *
33 * @param string $domain
34 *
35 * @return array
36 */
37 public function getMessages($domain);
38
39 /**
40 * Returns new messages after operation.
41 *
42 * @param string $domain
43 *
44 * @return array
45 */
46 public function getNewMessages($domain);
47
48 /**
49 * Returns obsolete messages after operation.
50 *
51 * @param string $domain
52 *
53 * @return array
54 */
55 public function getObsoleteMessages($domain);
56
57 /**
58 * Returns resulting catalogue.
59 *
60 * @return MessageCatalogueInterface
61 */
62 public function getResult();
63}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/CsvFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/CsvFileDumper.php
new file mode 100644
index 00000000..0b411905
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/CsvFileDumper.php
@@ -0,0 +1,63 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * CsvFileDumper generates a csv formatted string representation of a message catalogue.
18 *
19 * @author Stealth35
20 */
21class CsvFileDumper extends FileDumper
22{
23 private $delimiter = ';';
24 private $enclosure = '"';
25
26 /**
27 * {@inheritDoc}
28 */
29 public function format(MessageCatalogue $messages, $domain = 'messages')
30 {
31 $handle = fopen('php://memory', 'rb+');
32
33 foreach ($messages->all($domain) as $source => $target) {
34 fputcsv($handle, array($source, $target), $this->delimiter, $this->enclosure);
35 }
36
37 rewind($handle);
38 $output = stream_get_contents($handle);
39 fclose($handle);
40
41 return $output;
42 }
43
44 /**
45 * Sets the delimiter and escape character for CSV.
46 *
47 * @param string $delimiter delimiter character
48 * @param string $enclosure enclosure character
49 */
50 public function setCsvControl($delimiter = ';', $enclosure = '"')
51 {
52 $this->delimiter = $delimiter;
53 $this->enclosure = $enclosure;
54 }
55
56 /**
57 * {@inheritDoc}
58 */
59 protected function getExtension()
60 {
61 return 'csv';
62 }
63}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/DumperInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/DumperInterface.php
new file mode 100644
index 00000000..cebc65ed
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/DumperInterface.php
@@ -0,0 +1,31 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * DumperInterface is the interface implemented by all translation dumpers.
18 * There is no common option.
19 *
20 * @author Michel Salib <michelsalib@hotmail.com>
21 */
22interface DumperInterface
23{
24 /**
25 * Dumps the message catalogue.
26 *
27 * @param MessageCatalogue $messages The message catalogue
28 * @param array $options Options that are used by the dumper
29 */
30 public function dump(MessageCatalogue $messages, $options = array());
31}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/FileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/FileDumper.php
new file mode 100644
index 00000000..63c1e6c3
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/FileDumper.php
@@ -0,0 +1,65 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s).
18 * Performs backup of already existing files.
19 *
20 * Options:
21 * - path (mandatory): the directory where the files should be saved
22 *
23 * @author Michel Salib <michelsalib@hotmail.com>
24 */
25abstract class FileDumper implements DumperInterface
26{
27 /**
28 * {@inheritDoc}
29 */
30 public function dump(MessageCatalogue $messages, $options = array())
31 {
32 if (!array_key_exists('path', $options)) {
33 throw new \InvalidArgumentException('The file dumper need a path options.');
34 }
35
36 // save a file for each domain
37 foreach ($messages->getDomains() as $domain) {
38 $file = $domain.'.'.$messages->getLocale().'.'.$this->getExtension();
39 // backup
40 $fullpath = $options['path'].'/'.$file;
41 if (file_exists($fullpath)) {
42 copy($fullpath, $fullpath.'~');
43 }
44 // save file
45 file_put_contents($fullpath, $this->format($messages, $domain));
46 }
47 }
48
49 /**
50 * Transforms a domain of a message catalogue to its string representation.
51 *
52 * @param MessageCatalogue $messages
53 * @param string $domain
54 *
55 * @return string representation
56 */
57 abstract protected function format(MessageCatalogue $messages, $domain);
58
59 /**
60 * Gets the file extension of the dumper.
61 *
62 * @return string file extension
63 */
64 abstract protected function getExtension();
65}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IcuResFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IcuResFileDumper.php
new file mode 100644
index 00000000..979153ac
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IcuResFileDumper.php
@@ -0,0 +1,135 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * IcuResDumper generates an ICU ResourceBundle formatted string representation of a message catalogue.
18 *
19 * @author Stealth35
20 */
21class IcuResFileDumper implements DumperInterface
22{
23 /**
24 * {@inheritDoc}
25 */
26 public function dump(MessageCatalogue $messages, $options = array())
27 {
28 if (!array_key_exists('path', $options)) {
29 throw new \InvalidArgumentException('The file dumper need a path options.');
30 }
31
32 // save a file for each domain
33 foreach ($messages->getDomains() as $domain) {
34 $file = $messages->getLocale().'.'.$this->getExtension();
35 $path = $options['path'].'/'.$domain.'/';
36
37 if (!file_exists($path)) {
38 mkdir($path);
39 }
40
41 // backup
42 if (file_exists($path.$file)) {
43 copy($path.$file, $path.$file.'~');
44 }
45
46 // save file
47 file_put_contents($path.$file, $this->format($messages, $domain));
48 }
49 }
50
51 /**
52 * {@inheritDoc}
53 */
54 public function format(MessageCatalogue $messages, $domain = 'messages')
55 {
56 $data = $indexes = $resources = '';
57
58 foreach ($messages->all($domain) as $source => $target) {
59 $indexes .= pack('v', strlen($data) + 28);
60 $data .= $source."\0";
61 }
62
63 $data .= $this->writePadding($data);
64
65 $keyTop = $this->getPosition($data);
66
67 foreach ($messages->all($domain) as $source => $target) {
68 $resources .= pack('V', $this->getPosition($data));
69
70 $data .= pack('V', strlen($target))
71 .mb_convert_encoding($target."\0", 'UTF-16LE', 'UTF-8')
72 .$this->writePadding($data)
73 ;
74 }
75
76 $resOffset = $this->getPosition($data);
77
78 $data .= pack('v', count($messages))
79 .$indexes
80 .$this->writePadding($data)
81 .$resources
82 ;
83
84 $bundleTop = $this->getPosition($data);
85
86 $root = pack('V7',
87 $resOffset + (2 << 28), // Resource Offset + Resource Type
88 6, // Index length
89 $keyTop, // Index keys top
90 $bundleTop, // Index resources top
91 $bundleTop, // Index bundle top
92 count($messages), // Index max table length
93 0 // Index attributes
94 );
95
96 $header = pack('vC2v4C12@32',
97 32, // Header size
98 0xDA, 0x27, // Magic number 1 and 2
99 20, 0, 0, 2, // Rest of the header, ..., Size of a char
100 0x52, 0x65, 0x73, 0x42, // Data format identifier
101 1, 2, 0, 0, // Data version
102 1, 4, 0, 0 // Unicode version
103 );
104
105 $output = $header
106 .$root
107 .$data;
108
109 return $output;
110 }
111
112 private function writePadding($data)
113 {
114 $padding = strlen($data) % 4;
115
116 if ($padding) {
117 return str_repeat("\xAA", 4 - $padding);
118 }
119 }
120
121 private function getPosition($data)
122 {
123 $position = (strlen($data) + 28) / 4;
124
125 return $position;
126 }
127
128 /**
129 * {@inheritDoc}
130 */
131 protected function getExtension()
132 {
133 return 'res';
134 }
135}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IniFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IniFileDumper.php
new file mode 100644
index 00000000..173cf8c1
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IniFileDumper.php
@@ -0,0 +1,45 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * IniFileDumper generates an ini formatted string representation of a message catalogue.
18 *
19 * @author Stealth35
20 */
21class IniFileDumper extends FileDumper
22{
23 /**
24 * {@inheritDoc}
25 */
26 public function format(MessageCatalogue $messages, $domain = 'messages')
27 {
28 $output = '';
29
30 foreach ($messages->all($domain) as $source => $target) {
31 $escapeTarget = str_replace('"', '\"', $target);
32 $output .= $source.'="'.$escapeTarget."\"\n";
33 }
34
35 return $output;
36 }
37
38 /**
39 * {@inheritDoc}
40 */
41 protected function getExtension()
42 {
43 return 'ini';
44 }
45}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/MoFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/MoFileDumper.php
new file mode 100644
index 00000000..a3a2a649
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/MoFileDumper.php
@@ -0,0 +1,82 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Loader\MoFileLoader;
16
17/**
18 * MoFileDumper generates a gettext formatted string representation of a message catalogue.
19 *
20 * @author Stealth35
21 */
22class MoFileDumper extends FileDumper
23{
24 /**
25 * {@inheritDoc}
26 */
27 public function format(MessageCatalogue $messages, $domain = 'messages')
28 {
29 $output = $sources = $targets = $sourceOffsets = $targetOffsets = '';
30 $offsets = array();
31 $size = 0;
32
33 foreach ($messages->all($domain) as $source => $target) {
34 $offsets[] = array_map('strlen', array($sources, $source, $targets, $target));
35 $sources .= "\0".$source;
36 $targets .= "\0".$target;
37 ++$size;
38 }
39
40 $header = array(
41 'magicNumber' => MoFileLoader::MO_LITTLE_ENDIAN_MAGIC,
42 'formatRevision' => 0,
43 'count' => $size,
44 'offsetId' => MoFileLoader::MO_HEADER_SIZE,
45 'offsetTranslated' => MoFileLoader::MO_HEADER_SIZE + (8 * $size),
46 'sizeHashes' => 0,
47 'offsetHashes' => MoFileLoader::MO_HEADER_SIZE + (16 * $size),
48 );
49
50 $sourcesSize = strlen($sources);
51 $sourcesStart = $header['offsetHashes'] + 1;
52
53 foreach ($offsets as $offset) {
54 $sourceOffsets .= $this->writeLong($offset[1])
55 .$this->writeLong($offset[0] + $sourcesStart);
56 $targetOffsets .= $this->writeLong($offset[3])
57 .$this->writeLong($offset[2] + $sourcesStart + $sourcesSize);
58 }
59
60 $output = implode(array_map(array($this, 'writeLong'), $header))
61 .$sourceOffsets
62 .$targetOffsets
63 .$sources
64 .$targets
65 ;
66
67 return $output;
68 }
69
70 /**
71 * {@inheritDoc}
72 */
73 protected function getExtension()
74 {
75 return 'mo';
76 }
77
78 private function writeLong($str)
79 {
80 return pack('V*', $str);
81 }
82}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PhpFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PhpFileDumper.php
new file mode 100644
index 00000000..8de4a5b4
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PhpFileDumper.php
@@ -0,0 +1,40 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * PhpFileDumper generates php files from a message catalogue.
18 *
19 * @author Michel Salib <michelsalib@hotmail.com>
20 */
21class PhpFileDumper extends FileDumper
22{
23 /**
24 * {@inheritDoc}
25 */
26 protected function format(MessageCatalogue $messages, $domain)
27 {
28 $output = "<?php\n\nreturn ".var_export($messages->all($domain), true).";\n";
29
30 return $output;
31 }
32
33 /**
34 * {@inheritDoc}
35 */
36 protected function getExtension()
37 {
38 return 'php';
39 }
40}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PoFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PoFileDumper.php
new file mode 100644
index 00000000..d957ab91
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PoFileDumper.php
@@ -0,0 +1,55 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * PoFileDumper generates a gettext formatted string representation of a message catalogue.
18 *
19 * @author Stealth35
20 */
21class PoFileDumper extends FileDumper
22{
23 /**
24 * {@inheritDoc}
25 */
26 public function format(MessageCatalogue $messages, $domain = 'messages')
27 {
28 $output = '';
29 $newLine = false;
30 foreach ($messages->all($domain) as $source => $target) {
31 if ($newLine) {
32 $output .= "\n";
33 } else {
34 $newLine = true;
35 }
36 $output .= sprintf('msgid "%s"'."\n", $this->escape($source));
37 $output .= sprintf('msgstr "%s"', $this->escape($target));
38 }
39
40 return $output;
41 }
42
43 /**
44 * {@inheritDoc}
45 */
46 protected function getExtension()
47 {
48 return 'po';
49 }
50
51 private function escape($str)
52 {
53 return addcslashes($str, "\0..\37\42\134");
54 }
55}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/QtFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/QtFileDumper.php
new file mode 100644
index 00000000..a1a84805
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/QtFileDumper.php
@@ -0,0 +1,50 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * QtFileDumper generates ts files from a message catalogue.
18 *
19 * @author Benjamin Eberlei <kontakt@beberlei.de>
20 */
21class QtFileDumper extends FileDumper
22{
23 /**
24 * {@inheritDoc}
25 */
26 public function format(MessageCatalogue $messages, $domain)
27 {
28 $dom = new \DOMDocument('1.0', 'utf-8');
29 $dom->formatOutput = true;
30 $ts = $dom->appendChild($dom->createElement('TS'));
31 $context = $ts->appendChild($dom->createElement('context'));
32 $context->appendChild($dom->createElement('name', $domain));
33
34 foreach ($messages->all($domain) as $source => $target) {
35 $message = $context->appendChild($dom->createElement('message'));
36 $message->appendChild($dom->createElement('source', $source));
37 $message->appendChild($dom->createElement('translation', $target));
38 }
39
40 return $dom->saveXML();
41 }
42
43 /**
44 * {@inheritDoc}
45 */
46 protected function getExtension()
47 {
48 return 'ts';
49 }
50}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/XliffFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/XliffFileDumper.php
new file mode 100644
index 00000000..0d258aad
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/XliffFileDumper.php
@@ -0,0 +1,66 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * XliffFileDumper generates xliff files from a message catalogue.
18 *
19 * @author Michel Salib <michelsalib@hotmail.com>
20 */
21class XliffFileDumper extends FileDumper
22{
23 /**
24 * {@inheritDoc}
25 */
26 protected function format(MessageCatalogue $messages, $domain)
27 {
28 $dom = new \DOMDocument('1.0', 'utf-8');
29 $dom->formatOutput = true;
30
31 $xliff = $dom->appendChild($dom->createElement('xliff'));
32 $xliff->setAttribute('version', '1.2');
33 $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2');
34
35 $xliffFile = $xliff->appendChild($dom->createElement('file'));
36 $xliffFile->setAttribute('source-language', $messages->getLocale());
37 $xliffFile->setAttribute('datatype', 'plaintext');
38 $xliffFile->setAttribute('original', 'file.ext');
39
40 $xliffBody = $xliffFile->appendChild($dom->createElement('body'));
41 foreach ($messages->all($domain) as $source => $target) {
42 $translation = $dom->createElement('trans-unit');
43
44 $translation->setAttribute('id', md5($source));
45 $translation->setAttribute('resname', $source);
46
47 $s = $translation->appendChild($dom->createElement('source'));
48 $s->appendChild($dom->createTextNode($source));
49
50 $t = $translation->appendChild($dom->createElement('target'));
51 $t->appendChild($dom->createTextNode($target));
52
53 $xliffBody->appendChild($translation);
54 }
55
56 return $dom->saveXML();
57 }
58
59 /**
60 * {@inheritDoc}
61 */
62 protected function getExtension()
63 {
64 return 'xlf';
65 }
66}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/YamlFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/YamlFileDumper.php
new file mode 100644
index 00000000..d8072fb7
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/YamlFileDumper.php
@@ -0,0 +1,39 @@
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
12namespace Symfony\Component\Translation\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Yaml\Yaml;
16
17/**
18 * YamlFileDumper generates yaml files from a message catalogue.
19 *
20 * @author Michel Salib <michelsalib@hotmail.com>
21 */
22class YamlFileDumper extends FileDumper
23{
24 /**
25 * {@inheritDoc}
26 */
27 protected function format(MessageCatalogue $messages, $domain)
28 {
29 return Yaml::dump($messages->all($domain));
30 }
31
32 /**
33 * {@inheritDoc}
34 */
35 protected function getExtension()
36 {
37 return 'yml';
38 }
39}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Exception/ExceptionInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/Exception/ExceptionInterface.php
new file mode 100644
index 00000000..7757e669
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Exception/ExceptionInterface.php
@@ -0,0 +1,23 @@
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
12namespace Symfony\Component\Translation\Exception;
13
14/**
15 * Exception interface for all exceptions thrown by the component.
16 *
17 * @author Fabien Potencier <fabien@symfony.com>
18 *
19 * @api
20 */
21interface ExceptionInterface
22{
23}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Exception/InvalidResourceException.php b/vendor/symfony/translation/Symfony/Component/Translation/Exception/InvalidResourceException.php
new file mode 100644
index 00000000..6413f1ae
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Exception/InvalidResourceException.php
@@ -0,0 +1,23 @@
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
12namespace Symfony\Component\Translation\Exception;
13
14/**
15 * Thrown when a resource cannot be loaded.
16 *
17 * @author Fabien Potencier <fabien@symfony.com>
18 *
19 * @api
20 */
21class InvalidResourceException extends \InvalidArgumentException implements ExceptionInterface
22{
23}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Exception/NotFoundResourceException.php b/vendor/symfony/translation/Symfony/Component/Translation/Exception/NotFoundResourceException.php
new file mode 100644
index 00000000..7826e5ce
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Exception/NotFoundResourceException.php
@@ -0,0 +1,23 @@
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
12namespace Symfony\Component\Translation\Exception;
13
14/**
15 * Thrown when a resource does not exist.
16 *
17 * @author Fabien Potencier <fabien@symfony.com>
18 *
19 * @api
20 */
21class NotFoundResourceException extends \InvalidArgumentException implements ExceptionInterface
22{
23}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Extractor/ChainExtractor.php b/vendor/symfony/translation/Symfony/Component/Translation/Extractor/ChainExtractor.php
new file mode 100644
index 00000000..0d07a93f
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Extractor/ChainExtractor.php
@@ -0,0 +1,60 @@
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
12namespace Symfony\Component\Translation\Extractor;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * ChainExtractor extracts translation messages from template files.
18 *
19 * @author Michel Salib <michelsalib@hotmail.com>
20 */
21class ChainExtractor implements ExtractorInterface
22{
23 /**
24 * The extractors.
25 *
26 * @var ExtractorInterface[]
27 */
28 private $extractors = array();
29
30 /**
31 * Adds a loader to the translation extractor.
32 *
33 * @param string $format The format of the loader
34 * @param ExtractorInterface $extractor The loader
35 */
36 public function addExtractor($format, ExtractorInterface $extractor)
37 {
38 $this->extractors[$format] = $extractor;
39 }
40
41 /**
42 * {@inheritDoc}
43 */
44 public function setPrefix($prefix)
45 {
46 foreach ($this->extractors as $extractor) {
47 $extractor->setPrefix($prefix);
48 }
49 }
50
51 /**
52 * {@inheritDoc}
53 */
54 public function extract($directory, MessageCatalogue $catalogue)
55 {
56 foreach ($this->extractors as $extractor) {
57 $extractor->extract($directory, $catalogue);
58 }
59 }
60}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Extractor/ExtractorInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/Extractor/ExtractorInterface.php
new file mode 100644
index 00000000..6f877c31
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Extractor/ExtractorInterface.php
@@ -0,0 +1,38 @@
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
12namespace Symfony\Component\Translation\Extractor;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * Extracts translation messages from a template directory to the catalogue.
18 * New found messages are injected to the catalogue using the prefix.
19 *
20 * @author Michel Salib <michelsalib@hotmail.com>
21 */
22interface ExtractorInterface
23{
24 /**
25 * Extracts translation messages from a template directory to the catalogue.
26 *
27 * @param string $directory The path to look into
28 * @param MessageCatalogue $catalogue The catalogue
29 */
30 public function extract($directory, MessageCatalogue $catalogue);
31
32 /**
33 * Sets the prefix that should be used for new found messages.
34 *
35 * @param string $prefix The prefix
36 */
37 public function setPrefix($prefix);
38}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/IdentityTranslator.php b/vendor/symfony/translation/Symfony/Component/Translation/IdentityTranslator.php
new file mode 100644
index 00000000..f30556b5
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/IdentityTranslator.php
@@ -0,0 +1,74 @@
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
12namespace Symfony\Component\Translation;
13
14/**
15 * IdentityTranslator does not translate anything.
16 *
17 * @author Fabien Potencier <fabien@symfony.com>
18 *
19 * @api
20 */
21class IdentityTranslator implements TranslatorInterface
22{
23 private $selector;
24
25 /**
26 * Constructor.
27 *
28 * @param MessageSelector $selector The message selector for pluralization
29 *
30 * @api
31 */
32 public function __construct(MessageSelector $selector)
33 {
34 $this->selector = $selector;
35 }
36
37 /**
38 * {@inheritdoc}
39 *
40 * @api
41 */
42 public function setLocale($locale)
43 {
44 }
45
46 /**
47 * {@inheritdoc}
48 *
49 * @api
50 */
51 public function getLocale()
52 {
53 }
54
55 /**
56 * {@inheritdoc}
57 *
58 * @api
59 */
60 public function trans($id, array $parameters = array(), $domain = 'messages', $locale = null)
61 {
62 return strtr((string) $id, $parameters);
63 }
64
65 /**
66 * {@inheritdoc}
67 *
68 * @api
69 */
70 public function transChoice($id, $number, array $parameters = array(), $domain = 'messages', $locale = null)
71 {
72 return strtr($this->selector->choose((string) $id, (int) $number, $locale), $parameters);
73 }
74}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Interval.php b/vendor/symfony/translation/Symfony/Component/Translation/Interval.php
new file mode 100644
index 00000000..033b0188
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Interval.php
@@ -0,0 +1,107 @@
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
12namespace Symfony\Component\Translation;
13
14/**
15 * Tests if a given number belongs to a given math interval.
16 *
17 * An interval can represent a finite set of numbers:
18 *
19 * {1,2,3,4}
20 *
21 * An interval can represent numbers between two numbers:
22 *
23 * [1, +Inf]
24 * ]-1,2[
25 *
26 * The left delimiter can be [ (inclusive) or ] (exclusive).
27 * The right delimiter can be [ (exclusive) or ] (inclusive).
28 * Beside numbers, you can use -Inf and +Inf for the infinite.
29 *
30 * @author Fabien Potencier <fabien@symfony.com>
31 *
32 * @see http://en.wikipedia.org/wiki/Interval_%28mathematics%29#The_ISO_notation
33 */
34class Interval
35{
36 /**
37 * Tests if the given number is in the math interval.
38 *
39 * @param integer $number A number
40 * @param string $interval An interval
41 *
42 * @return Boolean
43 *
44 * @throws \InvalidArgumentException
45 */
46 public static function test($number, $interval)
47 {
48 $interval = trim($interval);
49
50 if (!preg_match('/^'.self::getIntervalRegexp().'$/x', $interval, $matches)) {
51 throw new \InvalidArgumentException(sprintf('"%s" is not a valid interval.', $interval));
52 }
53
54 if ($matches[1]) {
55 foreach (explode(',', $matches[2]) as $n) {
56 if ($number == $n) {
57 return true;
58 }
59 }
60 } else {
61 $leftNumber = self::convertNumber($matches['left']);
62 $rightNumber = self::convertNumber($matches['right']);
63
64 return
65 ('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber)
66 && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber)
67 ;
68 }
69
70 return false;
71 }
72
73 /**
74 * Returns a Regexp that matches valid intervals.
75 *
76 * @return string A Regexp (without the delimiters)
77 */
78 public static function getIntervalRegexp()
79 {
80 return <<<EOF
81 ({\s*
82 (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*)
83 \s*})
84
85 |
86
87 (?P<left_delimiter>[\[\]])
88 \s*
89 (?P<left>-Inf|\-?\d+(\.\d+)?)
90 \s*,\s*
91 (?P<right>\+?Inf|\-?\d+(\.\d+)?)
92 \s*
93 (?P<right_delimiter>[\[\]])
94EOF;
95 }
96
97 private static function convertNumber($number)
98 {
99 if ('-Inf' === $number) {
100 return log(0);
101 } elseif ('+Inf' === $number || 'Inf' === $number) {
102 return -log(0);
103 }
104
105 return (float) $number;
106 }
107}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/LICENSE b/vendor/symfony/translation/Symfony/Component/Translation/LICENSE
new file mode 100644
index 00000000..88a57f8d
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/LICENSE
@@ -0,0 +1,19 @@
1Copyright (c) 2004-2013 Fabien Potencier
2
3Permission is hereby granted, free of charge, to any person obtaining a copy
4of this software and associated documentation files (the "Software"), to deal
5in the Software without restriction, including without limitation the rights
6to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7copies of the Software, and to permit persons to whom the Software is furnished
8to do so, subject to the following conditions:
9
10The above copyright notice and this permission notice shall be included in all
11copies or substantial portions of the Software.
12
13THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19THE SOFTWARE.
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/ArrayLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/ArrayLoader.php
new file mode 100644
index 00000000..99058fbf
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/ArrayLoader.php
@@ -0,0 +1,70 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16/**
17 * ArrayLoader loads translations from a PHP array.
18 *
19 * @author Fabien Potencier <fabien@symfony.com>
20 *
21 * @api
22 */
23class ArrayLoader implements LoaderInterface
24{
25 /**
26 * {@inheritdoc}
27 *
28 * @api
29 */
30 public function load($resource, $locale, $domain = 'messages')
31 {
32 $this->flatten($resource);
33 $catalogue = new MessageCatalogue($locale);
34 $catalogue->add($resource, $domain);
35
36 return $catalogue;
37 }
38
39 /**
40 * Flattens an nested array of translations
41 *
42 * The scheme used is:
43 * 'key' => array('key2' => array('key3' => 'value'))
44 * Becomes:
45 * 'key.key2.key3' => 'value'
46 *
47 * This function takes an array by reference and will modify it
48 *
49 * @param array &$messages The array that will be flattened
50 * @param array $subnode Current subnode being parsed, used internally for recursive calls
51 * @param string $path Current path being parsed, used internally for recursive calls
52 */
53 private function flatten(array &$messages, array $subnode = null, $path = null)
54 {
55 if (null === $subnode) {
56 $subnode =& $messages;
57 }
58 foreach ($subnode as $key => $value) {
59 if (is_array($value)) {
60 $nodePath = $path ? $path.'.'.$key : $key;
61 $this->flatten($messages, $value, $nodePath);
62 if (null === $path) {
63 unset($messages[$key]);
64 }
65 } elseif (null !== $path) {
66 $messages[$path.'.'.$key] = $value;
67 }
68 }
69 }
70}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/CsvFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/CsvFileLoader.php
new file mode 100644
index 00000000..bc10188c
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/CsvFileLoader.php
@@ -0,0 +1,92 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\Exception\InvalidResourceException;
15use Symfony\Component\Translation\Exception\NotFoundResourceException;
16use Symfony\Component\Config\Resource\FileResource;
17
18/**
19 * CsvFileLoader loads translations from CSV files.
20 *
21 * @author Saša Stamenković <umpirsky@gmail.com>
22 *
23 * @api
24 */
25class CsvFileLoader extends ArrayLoader implements LoaderInterface
26{
27 private $delimiter = ';';
28 private $enclosure = '"';
29 private $escape = '\\';
30
31 /**
32 * {@inheritdoc}
33 *
34 * @api
35 */
36 public function load($resource, $locale, $domain = 'messages')
37 {
38 if (!stream_is_local($resource)) {
39 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
40 }
41
42 if (!file_exists($resource)) {
43 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
44 }
45
46 $messages = array();
47
48 try {
49 $file = new \SplFileObject($resource, 'rb');
50 } catch (\RuntimeException $e) {
51 throw new NotFoundResourceException(sprintf('Error opening file "%s".', $resource), 0, $e);
52 }
53
54 $file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY);
55 $file->setCsvControl($this->delimiter, $this->enclosure, $this->escape);
56
57 foreach ($file as $data) {
58 if (substr($data[0], 0, 1) === '#') {
59 continue;
60 }
61
62 if (!isset($data[1])) {
63 continue;
64 }
65
66 if (count($data) == 2) {
67 $messages[$data[0]] = $data[1];
68 } else {
69 continue;
70 }
71 }
72
73 $catalogue = parent::load($messages, $locale, $domain);
74 $catalogue->addResource(new FileResource($resource));
75
76 return $catalogue;
77 }
78
79 /**
80 * Sets the delimiter, enclosure, and escape character for CSV.
81 *
82 * @param string $delimiter delimiter character
83 * @param string $enclosure enclosure character
84 * @param string $escape escape character
85 */
86 public function setCsvControl($delimiter = ';', $enclosure = '"', $escape = '\\')
87 {
88 $this->delimiter = $delimiter;
89 $this->enclosure = $enclosure;
90 $this->escape = $escape;
91 }
92}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuDatFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuDatFileLoader.php
new file mode 100644
index 00000000..104883b0
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuDatFileLoader.php
@@ -0,0 +1,54 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Exception\InvalidResourceException;
16use Symfony\Component\Translation\Exception\NotFoundResourceException;
17use Symfony\Component\Config\Resource\FileResource;
18
19/**
20 * IcuResFileLoader loads translations from a resource bundle.
21 *
22 * @author stealth35
23 */
24class IcuDatFileLoader extends IcuResFileLoader
25{
26 /**
27 * {@inheritdoc}
28 */
29 public function load($resource, $locale, $domain = 'messages')
30 {
31 if (!stream_is_local($resource.'.dat')) {
32 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
33 }
34
35 if (!file_exists($resource.'.dat')) {
36 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
37 }
38
39 $rb = new \ResourceBundle($locale, $resource);
40
41 if (!$rb) {
42 throw new InvalidResourceException(sprintf('Cannot load resource "%s"', $resource));
43 } elseif (intl_is_failure($rb->getErrorCode())) {
44 throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode());
45 }
46
47 $messages = $this->flatten($rb);
48 $catalogue = new MessageCatalogue($locale);
49 $catalogue->add($messages, $domain);
50 $catalogue->addResource(new FileResource($resource.'.dat'));
51
52 return $catalogue;
53 }
54}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuResFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuResFileLoader.php
new file mode 100644
index 00000000..81b8e0fc
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuResFileLoader.php
@@ -0,0 +1,84 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Exception\InvalidResourceException;
16use Symfony\Component\Translation\Exception\NotFoundResourceException;
17use Symfony\Component\Config\Resource\DirectoryResource;
18
19/**
20 * IcuResFileLoader loads translations from a resource bundle.
21 *
22 * @author stealth35
23 */
24class IcuResFileLoader implements LoaderInterface
25{
26 /**
27 * {@inheritdoc}
28 */
29 public function load($resource, $locale, $domain = 'messages')
30 {
31 if (!stream_is_local($resource)) {
32 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
33 }
34
35 if (!is_dir($resource)) {
36 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
37 }
38
39 $rb = new \ResourceBundle($locale, $resource);
40
41 if (!$rb) {
42 throw new InvalidResourceException(sprintf('Cannot load resource "%s"', $resource));
43 } elseif (intl_is_failure($rb->getErrorCode())) {
44 throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode());
45 }
46
47 $messages = $this->flatten($rb);
48 $catalogue = new MessageCatalogue($locale);
49 $catalogue->add($messages, $domain);
50 $catalogue->addResource(new DirectoryResource($resource));
51
52 return $catalogue;
53 }
54
55 /**
56 * Flattens an ResourceBundle
57 *
58 * The scheme used is:
59 * key { key2 { key3 { "value" } } }
60 * Becomes:
61 * 'key.key2.key3' => 'value'
62 *
63 * This function takes an array by reference and will modify it
64 *
65 * @param \ResourceBundle $rb the ResourceBundle that will be flattened
66 * @param array $messages used internally for recursive calls
67 * @param string $path current path being parsed, used internally for recursive calls
68 *
69 * @return array the flattened ResourceBundle
70 */
71 protected function flatten(\ResourceBundle $rb, array &$messages = array(), $path = null)
72 {
73 foreach ($rb as $key => $value) {
74 $nodePath = $path ? $path.'.'.$key : $key;
75 if ($value instanceof \ResourceBundle) {
76 $this->flatten($value, $messages, $nodePath);
77 } else {
78 $messages[$nodePath] = $value;
79 }
80 }
81
82 return $messages;
83 }
84}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/IniFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/IniFileLoader.php
new file mode 100644
index 00000000..616fa7e0
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/IniFileLoader.php
@@ -0,0 +1,45 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\Exception\InvalidResourceException;
15use Symfony\Component\Translation\Exception\NotFoundResourceException;
16use Symfony\Component\Config\Resource\FileResource;
17
18/**
19 * IniFileLoader loads translations from an ini file.
20 *
21 * @author stealth35
22 */
23class IniFileLoader extends ArrayLoader implements LoaderInterface
24{
25 /**
26 * {@inheritdoc}
27 */
28 public function load($resource, $locale, $domain = 'messages')
29 {
30 if (!stream_is_local($resource)) {
31 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
32 }
33
34 if (!file_exists($resource)) {
35 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
36 }
37
38 $messages = parse_ini_file($resource, true);
39
40 $catalogue = parent::load($messages, $locale, $domain);
41 $catalogue->addResource(new FileResource($resource));
42
43 return $catalogue;
44 }
45}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/LoaderInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/LoaderInterface.php
new file mode 100644
index 00000000..4d9965ce
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/LoaderInterface.php
@@ -0,0 +1,41 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Exception\InvalidResourceException;
16
17/**
18 * LoaderInterface is the interface implemented by all translation loaders.
19 *
20 * @author Fabien Potencier <fabien@symfony.com>
21 *
22 * @api
23 */
24interface LoaderInterface
25{
26 /**
27 * Loads a locale.
28 *
29 * @param mixed $resource A resource
30 * @param string $locale A locale
31 * @param string $domain The domain
32 *
33 * @return MessageCatalogue A MessageCatalogue instance
34 *
35 * @api
36 *
37 * @throws NotFoundResourceException when the resource cannot be found
38 * @throws InvalidResourceException when the resource cannot be loaded
39 */
40 public function load($resource, $locale, $domain = 'messages');
41}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/MoFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/MoFileLoader.php
new file mode 100644
index 00000000..9d1cacb3
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/MoFileLoader.php
@@ -0,0 +1,179 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\Exception\InvalidResourceException;
15use Symfony\Component\Translation\Exception\NotFoundResourceException;
16use Symfony\Component\Config\Resource\FileResource;
17
18/**
19 * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
20 */
21class MoFileLoader extends ArrayLoader implements LoaderInterface
22{
23 /**
24 * Magic used for validating the format of a MO file as well as
25 * detecting if the machine used to create that file was little endian.
26 *
27 * @var float
28 */
29 const MO_LITTLE_ENDIAN_MAGIC = 0x950412de;
30
31 /**
32 * Magic used for validating the format of a MO file as well as
33 * detecting if the machine used to create that file was big endian.
34 *
35 * @var float
36 */
37 const MO_BIG_ENDIAN_MAGIC = 0xde120495;
38
39 /**
40 * The size of the header of a MO file in bytes.
41 *
42 * @var integer Number of bytes.
43 */
44 const MO_HEADER_SIZE = 28;
45
46 public function load($resource, $locale, $domain = 'messages')
47 {
48 if (!stream_is_local($resource)) {
49 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
50 }
51
52 if (!file_exists($resource)) {
53 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
54 }
55
56 $messages = $this->parse($resource);
57
58 // empty file
59 if (null === $messages) {
60 $messages = array();
61 }
62
63 // not an array
64 if (!is_array($messages)) {
65 throw new InvalidResourceException(sprintf('The file "%s" must contain a valid mo file.', $resource));
66 }
67
68 $catalogue = parent::load($messages, $locale, $domain);
69 $catalogue->addResource(new FileResource($resource));
70
71 return $catalogue;
72 }
73
74 /**
75 * Parses machine object (MO) format, independent of the machine's endian it
76 * was created on. Both 32bit and 64bit systems are supported.
77 *
78 * @param resource $resource
79 *
80 * @return array
81 * @throws InvalidResourceException If stream content has an invalid format.
82 */
83 private function parse($resource)
84 {
85 $stream = fopen($resource, 'r');
86
87 $stat = fstat($stream);
88
89 if ($stat['size'] < self::MO_HEADER_SIZE) {
90 throw new InvalidResourceException("MO stream content has an invalid format.");
91 }
92 $magic = unpack('V1', fread($stream, 4));
93 $magic = hexdec(substr(dechex(current($magic)), -8));
94
95 if ($magic == self::MO_LITTLE_ENDIAN_MAGIC) {
96 $isBigEndian = false;
97 } elseif ($magic == self::MO_BIG_ENDIAN_MAGIC) {
98 $isBigEndian = true;
99 } else {
100 throw new InvalidResourceException("MO stream content has an invalid format.");
101 }
102
103 $formatRevision = $this->readLong($stream, $isBigEndian);
104 $count = $this->readLong($stream, $isBigEndian);
105 $offsetId = $this->readLong($stream, $isBigEndian);
106 $offsetTranslated = $this->readLong($stream, $isBigEndian);
107 $sizeHashes = $this->readLong($stream, $isBigEndian);
108 $offsetHashes = $this->readLong($stream, $isBigEndian);
109
110 $messages = array();
111
112 for ($i = 0; $i < $count; $i++) {
113 $singularId = $pluralId = null;
114 $translated = null;
115
116 fseek($stream, $offsetId + $i * 8);
117
118 $length = $this->readLong($stream, $isBigEndian);
119 $offset = $this->readLong($stream, $isBigEndian);
120
121 if ($length < 1) {
122 continue;
123 }
124
125 fseek($stream, $offset);
126 $singularId = fread($stream, $length);
127
128 if (strpos($singularId, "\000") !== false) {
129 list($singularId, $pluralId) = explode("\000", $singularId);
130 }
131
132 fseek($stream, $offsetTranslated + $i * 8);
133 $length = $this->readLong($stream, $isBigEndian);
134 $offset = $this->readLong($stream, $isBigEndian);
135
136 fseek($stream, $offset);
137 $translated = fread($stream, $length);
138
139 if (strpos($translated, "\000") !== false) {
140 $translated = explode("\000", $translated);
141 }
142
143 $ids = array('singular' => $singularId, 'plural' => $pluralId);
144 $item = compact('ids', 'translated');
145
146 if (is_array($item['translated'])) {
147 $messages[$item['ids']['singular']] = stripcslashes($item['translated'][0]);
148 if (isset($item['ids']['plural'])) {
149 $plurals = array();
150 foreach ($item['translated'] as $plural => $translated) {
151 $plurals[] = sprintf('{%d} %s', $plural, $translated);
152 }
153 $messages[$item['ids']['plural']] = stripcslashes(implode('|', $plurals));
154 }
155 } elseif (!empty($item['ids']['singular'])) {
156 $messages[$item['ids']['singular']] = stripcslashes($item['translated']);
157 }
158 }
159
160 fclose($stream);
161
162 return array_filter($messages);
163 }
164
165 /**
166 * Reads an unsigned long from stream respecting endianess.
167 *
168 * @param resource $stream
169 * @param boolean $isBigEndian
170 * @return integer
171 */
172 private function readLong($stream, $isBigEndian)
173 {
174 $result = unpack($isBigEndian ? 'N1' : 'V1', fread($stream, 4));
175 $result = current($result);
176
177 return (integer) substr($result, -8);
178 }
179}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/PhpFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/PhpFileLoader.php
new file mode 100644
index 00000000..4737d1bf
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/PhpFileLoader.php
@@ -0,0 +1,49 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\Exception\InvalidResourceException;
15use Symfony\Component\Translation\Exception\NotFoundResourceException;
16use Symfony\Component\Config\Resource\FileResource;
17
18/**
19 * PhpFileLoader loads translations from PHP files returning an array of translations.
20 *
21 * @author Fabien Potencier <fabien@symfony.com>
22 *
23 * @api
24 */
25class PhpFileLoader extends ArrayLoader implements LoaderInterface
26{
27 /**
28 * {@inheritdoc}
29 *
30 * @api
31 */
32 public function load($resource, $locale, $domain = 'messages')
33 {
34 if (!stream_is_local($resource)) {
35 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
36 }
37
38 if (!file_exists($resource)) {
39 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
40 }
41
42 $messages = require($resource);
43
44 $catalogue = parent::load($messages, $locale, $domain);
45 $catalogue->addResource(new FileResource($resource));
46
47 return $catalogue;
48 }
49}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/PoFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/PoFileLoader.php
new file mode 100644
index 00000000..58ec6c7a
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/PoFileLoader.php
@@ -0,0 +1,178 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\Exception\InvalidResourceException;
15use Symfony\Component\Translation\Exception\NotFoundResourceException;
16use Symfony\Component\Config\Resource\FileResource;
17
18/**
19 * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
20 * @copyright Copyright (c) 2012, Clemens Tolboom
21 */
22class PoFileLoader extends ArrayLoader implements LoaderInterface
23{
24 public function load($resource, $locale, $domain = 'messages')
25 {
26 if (!stream_is_local($resource)) {
27 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
28 }
29
30 if (!file_exists($resource)) {
31 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
32 }
33
34 $messages = $this->parse($resource);
35
36 // empty file
37 if (null === $messages) {
38 $messages = array();
39 }
40
41 // not an array
42 if (!is_array($messages)) {
43 throw new InvalidResourceException(sprintf('The file "%s" must contain a valid po file.', $resource));
44 }
45
46 $catalogue = parent::load($messages, $locale, $domain);
47 $catalogue->addResource(new FileResource($resource));
48
49 return $catalogue;
50 }
51
52 /**
53 * Parses portable object (PO) format.
54 *
55 * From http://www.gnu.org/software/gettext/manual/gettext.html#PO-Files
56 * we should be able to parse files having:
57 *
58 * white-space
59 * # translator-comments
60 * #. extracted-comments
61 * #: reference...
62 * #, flag...
63 * #| msgid previous-untranslated-string
64 * msgid untranslated-string
65 * msgstr translated-string
66 *
67 * extra or different lines are:
68 *
69 * #| msgctxt previous-context
70 * #| msgid previous-untranslated-string
71 * msgctxt context
72 *
73 * #| msgid previous-untranslated-string-singular
74 * #| msgid_plural previous-untranslated-string-plural
75 * msgid untranslated-string-singular
76 * msgid_plural untranslated-string-plural
77 * msgstr[0] translated-string-case-0
78 * ...
79 * msgstr[N] translated-string-case-n
80 *
81 * The definition states:
82 * - white-space and comments are optional.
83 * - msgid "" that an empty singleline defines a header.
84 *
85 * This parser sacrifices some features of the reference implementation the
86 * differences to that implementation are as follows.
87 * - No support for comments spanning multiple lines.
88 * - Translator and extracted comments are treated as being the same type.
89 * - Message IDs are allowed to have other encodings as just US-ASCII.
90 *
91 * Items with an empty id are ignored.
92 *
93 * @param resource $resource
94 *
95 * @return array
96 */
97 private function parse($resource)
98 {
99 $stream = fopen($resource, 'r');
100
101 $defaults = array(
102 'ids' => array(),
103 'translated' => null,
104 );
105
106 $messages = array();
107 $item = $defaults;
108
109 while ($line = fgets($stream)) {
110 $line = trim($line);
111
112 if ($line === '') {
113 // Whitespace indicated current item is done
114 $this->addMessage($messages, $item);
115 $item = $defaults;
116 } elseif (substr($line, 0, 7) === 'msgid "') {
117 // We start a new msg so save previous
118 // TODO: this fails when comments or contexts are added
119 $this->addMessage($messages, $item);
120 $item = $defaults;
121 $item['ids']['singular'] = substr($line, 7, -1);
122 } elseif (substr($line, 0, 8) === 'msgstr "') {
123 $item['translated'] = substr($line, 8, -1);
124 } elseif ($line[0] === '"') {
125 $continues = isset($item['translated']) ? 'translated' : 'ids';
126
127 if (is_array($item[$continues])) {
128 end($item[$continues]);
129 $item[$continues][key($item[$continues])] .= substr($line, 1, -1);
130 } else {
131 $item[$continues] .= substr($line, 1, -1);
132 }
133 } elseif (substr($line, 0, 14) === 'msgid_plural "') {
134 $item['ids']['plural'] = substr($line, 14, -1);
135 } elseif (substr($line, 0, 7) === 'msgstr[') {
136 $size = strpos($line, ']');
137 $item['translated'][(integer) substr($line, 7, 1)] = substr($line, $size + 3, -1);
138 }
139
140 }
141 // save last item
142 $this->addMessage($messages, $item);
143 fclose($stream);
144
145 return $messages;
146 }
147
148 /**
149 * Save a translation item to the messeages.
150 *
151 * A .po file could contain by error missing plural indexes. We need to
152 * fix these before saving them.
153 *
154 * @param array $messages
155 * @param array $item
156 */
157 private function addMessage(array &$messages, array $item)
158 {
159 if (is_array($item['translated'])) {
160 $messages[$item['ids']['singular']] = stripslashes($item['translated'][0]);
161 if (isset($item['ids']['plural'])) {
162 $plurals = $item['translated'];
163 // PO are by definition indexed so sort by index.
164 ksort($plurals);
165 // Make sure every index is filled.
166 end($plurals);
167 $count = key($plurals);
168 // Fill missing spots with '-'.
169 $empties = array_fill(0, $count+1, '-');
170 $plurals += $empties;
171 ksort($plurals);
172 $messages[$item['ids']['plural']] = stripcslashes(implode('|', $plurals));
173 }
174 } elseif (!empty($item['ids']['singular'])) {
175 $messages[$item['ids']['singular']] = stripslashes($item['translated']);
176 }
177 }
178}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/QtFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/QtFileLoader.php
new file mode 100644
index 00000000..d64494b8
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/QtFileLoader.php
@@ -0,0 +1,95 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Exception\InvalidResourceException;
16use Symfony\Component\Translation\Exception\NotFoundResourceException;
17use Symfony\Component\Config\Resource\FileResource;
18
19/**
20 * QtFileLoader loads translations from QT Translations XML files.
21 *
22 * @author Benjamin Eberlei <kontakt@beberlei.de>
23 *
24 * @api
25 */
26class QtFileLoader implements LoaderInterface
27{
28 /**
29 * {@inheritdoc}
30 *
31 * @api
32 */
33 public function load($resource, $locale, $domain = 'messages')
34 {
35 if (!stream_is_local($resource)) {
36 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
37 }
38
39 if (!file_exists($resource)) {
40 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
41 }
42
43 $dom = new \DOMDocument();
44 $current = libxml_use_internal_errors(true);
45 if (!@$dom->load($resource, defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0)) {
46 throw new InvalidResourceException(implode("\n", $this->getXmlErrors()));
47 }
48
49 $xpath = new \DOMXPath($dom);
50 $nodes = $xpath->evaluate('//TS/context/name[text()="'.$domain.'"]');
51
52 $catalogue = new MessageCatalogue($locale);
53 if ($nodes->length == 1) {
54 $translations = $nodes->item(0)->nextSibling->parentNode->parentNode->getElementsByTagName('message');
55 foreach ($translations as $translation) {
56 $catalogue->set(
57 (string) $translation->getElementsByTagName('source')->item(0)->nodeValue,
58 (string) $translation->getElementsByTagName('translation')->item(0)->nodeValue,
59 $domain
60 );
61 $translation = $translation->nextSibling;
62 }
63 $catalogue->addResource(new FileResource($resource));
64 }
65
66 libxml_use_internal_errors($current);
67
68 return $catalogue;
69 }
70
71 /**
72 * Returns the XML errors of the internal XML parser
73 *
74 * @return array An array of errors
75 */
76 private function getXmlErrors()
77 {
78 $errors = array();
79 foreach (libxml_get_errors() as $error) {
80 $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)',
81 LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
82 $error->code,
83 trim($error->message),
84 $error->file ? $error->file : 'n/a',
85 $error->line,
86 $error->column
87 );
88 }
89
90 libxml_clear_errors();
91 libxml_use_internal_errors(false);
92
93 return $errors;
94 }
95}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/XliffFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/XliffFileLoader.php
new file mode 100644
index 00000000..0cafc043
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/XliffFileLoader.php
@@ -0,0 +1,163 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Exception\InvalidResourceException;
16use Symfony\Component\Translation\Exception\NotFoundResourceException;
17use Symfony\Component\Config\Resource\FileResource;
18
19/**
20 * XliffFileLoader loads translations from XLIFF files.
21 *
22 * @author Fabien Potencier <fabien@symfony.com>
23 *
24 * @api
25 */
26class XliffFileLoader implements LoaderInterface
27{
28 /**
29 * {@inheritdoc}
30 *
31 * @api
32 */
33 public function load($resource, $locale, $domain = 'messages')
34 {
35 if (!stream_is_local($resource)) {
36 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
37 }
38
39 if (!file_exists($resource)) {
40 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
41 }
42
43 list($xml, $encoding) = $this->parseFile($resource);
44 $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:1.2');
45
46 $catalogue = new MessageCatalogue($locale);
47 foreach ($xml->xpath('//xliff:trans-unit') as $translation) {
48 $attributes = $translation->attributes();
49
50 if (!(isset($attributes['resname']) || isset($translation->source)) || !isset($translation->target)) {
51 continue;
52 }
53
54 $source = isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source;
55 $target = (string) $translation->target;
56
57 // If the xlf file has another encoding specified, try to convert it because
58 // simple_xml will always return utf-8 encoded values
59 if ('UTF-8' !== $encoding && !empty($encoding)) {
60 if (function_exists('mb_convert_encoding')) {
61 $target = mb_convert_encoding($target, $encoding, 'UTF-8');
62 } elseif (function_exists('iconv')) {
63 $target = iconv('UTF-8', $encoding, $target);
64 } else {
65 throw new \RuntimeException('No suitable convert encoding function (use UTF-8 as your encoding or install the iconv or mbstring extension).');
66 }
67 }
68
69 $catalogue->set((string) $source, $target, $domain);
70 }
71 $catalogue->addResource(new FileResource($resource));
72
73 return $catalogue;
74 }
75
76 /**
77 * Validates and parses the given file into a SimpleXMLElement
78 *
79 * @param string $file
80 *
81 * @throws \RuntimeException
82 *
83 * @return \SimpleXMLElement
84 *
85 * @throws InvalidResourceException
86 */
87 private function parseFile($file)
88 {
89 $internalErrors = libxml_use_internal_errors(true);
90 $disableEntities = libxml_disable_entity_loader(true);
91 libxml_clear_errors();
92
93 $dom = new \DOMDocument();
94 $dom->validateOnParse = true;
95 if (!@$dom->loadXML(file_get_contents($file), LIBXML_NONET | (defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0))) {
96 libxml_disable_entity_loader($disableEntities);
97
98 throw new InvalidResourceException(implode("\n", $this->getXmlErrors($internalErrors)));
99 }
100
101 libxml_disable_entity_loader($disableEntities);
102
103 foreach ($dom->childNodes as $child) {
104 if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
105 libxml_use_internal_errors($internalErrors);
106
107 throw new InvalidResourceException('Document types are not allowed.');
108 }
109 }
110
111 $location = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd';
112 $parts = explode('/', $location);
113 if (0 === stripos($location, 'phar://')) {
114 $tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
115 if ($tmpfile) {
116 copy($location, $tmpfile);
117 $parts = explode('/', str_replace('\\', '/', $tmpfile));
118 }
119 }
120 $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
121 $location = 'file:///'.$drive.implode('/', array_map('rawurlencode', $parts));
122
123 $source = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-1.2-strict.xsd');
124 $source = str_replace('http://www.w3.org/2001/xml.xsd', $location, $source);
125
126 if (!@$dom->schemaValidateSource($source)) {
127 throw new InvalidResourceException(implode("\n", $this->getXmlErrors($internalErrors)));
128 }
129
130 $dom->normalizeDocument();
131
132 libxml_use_internal_errors($internalErrors);
133
134 return array(simplexml_import_dom($dom), strtoupper($dom->encoding));
135 }
136
137 /**
138 * Returns the XML errors of the internal XML parser
139 *
140 * @param Boolean $internalErrors
141 *
142 * @return array An array of errors
143 */
144 private function getXmlErrors($internalErrors)
145 {
146 $errors = array();
147 foreach (libxml_get_errors() as $error) {
148 $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)',
149 LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
150 $error->code,
151 trim($error->message),
152 $error->file ? $error->file : 'n/a',
153 $error->line,
154 $error->column
155 );
156 }
157
158 libxml_clear_errors();
159 libxml_use_internal_errors($internalErrors);
160
161 return $errors;
162 }
163}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/YamlFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/YamlFileLoader.php
new file mode 100644
index 00000000..66ab2ba5
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/YamlFileLoader.php
@@ -0,0 +1,71 @@
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
12namespace Symfony\Component\Translation\Loader;
13
14use Symfony\Component\Translation\Exception\InvalidResourceException;
15use Symfony\Component\Translation\Exception\NotFoundResourceException;
16use Symfony\Component\Config\Resource\FileResource;
17use Symfony\Component\Yaml\Parser as YamlParser;
18use Symfony\Component\Yaml\Exception\ParseException;
19
20/**
21 * YamlFileLoader loads translations from Yaml files.
22 *
23 * @author Fabien Potencier <fabien@symfony.com>
24 *
25 * @api
26 */
27class YamlFileLoader extends ArrayLoader implements LoaderInterface
28{
29 private $yamlParser;
30
31 /**
32 * {@inheritdoc}
33 *
34 * @api
35 */
36 public function load($resource, $locale, $domain = 'messages')
37 {
38 if (!stream_is_local($resource)) {
39 throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
40 }
41
42 if (!file_exists($resource)) {
43 throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
44 }
45
46 if (null === $this->yamlParser) {
47 $this->yamlParser = new YamlParser();
48 }
49
50 try {
51 $messages = $this->yamlParser->parse(file_get_contents($resource));
52 } catch (ParseException $e) {
53 throw new InvalidResourceException('Error parsing YAML.', 0, $e);
54 }
55
56 // empty file
57 if (null === $messages) {
58 $messages = array();
59 }
60
61 // not an array
62 if (!is_array($messages)) {
63 throw new InvalidResourceException(sprintf('The file "%s" must contain a YAML array.', $resource));
64 }
65
66 $catalogue = parent::load($messages, $locale, $domain);
67 $catalogue->addResource(new FileResource($resource));
68
69 return $catalogue;
70 }
71}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd b/vendor/symfony/translation/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd
new file mode 100644
index 00000000..3ce2a8e8
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd
@@ -0,0 +1,2223 @@
1<?xml version="1.0" encoding="UTF-8"?>
2
3<!--
4
5May-19-2004:
6- Changed the <choice> for ElemType_header, moving minOccurs="0" maxOccurs="unbounded" from its elements
7to <choice> itself.
8- Added <choice> for ElemType_trans-unit to allow "any order" for <context-group>, <count-group>, <prop-group>, <note>, and
9<alt-trans>.
10
11Oct-2005
12- updated version info to 1.2
13- equiv-trans attribute to <trans-unit> element
14- merged-trans attribute for <group> element
15- Add the <seg-source> element as optional in the <trans-unit> and <alt-trans> content models, at the same level as <source>
16- Create a new value "seg" for the mtype attribute of the <mrk> element
17- Add mid as an optional attribute for the <alt-trans> element
18
19Nov-14-2005
20- Changed name attribute for <context-group> from required to optional
21- Added extension point at <xliff>
22
23Jan-9-2006
24- Added alttranstype type attribute to <alt-trans>, and values
25
26Jan-10-2006
27- Corrected error with overwritten purposeValueList
28- Corrected name="AttrType_Version", attribute should have been "name"
29
30-->
31<xsd:schema xmlns:xlf="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:oasis:names:tc:xliff:document:1.2" xml:lang="en">
32 <!-- Import for xml:lang and xml:space -->
33 <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
34 <!-- Attributes Lists -->
35 <xsd:simpleType name="XTend">
36 <xsd:restriction base="xsd:string">
37 <xsd:pattern value="x-[^\s]+"/>
38 </xsd:restriction>
39 </xsd:simpleType>
40 <xsd:simpleType name="context-typeValueList">
41 <xsd:annotation>
42 <xsd:documentation>Values for the attribute 'context-type'.</xsd:documentation>
43 </xsd:annotation>
44 <xsd:restriction base="xsd:string">
45 <xsd:enumeration value="database">
46 <xsd:annotation>
47 <xsd:documentation>Indicates a database content.</xsd:documentation>
48 </xsd:annotation>
49 </xsd:enumeration>
50 <xsd:enumeration value="element">
51 <xsd:annotation>
52 <xsd:documentation>Indicates the content of an element within an XML document.</xsd:documentation>
53 </xsd:annotation>
54 </xsd:enumeration>
55 <xsd:enumeration value="elementtitle">
56 <xsd:annotation>
57 <xsd:documentation>Indicates the name of an element within an XML document.</xsd:documentation>
58 </xsd:annotation>
59 </xsd:enumeration>
60 <xsd:enumeration value="linenumber">
61 <xsd:annotation>
62 <xsd:documentation>Indicates the line number from the sourcefile (see context-type="sourcefile") where the &lt;source&gt; is found.</xsd:documentation>
63 </xsd:annotation>
64 </xsd:enumeration>
65 <xsd:enumeration value="numparams">
66 <xsd:annotation>
67 <xsd:documentation>Indicates a the number of parameters contained within the &lt;source&gt;.</xsd:documentation>
68 </xsd:annotation>
69 </xsd:enumeration>
70 <xsd:enumeration value="paramnotes">
71 <xsd:annotation>
72 <xsd:documentation>Indicates notes pertaining to the parameters in the &lt;source&gt;.</xsd:documentation>
73 </xsd:annotation>
74 </xsd:enumeration>
75 <xsd:enumeration value="record">
76 <xsd:annotation>
77 <xsd:documentation>Indicates the content of a record within a database.</xsd:documentation>
78 </xsd:annotation>
79 </xsd:enumeration>
80 <xsd:enumeration value="recordtitle">
81 <xsd:annotation>
82 <xsd:documentation>Indicates the name of a record within a database.</xsd:documentation>
83 </xsd:annotation>
84 </xsd:enumeration>
85 <xsd:enumeration value="sourcefile">
86 <xsd:annotation>
87 <xsd:documentation>Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original &lt;file&gt; attribute in that this sourcefile is one of many that make up that file.</xsd:documentation>
88 </xsd:annotation>
89 </xsd:enumeration>
90 </xsd:restriction>
91 </xsd:simpleType>
92 <xsd:simpleType name="count-typeValueList">
93 <xsd:annotation>
94 <xsd:documentation>Values for the attribute 'count-type'.</xsd:documentation>
95 </xsd:annotation>
96 <xsd:restriction base="xsd:NMTOKEN">
97 <xsd:enumeration value="num-usages">
98 <xsd:annotation>
99 <xsd:documentation>Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts.</xsd:documentation>
100 </xsd:annotation>
101 </xsd:enumeration>
102 <xsd:enumeration value="repetition">
103 <xsd:annotation>
104 <xsd:documentation>Indicates the count units are translation units existing already in the same document.</xsd:documentation>
105 </xsd:annotation>
106 </xsd:enumeration>
107 <xsd:enumeration value="total">
108 <xsd:annotation>
109 <xsd:documentation>Indicates a total count.</xsd:documentation>
110 </xsd:annotation>
111 </xsd:enumeration>
112 </xsd:restriction>
113 </xsd:simpleType>
114 <xsd:simpleType name="InlineDelimitersValueList">
115 <xsd:annotation>
116 <xsd:documentation>Values for the attribute 'ctype' when used other elements than &lt;ph&gt; or &lt;x&gt;.</xsd:documentation>
117 </xsd:annotation>
118 <xsd:restriction base="xsd:NMTOKEN">
119 <xsd:enumeration value="bold">
120 <xsd:annotation>
121 <xsd:documentation>Indicates a run of bolded text.</xsd:documentation>
122 </xsd:annotation>
123 </xsd:enumeration>
124 <xsd:enumeration value="italic">
125 <xsd:annotation>
126 <xsd:documentation>Indicates a run of text in italics.</xsd:documentation>
127 </xsd:annotation>
128 </xsd:enumeration>
129 <xsd:enumeration value="underlined">
130 <xsd:annotation>
131 <xsd:documentation>Indicates a run of underlined text.</xsd:documentation>
132 </xsd:annotation>
133 </xsd:enumeration>
134 <xsd:enumeration value="link">
135 <xsd:annotation>
136 <xsd:documentation>Indicates a run of hyper-text.</xsd:documentation>
137 </xsd:annotation>
138 </xsd:enumeration>
139 </xsd:restriction>
140 </xsd:simpleType>
141 <xsd:simpleType name="InlinePlaceholdersValueList">
142 <xsd:annotation>
143 <xsd:documentation>Values for the attribute 'ctype' when used with &lt;ph&gt; or &lt;x&gt;.</xsd:documentation>
144 </xsd:annotation>
145 <xsd:restriction base="xsd:NMTOKEN">
146 <xsd:enumeration value="image">
147 <xsd:annotation>
148 <xsd:documentation>Indicates a inline image.</xsd:documentation>
149 </xsd:annotation>
150 </xsd:enumeration>
151 <xsd:enumeration value="pb">
152 <xsd:annotation>
153 <xsd:documentation>Indicates a page break.</xsd:documentation>
154 </xsd:annotation>
155 </xsd:enumeration>
156 <xsd:enumeration value="lb">
157 <xsd:annotation>
158 <xsd:documentation>Indicates a line break.</xsd:documentation>
159 </xsd:annotation>
160 </xsd:enumeration>
161 </xsd:restriction>
162 </xsd:simpleType>
163 <xsd:simpleType name="mime-typeValueList">
164 <xsd:restriction base="xsd:string">
165 <xsd:pattern value="(text|multipart|message|application|image|audio|video|model)(/.+)*"/>
166 </xsd:restriction>
167 </xsd:simpleType>
168 <xsd:simpleType name="datatypeValueList">
169 <xsd:annotation>
170 <xsd:documentation>Values for the attribute 'datatype'.</xsd:documentation>
171 </xsd:annotation>
172 <xsd:restriction base="xsd:NMTOKEN">
173 <xsd:enumeration value="asp">
174 <xsd:annotation>
175 <xsd:documentation>Indicates Active Server Page data.</xsd:documentation>
176 </xsd:annotation>
177 </xsd:enumeration>
178 <xsd:enumeration value="c">
179 <xsd:annotation>
180 <xsd:documentation>Indicates C source file data.</xsd:documentation>
181 </xsd:annotation>
182 </xsd:enumeration>
183 <xsd:enumeration value="cdf">
184 <xsd:annotation>
185 <xsd:documentation>Indicates Channel Definition Format (CDF) data.</xsd:documentation>
186 </xsd:annotation>
187 </xsd:enumeration>
188 <xsd:enumeration value="cfm">
189 <xsd:annotation>
190 <xsd:documentation>Indicates ColdFusion data.</xsd:documentation>
191 </xsd:annotation>
192 </xsd:enumeration>
193 <xsd:enumeration value="cpp">
194 <xsd:annotation>
195 <xsd:documentation>Indicates C++ source file data.</xsd:documentation>
196 </xsd:annotation>
197 </xsd:enumeration>
198 <xsd:enumeration value="csharp">
199 <xsd:annotation>
200 <xsd:documentation>Indicates C-Sharp data.</xsd:documentation>
201 </xsd:annotation>
202 </xsd:enumeration>
203 <xsd:enumeration value="cstring">
204 <xsd:annotation>
205 <xsd:documentation>Indicates strings from C, ASM, and driver files data.</xsd:documentation>
206 </xsd:annotation>
207 </xsd:enumeration>
208 <xsd:enumeration value="csv">
209 <xsd:annotation>
210 <xsd:documentation>Indicates comma-separated values data.</xsd:documentation>
211 </xsd:annotation>
212 </xsd:enumeration>
213 <xsd:enumeration value="database">
214 <xsd:annotation>
215 <xsd:documentation>Indicates database data.</xsd:documentation>
216 </xsd:annotation>
217 </xsd:enumeration>
218 <xsd:enumeration value="documentfooter">
219 <xsd:annotation>
220 <xsd:documentation>Indicates portions of document that follows data and contains metadata.</xsd:documentation>
221 </xsd:annotation>
222 </xsd:enumeration>
223 <xsd:enumeration value="documentheader">
224 <xsd:annotation>
225 <xsd:documentation>Indicates portions of document that precedes data and contains metadata.</xsd:documentation>
226 </xsd:annotation>
227 </xsd:enumeration>
228 <xsd:enumeration value="filedialog">
229 <xsd:annotation>
230 <xsd:documentation>Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import).</xsd:documentation>
231 </xsd:annotation>
232 </xsd:enumeration>
233 <xsd:enumeration value="form">
234 <xsd:annotation>
235 <xsd:documentation>Indicates standard user input screen data.</xsd:documentation>
236 </xsd:annotation>
237 </xsd:enumeration>
238 <xsd:enumeration value="html">
239 <xsd:annotation>
240 <xsd:documentation>Indicates HyperText Markup Language (HTML) data - document instance.</xsd:documentation>
241 </xsd:annotation>
242 </xsd:enumeration>
243 <xsd:enumeration value="htmlbody">
244 <xsd:annotation>
245 <xsd:documentation>Indicates content within an HTML document’s &lt;body&gt; element.</xsd:documentation>
246 </xsd:annotation>
247 </xsd:enumeration>
248 <xsd:enumeration value="ini">
249 <xsd:annotation>
250 <xsd:documentation>Indicates Windows INI file data.</xsd:documentation>
251 </xsd:annotation>
252 </xsd:enumeration>
253 <xsd:enumeration value="interleaf">
254 <xsd:annotation>
255 <xsd:documentation>Indicates Interleaf data.</xsd:documentation>
256 </xsd:annotation>
257 </xsd:enumeration>
258 <xsd:enumeration value="javaclass">
259 <xsd:annotation>
260 <xsd:documentation>Indicates Java source file data (extension '.java').</xsd:documentation>
261 </xsd:annotation>
262 </xsd:enumeration>
263 <xsd:enumeration value="javapropertyresourcebundle">
264 <xsd:annotation>
265 <xsd:documentation>Indicates Java property resource bundle data.</xsd:documentation>
266 </xsd:annotation>
267 </xsd:enumeration>
268 <xsd:enumeration value="javalistresourcebundle">
269 <xsd:annotation>
270 <xsd:documentation>Indicates Java list resource bundle data.</xsd:documentation>
271 </xsd:annotation>
272 </xsd:enumeration>
273 <xsd:enumeration value="javascript">
274 <xsd:annotation>
275 <xsd:documentation>Indicates JavaScript source file data.</xsd:documentation>
276 </xsd:annotation>
277 </xsd:enumeration>
278 <xsd:enumeration value="jscript">
279 <xsd:annotation>
280 <xsd:documentation>Indicates JScript source file data.</xsd:documentation>
281 </xsd:annotation>
282 </xsd:enumeration>
283 <xsd:enumeration value="layout">
284 <xsd:annotation>
285 <xsd:documentation>Indicates information relating to formatting.</xsd:documentation>
286 </xsd:annotation>
287 </xsd:enumeration>
288 <xsd:enumeration value="lisp">
289 <xsd:annotation>
290 <xsd:documentation>Indicates LISP source file data.</xsd:documentation>
291 </xsd:annotation>
292 </xsd:enumeration>
293 <xsd:enumeration value="margin">
294 <xsd:annotation>
295 <xsd:documentation>Indicates information relating to margin formats.</xsd:documentation>
296 </xsd:annotation>
297 </xsd:enumeration>
298 <xsd:enumeration value="menufile">
299 <xsd:annotation>
300 <xsd:documentation>Indicates a file containing menu.</xsd:documentation>
301 </xsd:annotation>
302 </xsd:enumeration>
303 <xsd:enumeration value="messagefile">
304 <xsd:annotation>
305 <xsd:documentation>Indicates numerically identified string table.</xsd:documentation>
306 </xsd:annotation>
307 </xsd:enumeration>
308 <xsd:enumeration value="mif">
309 <xsd:annotation>
310 <xsd:documentation>Indicates Maker Interchange Format (MIF) data.</xsd:documentation>
311 </xsd:annotation>
312 </xsd:enumeration>
313 <xsd:enumeration value="mimetype">
314 <xsd:annotation>
315 <xsd:documentation>Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute.</xsd:documentation>
316 </xsd:annotation>
317 </xsd:enumeration>
318 <xsd:enumeration value="mo">
319 <xsd:annotation>
320 <xsd:documentation>Indicates GNU Machine Object data.</xsd:documentation>
321 </xsd:annotation>
322 </xsd:enumeration>
323 <xsd:enumeration value="msglib">
324 <xsd:annotation>
325 <xsd:documentation>Indicates Message Librarian strings created by Novell's Message Librarian Tool.</xsd:documentation>
326 </xsd:annotation>
327 </xsd:enumeration>
328 <xsd:enumeration value="pagefooter">
329 <xsd:annotation>
330 <xsd:documentation>Indicates information to be displayed at the bottom of each page of a document.</xsd:documentation>
331 </xsd:annotation>
332 </xsd:enumeration>
333 <xsd:enumeration value="pageheader">
334 <xsd:annotation>
335 <xsd:documentation>Indicates information to be displayed at the top of each page of a document.</xsd:documentation>
336 </xsd:annotation>
337 </xsd:enumeration>
338 <xsd:enumeration value="parameters">
339 <xsd:annotation>
340 <xsd:documentation>Indicates a list of property values (e.g., settings within INI files or preferences dialog).</xsd:documentation>
341 </xsd:annotation>
342 </xsd:enumeration>
343 <xsd:enumeration value="pascal">
344 <xsd:annotation>
345 <xsd:documentation>Indicates Pascal source file data.</xsd:documentation>
346 </xsd:annotation>
347 </xsd:enumeration>
348 <xsd:enumeration value="php">
349 <xsd:annotation>
350 <xsd:documentation>Indicates Hypertext Preprocessor data.</xsd:documentation>
351 </xsd:annotation>
352 </xsd:enumeration>
353 <xsd:enumeration value="plaintext">
354 <xsd:annotation>
355 <xsd:documentation>Indicates plain text file (no formatting other than, possibly, wrapping).</xsd:documentation>
356 </xsd:annotation>
357 </xsd:enumeration>
358 <xsd:enumeration value="po">
359 <xsd:annotation>
360 <xsd:documentation>Indicates GNU Portable Object file.</xsd:documentation>
361 </xsd:annotation>
362 </xsd:enumeration>
363 <xsd:enumeration value="report">
364 <xsd:annotation>
365 <xsd:documentation>Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc.</xsd:documentation>
366 </xsd:annotation>
367 </xsd:enumeration>
368 <xsd:enumeration value="resources">
369 <xsd:annotation>
370 <xsd:documentation>Indicates Windows .NET binary resources.</xsd:documentation>
371 </xsd:annotation>
372 </xsd:enumeration>
373 <xsd:enumeration value="resx">
374 <xsd:annotation>
375 <xsd:documentation>Indicates Windows .NET Resources.</xsd:documentation>
376 </xsd:annotation>
377 </xsd:enumeration>
378 <xsd:enumeration value="rtf">
379 <xsd:annotation>
380 <xsd:documentation>Indicates Rich Text Format (RTF) data.</xsd:documentation>
381 </xsd:annotation>
382 </xsd:enumeration>
383 <xsd:enumeration value="sgml">
384 <xsd:annotation>
385 <xsd:documentation>Indicates Standard Generalized Markup Language (SGML) data - document instance.</xsd:documentation>
386 </xsd:annotation>
387 </xsd:enumeration>
388 <xsd:enumeration value="sgmldtd">
389 <xsd:annotation>
390 <xsd:documentation>Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD).</xsd:documentation>
391 </xsd:annotation>
392 </xsd:enumeration>
393 <xsd:enumeration value="svg">
394 <xsd:annotation>
395 <xsd:documentation>Indicates Scalable Vector Graphic (SVG) data.</xsd:documentation>
396 </xsd:annotation>
397 </xsd:enumeration>
398 <xsd:enumeration value="vbscript">
399 <xsd:annotation>
400 <xsd:documentation>Indicates VisualBasic Script source file.</xsd:documentation>
401 </xsd:annotation>
402 </xsd:enumeration>
403 <xsd:enumeration value="warning">
404 <xsd:annotation>
405 <xsd:documentation>Indicates warning message.</xsd:documentation>
406 </xsd:annotation>
407 </xsd:enumeration>
408 <xsd:enumeration value="winres">
409 <xsd:annotation>
410 <xsd:documentation>Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file).</xsd:documentation>
411 </xsd:annotation>
412 </xsd:enumeration>
413 <xsd:enumeration value="xhtml">
414 <xsd:annotation>
415 <xsd:documentation>Indicates Extensible HyperText Markup Language (XHTML) data - document instance.</xsd:documentation>
416 </xsd:annotation>
417 </xsd:enumeration>
418 <xsd:enumeration value="xml">
419 <xsd:annotation>
420 <xsd:documentation>Indicates Extensible Markup Language (XML) data - document instance.</xsd:documentation>
421 </xsd:annotation>
422 </xsd:enumeration>
423 <xsd:enumeration value="xmldtd">
424 <xsd:annotation>
425 <xsd:documentation>Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD).</xsd:documentation>
426 </xsd:annotation>
427 </xsd:enumeration>
428 <xsd:enumeration value="xsl">
429 <xsd:annotation>
430 <xsd:documentation>Indicates Extensible Stylesheet Language (XSL) data.</xsd:documentation>
431 </xsd:annotation>
432 </xsd:enumeration>
433 <xsd:enumeration value="xul">
434 <xsd:annotation>
435 <xsd:documentation>Indicates XUL elements.</xsd:documentation>
436 </xsd:annotation>
437 </xsd:enumeration>
438 </xsd:restriction>
439 </xsd:simpleType>
440 <xsd:simpleType name="mtypeValueList">
441 <xsd:annotation>
442 <xsd:documentation>Values for the attribute 'mtype'.</xsd:documentation>
443 </xsd:annotation>
444 <xsd:restriction base="xsd:NMTOKEN">
445 <xsd:enumeration value="abbrev">
446 <xsd:annotation>
447 <xsd:documentation>Indicates the marked text is an abbreviation.</xsd:documentation>
448 </xsd:annotation>
449 </xsd:enumeration>
450 <xsd:enumeration value="abbreviated-form">
451 <xsd:annotation>
452 <xsd:documentation>ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept.</xsd:documentation>
453 </xsd:annotation>
454 </xsd:enumeration>
455 <xsd:enumeration value="abbreviation">
456 <xsd:annotation>
457 <xsd:documentation>ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective').</xsd:documentation>
458 </xsd:annotation>
459 </xsd:enumeration>
460 <xsd:enumeration value="acronym">
461 <xsd:annotation>
462 <xsd:documentation>ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging').</xsd:documentation>
463 </xsd:annotation>
464 </xsd:enumeration>
465 <xsd:enumeration value="appellation">
466 <xsd:annotation>
467 <xsd:documentation>ISO-12620: A proper-name term, such as the name of an agency or other proper entity.</xsd:documentation>
468 </xsd:annotation>
469 </xsd:enumeration>
470 <xsd:enumeration value="collocation">
471 <xsd:annotation>
472 <xsd:documentation>ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another.</xsd:documentation>
473 </xsd:annotation>
474 </xsd:enumeration>
475 <xsd:enumeration value="common-name">
476 <xsd:annotation>
477 <xsd:documentation>ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language.</xsd:documentation>
478 </xsd:annotation>
479 </xsd:enumeration>
480 <xsd:enumeration value="datetime">
481 <xsd:annotation>
482 <xsd:documentation>Indicates the marked text is a date and/or time.</xsd:documentation>
483 </xsd:annotation>
484 </xsd:enumeration>
485 <xsd:enumeration value="equation">
486 <xsd:annotation>
487 <xsd:documentation>ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign.</xsd:documentation>
488 </xsd:annotation>
489 </xsd:enumeration>
490 <xsd:enumeration value="expanded-form">
491 <xsd:annotation>
492 <xsd:documentation>ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form.</xsd:documentation>
493 </xsd:annotation>
494 </xsd:enumeration>
495 <xsd:enumeration value="formula">
496 <xsd:annotation>
497 <xsd:documentation>ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula.</xsd:documentation>
498 </xsd:annotation>
499 </xsd:enumeration>
500 <xsd:enumeration value="head-term">
501 <xsd:annotation>
502 <xsd:documentation>ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record.</xsd:documentation>
503 </xsd:annotation>
504 </xsd:enumeration>
505 <xsd:enumeration value="initialism">
506 <xsd:annotation>
507 <xsd:documentation>ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy').</xsd:documentation>
508 </xsd:annotation>
509 </xsd:enumeration>
510 <xsd:enumeration value="international-scientific-term">
511 <xsd:annotation>
512 <xsd:documentation>ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body.</xsd:documentation>
513 </xsd:annotation>
514 </xsd:enumeration>
515 <xsd:enumeration value="internationalism">
516 <xsd:annotation>
517 <xsd:documentation>ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages.</xsd:documentation>
518 </xsd:annotation>
519 </xsd:enumeration>
520 <xsd:enumeration value="logical-expression">
521 <xsd:annotation>
522 <xsd:documentation>ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like.</xsd:documentation>
523 </xsd:annotation>
524 </xsd:enumeration>
525 <xsd:enumeration value="materials-management-unit">
526 <xsd:annotation>
527 <xsd:documentation>ISO-12620 2.1.17: A unit to track object.</xsd:documentation>
528 </xsd:annotation>
529 </xsd:enumeration>
530 <xsd:enumeration value="name">
531 <xsd:annotation>
532 <xsd:documentation>Indicates the marked text is a name.</xsd:documentation>
533 </xsd:annotation>
534 </xsd:enumeration>
535 <xsd:enumeration value="near-synonym">
536 <xsd:annotation>
537 <xsd:documentation>ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others.</xsd:documentation>
538 </xsd:annotation>
539 </xsd:enumeration>
540 <xsd:enumeration value="part-number">
541 <xsd:annotation>
542 <xsd:documentation>ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system.</xsd:documentation>
543 </xsd:annotation>
544 </xsd:enumeration>
545 <xsd:enumeration value="phrase">
546 <xsd:annotation>
547 <xsd:documentation>Indicates the marked text is a phrase.</xsd:documentation>
548 </xsd:annotation>
549 </xsd:enumeration>
550 <xsd:enumeration value="phraseological-unit">
551 <xsd:annotation>
552 <xsd:documentation>ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase.</xsd:documentation>
553 </xsd:annotation>
554 </xsd:enumeration>
555 <xsd:enumeration value="protected">
556 <xsd:annotation>
557 <xsd:documentation>Indicates the marked text should not be translated.</xsd:documentation>
558 </xsd:annotation>
559 </xsd:enumeration>
560 <xsd:enumeration value="romanized-form">
561 <xsd:annotation>
562 <xsd:documentation>ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet.</xsd:documentation>
563 </xsd:annotation>
564 </xsd:enumeration>
565 <xsd:enumeration value="seg">
566 <xsd:annotation>
567 <xsd:documentation>Indicates that the marked text represents a segment.</xsd:documentation>
568 </xsd:annotation>
569 </xsd:enumeration>
570 <xsd:enumeration value="set-phrase">
571 <xsd:annotation>
572 <xsd:documentation>ISO-12620 2.1.18.2: A fixed, lexicalized phrase.</xsd:documentation>
573 </xsd:annotation>
574 </xsd:enumeration>
575 <xsd:enumeration value="short-form">
576 <xsd:annotation>
577 <xsd:documentation>ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs').</xsd:documentation>
578 </xsd:annotation>
579 </xsd:enumeration>
580 <xsd:enumeration value="sku">
581 <xsd:annotation>
582 <xsd:documentation>ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system.</xsd:documentation>
583 </xsd:annotation>
584 </xsd:enumeration>
585 <xsd:enumeration value="standard-text">
586 <xsd:annotation>
587 <xsd:documentation>ISO-12620 2.1.19: A fixed chunk of recurring text.</xsd:documentation>
588 </xsd:annotation>
589 </xsd:enumeration>
590 <xsd:enumeration value="symbol">
591 <xsd:annotation>
592 <xsd:documentation>ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof.</xsd:documentation>
593 </xsd:annotation>
594 </xsd:enumeration>
595 <xsd:enumeration value="synonym">
596 <xsd:annotation>
597 <xsd:documentation>ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry.</xsd:documentation>
598 </xsd:annotation>
599 </xsd:enumeration>
600 <xsd:enumeration value="synonymous-phrase">
601 <xsd:annotation>
602 <xsd:documentation>ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language.</xsd:documentation>
603 </xsd:annotation>
604 </xsd:enumeration>
605 <xsd:enumeration value="term">
606 <xsd:annotation>
607 <xsd:documentation>Indicates the marked text is a term.</xsd:documentation>
608 </xsd:annotation>
609 </xsd:enumeration>
610 <xsd:enumeration value="transcribed-form">
611 <xsd:annotation>
612 <xsd:documentation>ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted.</xsd:documentation>
613 </xsd:annotation>
614 </xsd:enumeration>
615 <xsd:enumeration value="transliterated-form">
616 <xsd:annotation>
617 <xsd:documentation>ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system.</xsd:documentation>
618 </xsd:annotation>
619 </xsd:enumeration>
620 <xsd:enumeration value="truncated-term">
621 <xsd:annotation>
622 <xsd:documentation>ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza').</xsd:documentation>
623 </xsd:annotation>
624 </xsd:enumeration>
625 <xsd:enumeration value="variant">
626 <xsd:annotation>
627 <xsd:documentation>ISO-12620 2.1.9: One of the alternate forms of a term.</xsd:documentation>
628 </xsd:annotation>
629 </xsd:enumeration>
630 </xsd:restriction>
631 </xsd:simpleType>
632 <xsd:simpleType name="restypeValueList">
633 <xsd:annotation>
634 <xsd:documentation>Values for the attribute 'restype'.</xsd:documentation>
635 </xsd:annotation>
636 <xsd:restriction base="xsd:NMTOKEN">
637 <xsd:enumeration value="auto3state">
638 <xsd:annotation>
639 <xsd:documentation>Indicates a Windows RC AUTO3STATE control.</xsd:documentation>
640 </xsd:annotation>
641 </xsd:enumeration>
642 <xsd:enumeration value="autocheckbox">
643 <xsd:annotation>
644 <xsd:documentation>Indicates a Windows RC AUTOCHECKBOX control.</xsd:documentation>
645 </xsd:annotation>
646 </xsd:enumeration>
647 <xsd:enumeration value="autoradiobutton">
648 <xsd:annotation>
649 <xsd:documentation>Indicates a Windows RC AUTORADIOBUTTON control.</xsd:documentation>
650 </xsd:annotation>
651 </xsd:enumeration>
652 <xsd:enumeration value="bedit">
653 <xsd:annotation>
654 <xsd:documentation>Indicates a Windows RC BEDIT control.</xsd:documentation>
655 </xsd:annotation>
656 </xsd:enumeration>
657 <xsd:enumeration value="bitmap">
658 <xsd:annotation>
659 <xsd:documentation>Indicates a bitmap, for example a BITMAP resource in Windows.</xsd:documentation>
660 </xsd:annotation>
661 </xsd:enumeration>
662 <xsd:enumeration value="button">
663 <xsd:annotation>
664 <xsd:documentation>Indicates a button object, for example a BUTTON control Windows.</xsd:documentation>
665 </xsd:annotation>
666 </xsd:enumeration>
667 <xsd:enumeration value="caption">
668 <xsd:annotation>
669 <xsd:documentation>Indicates a caption, such as the caption of a dialog box.</xsd:documentation>
670 </xsd:annotation>
671 </xsd:enumeration>
672 <xsd:enumeration value="cell">
673 <xsd:annotation>
674 <xsd:documentation>Indicates the cell in a table, for example the content of the &lt;td&gt; element in HTML.</xsd:documentation>
675 </xsd:annotation>
676 </xsd:enumeration>
677 <xsd:enumeration value="checkbox">
678 <xsd:annotation>
679 <xsd:documentation>Indicates check box object, for example a CHECKBOX control in Windows.</xsd:documentation>
680 </xsd:annotation>
681 </xsd:enumeration>
682 <xsd:enumeration value="checkboxmenuitem">
683 <xsd:annotation>
684 <xsd:documentation>Indicates a menu item with an associated checkbox.</xsd:documentation>
685 </xsd:annotation>
686 </xsd:enumeration>
687 <xsd:enumeration value="checkedlistbox">
688 <xsd:annotation>
689 <xsd:documentation>Indicates a list box, but with a check-box for each item.</xsd:documentation>
690 </xsd:annotation>
691 </xsd:enumeration>
692 <xsd:enumeration value="colorchooser">
693 <xsd:annotation>
694 <xsd:documentation>Indicates a color selection dialog.</xsd:documentation>
695 </xsd:annotation>
696 </xsd:enumeration>
697 <xsd:enumeration value="combobox">
698 <xsd:annotation>
699 <xsd:documentation>Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows.</xsd:documentation>
700 </xsd:annotation>
701 </xsd:enumeration>
702 <xsd:enumeration value="comboboxexitem">
703 <xsd:annotation>
704 <xsd:documentation>Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234).</xsd:documentation>
705 </xsd:annotation>
706 </xsd:enumeration>
707 <xsd:enumeration value="comboboxitem">
708 <xsd:annotation>
709 <xsd:documentation>Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403).</xsd:documentation>
710 </xsd:annotation>
711 </xsd:enumeration>
712 <xsd:enumeration value="component">
713 <xsd:annotation>
714 <xsd:documentation>Indicates a UI base class element that cannot be represented by any other element.</xsd:documentation>
715 </xsd:annotation>
716 </xsd:enumeration>
717 <xsd:enumeration value="contextmenu">
718 <xsd:annotation>
719 <xsd:documentation>Indicates a context menu.</xsd:documentation>
720 </xsd:annotation>
721 </xsd:enumeration>
722 <xsd:enumeration value="ctext">
723 <xsd:annotation>
724 <xsd:documentation>Indicates a Windows RC CTEXT control.</xsd:documentation>
725 </xsd:annotation>
726 </xsd:enumeration>
727 <xsd:enumeration value="cursor">
728 <xsd:annotation>
729 <xsd:documentation>Indicates a cursor, for example a CURSOR resource in Windows.</xsd:documentation>
730 </xsd:annotation>
731 </xsd:enumeration>
732 <xsd:enumeration value="datetimepicker">
733 <xsd:annotation>
734 <xsd:documentation>Indicates a date/time picker.</xsd:documentation>
735 </xsd:annotation>
736 </xsd:enumeration>
737 <xsd:enumeration value="defpushbutton">
738 <xsd:annotation>
739 <xsd:documentation>Indicates a Windows RC DEFPUSHBUTTON control.</xsd:documentation>
740 </xsd:annotation>
741 </xsd:enumeration>
742 <xsd:enumeration value="dialog">
743 <xsd:annotation>
744 <xsd:documentation>Indicates a dialog box.</xsd:documentation>
745 </xsd:annotation>
746 </xsd:enumeration>
747 <xsd:enumeration value="dlginit">
748 <xsd:annotation>
749 <xsd:documentation>Indicates a Windows RC DLGINIT resource block.</xsd:documentation>
750 </xsd:annotation>
751 </xsd:enumeration>
752 <xsd:enumeration value="edit">
753 <xsd:annotation>
754 <xsd:documentation>Indicates an edit box object, for example an EDIT control in Windows.</xsd:documentation>
755 </xsd:annotation>
756 </xsd:enumeration>
757 <xsd:enumeration value="file">
758 <xsd:annotation>
759 <xsd:documentation>Indicates a filename.</xsd:documentation>
760 </xsd:annotation>
761 </xsd:enumeration>
762 <xsd:enumeration value="filechooser">
763 <xsd:annotation>
764 <xsd:documentation>Indicates a file dialog.</xsd:documentation>
765 </xsd:annotation>
766 </xsd:enumeration>
767 <xsd:enumeration value="fn">
768 <xsd:annotation>
769 <xsd:documentation>Indicates a footnote.</xsd:documentation>
770 </xsd:annotation>
771 </xsd:enumeration>
772 <xsd:enumeration value="font">
773 <xsd:annotation>
774 <xsd:documentation>Indicates a font name.</xsd:documentation>
775 </xsd:annotation>
776 </xsd:enumeration>
777 <xsd:enumeration value="footer">
778 <xsd:annotation>
779 <xsd:documentation>Indicates a footer.</xsd:documentation>
780 </xsd:annotation>
781 </xsd:enumeration>
782 <xsd:enumeration value="frame">
783 <xsd:annotation>
784 <xsd:documentation>Indicates a frame object.</xsd:documentation>
785 </xsd:annotation>
786 </xsd:enumeration>
787 <xsd:enumeration value="grid">
788 <xsd:annotation>
789 <xsd:documentation>Indicates a XUL grid element.</xsd:documentation>
790 </xsd:annotation>
791 </xsd:enumeration>
792 <xsd:enumeration value="groupbox">
793 <xsd:annotation>
794 <xsd:documentation>Indicates a groupbox object, for example a GROUPBOX control in Windows.</xsd:documentation>
795 </xsd:annotation>
796 </xsd:enumeration>
797 <xsd:enumeration value="header">
798 <xsd:annotation>
799 <xsd:documentation>Indicates a header item.</xsd:documentation>
800 </xsd:annotation>
801 </xsd:enumeration>
802 <xsd:enumeration value="heading">
803 <xsd:annotation>
804 <xsd:documentation>Indicates a heading, such has the content of &lt;h1&gt;, &lt;h2&gt;, etc. in HTML.</xsd:documentation>
805 </xsd:annotation>
806 </xsd:enumeration>
807 <xsd:enumeration value="hedit">
808 <xsd:annotation>
809 <xsd:documentation>Indicates a Windows RC HEDIT control.</xsd:documentation>
810 </xsd:annotation>
811 </xsd:enumeration>
812 <xsd:enumeration value="hscrollbar">
813 <xsd:annotation>
814 <xsd:documentation>Indicates a horizontal scrollbar.</xsd:documentation>
815 </xsd:annotation>
816 </xsd:enumeration>
817 <xsd:enumeration value="icon">
818 <xsd:annotation>
819 <xsd:documentation>Indicates an icon, for example an ICON resource in Windows.</xsd:documentation>
820 </xsd:annotation>
821 </xsd:enumeration>
822 <xsd:enumeration value="iedit">
823 <xsd:annotation>
824 <xsd:documentation>Indicates a Windows RC IEDIT control.</xsd:documentation>
825 </xsd:annotation>
826 </xsd:enumeration>
827 <xsd:enumeration value="keywords">
828 <xsd:annotation>
829 <xsd:documentation>Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF.</xsd:documentation>
830 </xsd:annotation>
831 </xsd:enumeration>
832 <xsd:enumeration value="label">
833 <xsd:annotation>
834 <xsd:documentation>Indicates a label object.</xsd:documentation>
835 </xsd:annotation>
836 </xsd:enumeration>
837 <xsd:enumeration value="linklabel">
838 <xsd:annotation>
839 <xsd:documentation>Indicates a label that is also a HTML link (not necessarily a URL).</xsd:documentation>
840 </xsd:annotation>
841 </xsd:enumeration>
842 <xsd:enumeration value="list">
843 <xsd:annotation>
844 <xsd:documentation>Indicates a list (a group of list-items, for example an &lt;ol&gt; or &lt;ul&gt; element in HTML).</xsd:documentation>
845 </xsd:annotation>
846 </xsd:enumeration>
847 <xsd:enumeration value="listbox">
848 <xsd:annotation>
849 <xsd:documentation>Indicates a listbox object, for example an LISTBOX control in Windows.</xsd:documentation>
850 </xsd:annotation>
851 </xsd:enumeration>
852 <xsd:enumeration value="listitem">
853 <xsd:annotation>
854 <xsd:documentation>Indicates an list item (an entry in a list).</xsd:documentation>
855 </xsd:annotation>
856 </xsd:enumeration>
857 <xsd:enumeration value="ltext">
858 <xsd:annotation>
859 <xsd:documentation>Indicates a Windows RC LTEXT control.</xsd:documentation>
860 </xsd:annotation>
861 </xsd:enumeration>
862 <xsd:enumeration value="menu">
863 <xsd:annotation>
864 <xsd:documentation>Indicates a menu (a group of menu-items).</xsd:documentation>
865 </xsd:annotation>
866 </xsd:enumeration>
867 <xsd:enumeration value="menubar">
868 <xsd:annotation>
869 <xsd:documentation>Indicates a toolbar containing one or more tope level menus.</xsd:documentation>
870 </xsd:annotation>
871 </xsd:enumeration>
872 <xsd:enumeration value="menuitem">
873 <xsd:annotation>
874 <xsd:documentation>Indicates a menu item (an entry in a menu).</xsd:documentation>
875 </xsd:annotation>
876 </xsd:enumeration>
877 <xsd:enumeration value="menuseparator">
878 <xsd:annotation>
879 <xsd:documentation>Indicates a XUL menuseparator element.</xsd:documentation>
880 </xsd:annotation>
881 </xsd:enumeration>
882 <xsd:enumeration value="message">
883 <xsd:annotation>
884 <xsd:documentation>Indicates a message, for example an entry in a MESSAGETABLE resource in Windows.</xsd:documentation>
885 </xsd:annotation>
886 </xsd:enumeration>
887 <xsd:enumeration value="monthcalendar">
888 <xsd:annotation>
889 <xsd:documentation>Indicates a calendar control.</xsd:documentation>
890 </xsd:annotation>
891 </xsd:enumeration>
892 <xsd:enumeration value="numericupdown">
893 <xsd:annotation>
894 <xsd:documentation>Indicates an edit box beside a spin control.</xsd:documentation>
895 </xsd:annotation>
896 </xsd:enumeration>
897 <xsd:enumeration value="panel">
898 <xsd:annotation>
899 <xsd:documentation>Indicates a catch all for rectangular areas.</xsd:documentation>
900 </xsd:annotation>
901 </xsd:enumeration>
902 <xsd:enumeration value="popupmenu">
903 <xsd:annotation>
904 <xsd:documentation>Indicates a standalone menu not necessarily associated with a menubar.</xsd:documentation>
905 </xsd:annotation>
906 </xsd:enumeration>
907 <xsd:enumeration value="pushbox">
908 <xsd:annotation>
909 <xsd:documentation>Indicates a pushbox object, for example a PUSHBOX control in Windows.</xsd:documentation>
910 </xsd:annotation>
911 </xsd:enumeration>
912 <xsd:enumeration value="pushbutton">
913 <xsd:annotation>
914 <xsd:documentation>Indicates a Windows RC PUSHBUTTON control.</xsd:documentation>
915 </xsd:annotation>
916 </xsd:enumeration>
917 <xsd:enumeration value="radio">
918 <xsd:annotation>
919 <xsd:documentation>Indicates a radio button object.</xsd:documentation>
920 </xsd:annotation>
921 </xsd:enumeration>
922 <xsd:enumeration value="radiobuttonmenuitem">
923 <xsd:annotation>
924 <xsd:documentation>Indicates a menuitem with associated radio button.</xsd:documentation>
925 </xsd:annotation>
926 </xsd:enumeration>
927 <xsd:enumeration value="rcdata">
928 <xsd:annotation>
929 <xsd:documentation>Indicates raw data resources for an application.</xsd:documentation>
930 </xsd:annotation>
931 </xsd:enumeration>
932 <xsd:enumeration value="row">
933 <xsd:annotation>
934 <xsd:documentation>Indicates a row in a table.</xsd:documentation>
935 </xsd:annotation>
936 </xsd:enumeration>
937 <xsd:enumeration value="rtext">
938 <xsd:annotation>
939 <xsd:documentation>Indicates a Windows RC RTEXT control.</xsd:documentation>
940 </xsd:annotation>
941 </xsd:enumeration>
942 <xsd:enumeration value="scrollpane">
943 <xsd:annotation>
944 <xsd:documentation>Indicates a user navigable container used to show a portion of a document.</xsd:documentation>
945 </xsd:annotation>
946 </xsd:enumeration>
947 <xsd:enumeration value="separator">
948 <xsd:annotation>
949 <xsd:documentation>Indicates a generic divider object (e.g. menu group separator).</xsd:documentation>
950 </xsd:annotation>
951 </xsd:enumeration>
952 <xsd:enumeration value="shortcut">
953 <xsd:annotation>
954 <xsd:documentation>Windows accelerators, shortcuts in resource or property files.</xsd:documentation>
955 </xsd:annotation>
956 </xsd:enumeration>
957 <xsd:enumeration value="spinner">
958 <xsd:annotation>
959 <xsd:documentation>Indicates a UI control to indicate process activity but not progress.</xsd:documentation>
960 </xsd:annotation>
961 </xsd:enumeration>
962 <xsd:enumeration value="splitter">
963 <xsd:annotation>
964 <xsd:documentation>Indicates a splitter bar.</xsd:documentation>
965 </xsd:annotation>
966 </xsd:enumeration>
967 <xsd:enumeration value="state3">
968 <xsd:annotation>
969 <xsd:documentation>Indicates a Windows RC STATE3 control.</xsd:documentation>
970 </xsd:annotation>
971 </xsd:enumeration>
972 <xsd:enumeration value="statusbar">
973 <xsd:annotation>
974 <xsd:documentation>Indicates a window for providing feedback to the users, like 'read-only', etc.</xsd:documentation>
975 </xsd:annotation>
976 </xsd:enumeration>
977 <xsd:enumeration value="string">
978 <xsd:annotation>
979 <xsd:documentation>Indicates a string, for example an entry in a STRINGTABLE resource in Windows.</xsd:documentation>
980 </xsd:annotation>
981 </xsd:enumeration>
982 <xsd:enumeration value="tabcontrol">
983 <xsd:annotation>
984 <xsd:documentation>Indicates a layers of controls with a tab to select layers.</xsd:documentation>
985 </xsd:annotation>
986 </xsd:enumeration>
987 <xsd:enumeration value="table">
988 <xsd:annotation>
989 <xsd:documentation>Indicates a display and edits regular two-dimensional tables of cells.</xsd:documentation>
990 </xsd:annotation>
991 </xsd:enumeration>
992 <xsd:enumeration value="textbox">
993 <xsd:annotation>
994 <xsd:documentation>Indicates a XUL textbox element.</xsd:documentation>
995 </xsd:annotation>
996 </xsd:enumeration>
997 <xsd:enumeration value="togglebutton">
998 <xsd:annotation>
999 <xsd:documentation>Indicates a UI button that can be toggled to on or off state.</xsd:documentation>
1000 </xsd:annotation>
1001 </xsd:enumeration>
1002 <xsd:enumeration value="toolbar">
1003 <xsd:annotation>
1004 <xsd:documentation>Indicates an array of controls, usually buttons.</xsd:documentation>
1005 </xsd:annotation>
1006 </xsd:enumeration>
1007 <xsd:enumeration value="tooltip">
1008 <xsd:annotation>
1009 <xsd:documentation>Indicates a pop up tool tip text.</xsd:documentation>
1010 </xsd:annotation>
1011 </xsd:enumeration>
1012 <xsd:enumeration value="trackbar">
1013 <xsd:annotation>
1014 <xsd:documentation>Indicates a bar with a pointer indicating a position within a certain range.</xsd:documentation>
1015 </xsd:annotation>
1016 </xsd:enumeration>
1017 <xsd:enumeration value="tree">
1018 <xsd:annotation>
1019 <xsd:documentation>Indicates a control that displays a set of hierarchical data.</xsd:documentation>
1020 </xsd:annotation>
1021 </xsd:enumeration>
1022 <xsd:enumeration value="uri">
1023 <xsd:annotation>
1024 <xsd:documentation>Indicates a URI (URN or URL).</xsd:documentation>
1025 </xsd:annotation>
1026 </xsd:enumeration>
1027 <xsd:enumeration value="userbutton">
1028 <xsd:annotation>
1029 <xsd:documentation>Indicates a Windows RC USERBUTTON control.</xsd:documentation>
1030 </xsd:annotation>
1031 </xsd:enumeration>
1032 <xsd:enumeration value="usercontrol">
1033 <xsd:annotation>
1034 <xsd:documentation>Indicates a user-defined control like CONTROL control in Windows.</xsd:documentation>
1035 </xsd:annotation>
1036 </xsd:enumeration>
1037 <xsd:enumeration value="var">
1038 <xsd:annotation>
1039 <xsd:documentation>Indicates the text of a variable.</xsd:documentation>
1040 </xsd:annotation>
1041 </xsd:enumeration>
1042 <xsd:enumeration value="versioninfo">
1043 <xsd:annotation>
1044 <xsd:documentation>Indicates version information about a resource like VERSIONINFO in Windows.</xsd:documentation>
1045 </xsd:annotation>
1046 </xsd:enumeration>
1047 <xsd:enumeration value="vscrollbar">
1048 <xsd:annotation>
1049 <xsd:documentation>Indicates a vertical scrollbar.</xsd:documentation>
1050 </xsd:annotation>
1051 </xsd:enumeration>
1052 <xsd:enumeration value="window">
1053 <xsd:annotation>
1054 <xsd:documentation>Indicates a graphical window.</xsd:documentation>
1055 </xsd:annotation>
1056 </xsd:enumeration>
1057 </xsd:restriction>
1058 </xsd:simpleType>
1059 <xsd:simpleType name="size-unitValueList">
1060 <xsd:annotation>
1061 <xsd:documentation>Values for the attribute 'size-unit'.</xsd:documentation>
1062 </xsd:annotation>
1063 <xsd:restriction base="xsd:NMTOKEN">
1064 <xsd:enumeration value="byte">
1065 <xsd:annotation>
1066 <xsd:documentation>Indicates a size in 8-bit bytes.</xsd:documentation>
1067 </xsd:annotation>
1068 </xsd:enumeration>
1069 <xsd:enumeration value="char">
1070 <xsd:annotation>
1071 <xsd:documentation>Indicates a size in Unicode characters.</xsd:documentation>
1072 </xsd:annotation>
1073 </xsd:enumeration>
1074 <xsd:enumeration value="col">
1075 <xsd:annotation>
1076 <xsd:documentation>Indicates a size in columns. Used for HTML text area.</xsd:documentation>
1077 </xsd:annotation>
1078 </xsd:enumeration>
1079 <xsd:enumeration value="cm">
1080 <xsd:annotation>
1081 <xsd:documentation>Indicates a size in centimeters.</xsd:documentation>
1082 </xsd:annotation>
1083 </xsd:enumeration>
1084 <xsd:enumeration value="dlgunit">
1085 <xsd:annotation>
1086 <xsd:documentation>Indicates a size in dialog units, as defined in Windows resources.</xsd:documentation>
1087 </xsd:annotation>
1088 </xsd:enumeration>
1089 <xsd:enumeration value="em">
1090 <xsd:annotation>
1091 <xsd:documentation>Indicates a size in 'font-size' units (as defined in CSS).</xsd:documentation>
1092 </xsd:annotation>
1093 </xsd:enumeration>
1094 <xsd:enumeration value="ex">
1095 <xsd:annotation>
1096 <xsd:documentation>Indicates a size in 'x-height' units (as defined in CSS).</xsd:documentation>
1097 </xsd:annotation>
1098 </xsd:enumeration>
1099 <xsd:enumeration value="glyph">
1100 <xsd:annotation>
1101 <xsd:documentation>Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster'</xsd:documentation>
1102 </xsd:annotation>
1103 </xsd:enumeration>
1104 <xsd:enumeration value="in">
1105 <xsd:annotation>
1106 <xsd:documentation>Indicates a size in inches.</xsd:documentation>
1107 </xsd:annotation>
1108 </xsd:enumeration>
1109 <xsd:enumeration value="mm">
1110 <xsd:annotation>
1111 <xsd:documentation>Indicates a size in millimeters.</xsd:documentation>
1112 </xsd:annotation>
1113 </xsd:enumeration>
1114 <xsd:enumeration value="percent">
1115 <xsd:annotation>
1116 <xsd:documentation>Indicates a size in percentage.</xsd:documentation>
1117 </xsd:annotation>
1118 </xsd:enumeration>
1119 <xsd:enumeration value="pixel">
1120 <xsd:annotation>
1121 <xsd:documentation>Indicates a size in pixels.</xsd:documentation>
1122 </xsd:annotation>
1123 </xsd:enumeration>
1124 <xsd:enumeration value="point">
1125 <xsd:annotation>
1126 <xsd:documentation>Indicates a size in point.</xsd:documentation>
1127 </xsd:annotation>
1128 </xsd:enumeration>
1129 <xsd:enumeration value="row">
1130 <xsd:annotation>
1131 <xsd:documentation>Indicates a size in rows. Used for HTML text area.</xsd:documentation>
1132 </xsd:annotation>
1133 </xsd:enumeration>
1134 </xsd:restriction>
1135 </xsd:simpleType>
1136 <xsd:simpleType name="stateValueList">
1137 <xsd:annotation>
1138 <xsd:documentation>Values for the attribute 'state'.</xsd:documentation>
1139 </xsd:annotation>
1140 <xsd:restriction base="xsd:NMTOKEN">
1141 <xsd:enumeration value="final">
1142 <xsd:annotation>
1143 <xsd:documentation>Indicates the terminating state.</xsd:documentation>
1144 </xsd:annotation>
1145 </xsd:enumeration>
1146 <xsd:enumeration value="needs-adaptation">
1147 <xsd:annotation>
1148 <xsd:documentation>Indicates only non-textual information needs adaptation.</xsd:documentation>
1149 </xsd:annotation>
1150 </xsd:enumeration>
1151 <xsd:enumeration value="needs-l10n">
1152 <xsd:annotation>
1153 <xsd:documentation>Indicates both text and non-textual information needs adaptation.</xsd:documentation>
1154 </xsd:annotation>
1155 </xsd:enumeration>
1156 <xsd:enumeration value="needs-review-adaptation">
1157 <xsd:annotation>
1158 <xsd:documentation>Indicates only non-textual information needs review.</xsd:documentation>
1159 </xsd:annotation>
1160 </xsd:enumeration>
1161 <xsd:enumeration value="needs-review-l10n">
1162 <xsd:annotation>
1163 <xsd:documentation>Indicates both text and non-textual information needs review.</xsd:documentation>
1164 </xsd:annotation>
1165 </xsd:enumeration>
1166 <xsd:enumeration value="needs-review-translation">
1167 <xsd:annotation>
1168 <xsd:documentation>Indicates that only the text of the item needs to be reviewed.</xsd:documentation>
1169 </xsd:annotation>
1170 </xsd:enumeration>
1171 <xsd:enumeration value="needs-translation">
1172 <xsd:annotation>
1173 <xsd:documentation>Indicates that the item needs to be translated.</xsd:documentation>
1174 </xsd:annotation>
1175 </xsd:enumeration>
1176 <xsd:enumeration value="new">
1177 <xsd:annotation>
1178 <xsd:documentation>Indicates that the item is new. For example, translation units that were not in a previous version of the document.</xsd:documentation>
1179 </xsd:annotation>
1180 </xsd:enumeration>
1181 <xsd:enumeration value="signed-off">
1182 <xsd:annotation>
1183 <xsd:documentation>Indicates that changes are reviewed and approved.</xsd:documentation>
1184 </xsd:annotation>
1185 </xsd:enumeration>
1186 <xsd:enumeration value="translated">
1187 <xsd:annotation>
1188 <xsd:documentation>Indicates that the item has been translated.</xsd:documentation>
1189 </xsd:annotation>
1190 </xsd:enumeration>
1191 </xsd:restriction>
1192 </xsd:simpleType>
1193 <xsd:simpleType name="state-qualifierValueList">
1194 <xsd:annotation>
1195 <xsd:documentation>Values for the attribute 'state-qualifier'.</xsd:documentation>
1196 </xsd:annotation>
1197 <xsd:restriction base="xsd:NMTOKEN">
1198 <xsd:enumeration value="exact-match">
1199 <xsd:annotation>
1200 <xsd:documentation>Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously.</xsd:documentation>
1201 </xsd:annotation>
1202 </xsd:enumeration>
1203 <xsd:enumeration value="fuzzy-match">
1204 <xsd:annotation>
1205 <xsd:documentation>Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.).</xsd:documentation>
1206 </xsd:annotation>
1207 </xsd:enumeration>
1208 <xsd:enumeration value="id-match">
1209 <xsd:annotation>
1210 <xsd:documentation>Indicates a match based on matching IDs (in addition to matching text).</xsd:documentation>
1211 </xsd:annotation>
1212 </xsd:enumeration>
1213 <xsd:enumeration value="leveraged-glossary">
1214 <xsd:annotation>
1215 <xsd:documentation>Indicates a translation derived from a glossary.</xsd:documentation>
1216 </xsd:annotation>
1217 </xsd:enumeration>
1218 <xsd:enumeration value="leveraged-inherited">
1219 <xsd:annotation>
1220 <xsd:documentation>Indicates a translation derived from existing translation.</xsd:documentation>
1221 </xsd:annotation>
1222 </xsd:enumeration>
1223 <xsd:enumeration value="leveraged-mt">
1224 <xsd:annotation>
1225 <xsd:documentation>Indicates a translation derived from machine translation.</xsd:documentation>
1226 </xsd:annotation>
1227 </xsd:enumeration>
1228 <xsd:enumeration value="leveraged-repository">
1229 <xsd:annotation>
1230 <xsd:documentation>Indicates a translation derived from a translation repository.</xsd:documentation>
1231 </xsd:annotation>
1232 </xsd:enumeration>
1233 <xsd:enumeration value="leveraged-tm">
1234 <xsd:annotation>
1235 <xsd:documentation>Indicates a translation derived from a translation memory.</xsd:documentation>
1236 </xsd:annotation>
1237 </xsd:enumeration>
1238 <xsd:enumeration value="mt-suggestion">
1239 <xsd:annotation>
1240 <xsd:documentation>Indicates the translation is suggested by machine translation.</xsd:documentation>
1241 </xsd:annotation>
1242 </xsd:enumeration>
1243 <xsd:enumeration value="rejected-grammar">
1244 <xsd:annotation>
1245 <xsd:documentation>Indicates that the item has been rejected because of incorrect grammar.</xsd:documentation>
1246 </xsd:annotation>
1247 </xsd:enumeration>
1248 <xsd:enumeration value="rejected-inaccurate">
1249 <xsd:annotation>
1250 <xsd:documentation>Indicates that the item has been rejected because it is incorrect.</xsd:documentation>
1251 </xsd:annotation>
1252 </xsd:enumeration>
1253 <xsd:enumeration value="rejected-length">
1254 <xsd:annotation>
1255 <xsd:documentation>Indicates that the item has been rejected because it is too long or too short.</xsd:documentation>
1256 </xsd:annotation>
1257 </xsd:enumeration>
1258 <xsd:enumeration value="rejected-spelling">
1259 <xsd:annotation>
1260 <xsd:documentation>Indicates that the item has been rejected because of incorrect spelling.</xsd:documentation>
1261 </xsd:annotation>
1262 </xsd:enumeration>
1263 <xsd:enumeration value="tm-suggestion">
1264 <xsd:annotation>
1265 <xsd:documentation>Indicates the translation is suggested by translation memory.</xsd:documentation>
1266 </xsd:annotation>
1267 </xsd:enumeration>
1268 </xsd:restriction>
1269 </xsd:simpleType>
1270 <xsd:simpleType name="unitValueList">
1271 <xsd:annotation>
1272 <xsd:documentation>Values for the attribute 'unit'.</xsd:documentation>
1273 </xsd:annotation>
1274 <xsd:restriction base="xsd:NMTOKEN">
1275 <xsd:enumeration value="word">
1276 <xsd:annotation>
1277 <xsd:documentation>Refers to words.</xsd:documentation>
1278 </xsd:annotation>
1279 </xsd:enumeration>
1280 <xsd:enumeration value="page">
1281 <xsd:annotation>
1282 <xsd:documentation>Refers to pages.</xsd:documentation>
1283 </xsd:annotation>
1284 </xsd:enumeration>
1285 <xsd:enumeration value="trans-unit">
1286 <xsd:annotation>
1287 <xsd:documentation>Refers to &lt;trans-unit&gt; elements.</xsd:documentation>
1288 </xsd:annotation>
1289 </xsd:enumeration>
1290 <xsd:enumeration value="bin-unit">
1291 <xsd:annotation>
1292 <xsd:documentation>Refers to &lt;bin-unit&gt; elements.</xsd:documentation>
1293 </xsd:annotation>
1294 </xsd:enumeration>
1295 <xsd:enumeration value="glyph">
1296 <xsd:annotation>
1297 <xsd:documentation>Refers to glyphs.</xsd:documentation>
1298 </xsd:annotation>
1299 </xsd:enumeration>
1300 <xsd:enumeration value="item">
1301 <xsd:annotation>
1302 <xsd:documentation>Refers to &lt;trans-unit&gt; and/or &lt;bin-unit&gt; elements.</xsd:documentation>
1303 </xsd:annotation>
1304 </xsd:enumeration>
1305 <xsd:enumeration value="instance">
1306 <xsd:annotation>
1307 <xsd:documentation>Refers to the occurrences of instances defined by the count-type value.</xsd:documentation>
1308 </xsd:annotation>
1309 </xsd:enumeration>
1310 <xsd:enumeration value="character">
1311 <xsd:annotation>
1312 <xsd:documentation>Refers to characters.</xsd:documentation>
1313 </xsd:annotation>
1314 </xsd:enumeration>
1315 <xsd:enumeration value="line">
1316 <xsd:annotation>
1317 <xsd:documentation>Refers to lines.</xsd:documentation>
1318 </xsd:annotation>
1319 </xsd:enumeration>
1320 <xsd:enumeration value="sentence">
1321 <xsd:annotation>
1322 <xsd:documentation>Refers to sentences.</xsd:documentation>
1323 </xsd:annotation>
1324 </xsd:enumeration>
1325 <xsd:enumeration value="paragraph">
1326 <xsd:annotation>
1327 <xsd:documentation>Refers to paragraphs.</xsd:documentation>
1328 </xsd:annotation>
1329 </xsd:enumeration>
1330 <xsd:enumeration value="segment">
1331 <xsd:annotation>
1332 <xsd:documentation>Refers to segments.</xsd:documentation>
1333 </xsd:annotation>
1334 </xsd:enumeration>
1335 <xsd:enumeration value="placeable">
1336 <xsd:annotation>
1337 <xsd:documentation>Refers to placeables (inline elements).</xsd:documentation>
1338 </xsd:annotation>
1339 </xsd:enumeration>
1340 </xsd:restriction>
1341 </xsd:simpleType>
1342 <xsd:simpleType name="priorityValueList">
1343 <xsd:annotation>
1344 <xsd:documentation>Values for the attribute 'priority'.</xsd:documentation>
1345 </xsd:annotation>
1346 <xsd:restriction base="xsd:positiveInteger">
1347 <xsd:enumeration value="1">
1348 <xsd:annotation>
1349 <xsd:documentation>Highest priority.</xsd:documentation>
1350 </xsd:annotation>
1351 </xsd:enumeration>
1352 <xsd:enumeration value="2">
1353 <xsd:annotation>
1354 <xsd:documentation>High priority.</xsd:documentation>
1355 </xsd:annotation>
1356 </xsd:enumeration>
1357 <xsd:enumeration value="3">
1358 <xsd:annotation>
1359 <xsd:documentation>High priority, but not as important as 2.</xsd:documentation>
1360 </xsd:annotation>
1361 </xsd:enumeration>
1362 <xsd:enumeration value="4">
1363 <xsd:annotation>
1364 <xsd:documentation>High priority, but not as important as 3.</xsd:documentation>
1365 </xsd:annotation>
1366 </xsd:enumeration>
1367 <xsd:enumeration value="5">
1368 <xsd:annotation>
1369 <xsd:documentation>Medium priority, but more important than 6.</xsd:documentation>
1370 </xsd:annotation>
1371 </xsd:enumeration>
1372 <xsd:enumeration value="6">
1373 <xsd:annotation>
1374 <xsd:documentation>Medium priority, but less important than 5.</xsd:documentation>
1375 </xsd:annotation>
1376 </xsd:enumeration>
1377 <xsd:enumeration value="7">
1378 <xsd:annotation>
1379 <xsd:documentation>Low priority, but more important than 8.</xsd:documentation>
1380 </xsd:annotation>
1381 </xsd:enumeration>
1382 <xsd:enumeration value="8">
1383 <xsd:annotation>
1384 <xsd:documentation>Low priority, but more important than 9.</xsd:documentation>
1385 </xsd:annotation>
1386 </xsd:enumeration>
1387 <xsd:enumeration value="9">
1388 <xsd:annotation>
1389 <xsd:documentation>Low priority.</xsd:documentation>
1390 </xsd:annotation>
1391 </xsd:enumeration>
1392 <xsd:enumeration value="10">
1393 <xsd:annotation>
1394 <xsd:documentation>Lowest priority.</xsd:documentation>
1395 </xsd:annotation>
1396 </xsd:enumeration>
1397 </xsd:restriction>
1398 </xsd:simpleType>
1399 <xsd:simpleType name="reformatValueYesNo">
1400 <xsd:restriction base="xsd:string">
1401 <xsd:enumeration value="yes">
1402 <xsd:annotation>
1403 <xsd:documentation>This value indicates that all properties can be reformatted. This value must be used alone.</xsd:documentation>
1404 </xsd:annotation>
1405 </xsd:enumeration>
1406 <xsd:enumeration value="no">
1407 <xsd:annotation>
1408 <xsd:documentation>This value indicates that no properties should be reformatted. This value must be used alone.</xsd:documentation>
1409 </xsd:annotation>
1410 </xsd:enumeration>
1411 </xsd:restriction>
1412 </xsd:simpleType>
1413 <xsd:simpleType name="reformatValueList">
1414 <xsd:list>
1415 <xsd:simpleType>
1416 <xsd:union memberTypes="xlf:XTend">
1417 <xsd:simpleType>
1418 <xsd:restriction base="xsd:string">
1419 <xsd:enumeration value="coord">
1420 <xsd:annotation>
1421 <xsd:documentation>This value indicates that all information in the coord attribute can be modified.</xsd:documentation>
1422 </xsd:annotation>
1423 </xsd:enumeration>
1424 <xsd:enumeration value="coord-x">
1425 <xsd:annotation>
1426 <xsd:documentation>This value indicates that the x information in the coord attribute can be modified.</xsd:documentation>
1427 </xsd:annotation>
1428 </xsd:enumeration>
1429 <xsd:enumeration value="coord-y">
1430 <xsd:annotation>
1431 <xsd:documentation>This value indicates that the y information in the coord attribute can be modified.</xsd:documentation>
1432 </xsd:annotation>
1433 </xsd:enumeration>
1434 <xsd:enumeration value="coord-cx">
1435 <xsd:annotation>
1436 <xsd:documentation>This value indicates that the cx information in the coord attribute can be modified.</xsd:documentation>
1437 </xsd:annotation>
1438 </xsd:enumeration>
1439 <xsd:enumeration value="coord-cy">
1440 <xsd:annotation>
1441 <xsd:documentation>This value indicates that the cy information in the coord attribute can be modified.</xsd:documentation>
1442 </xsd:annotation>
1443 </xsd:enumeration>
1444 <xsd:enumeration value="font">
1445 <xsd:annotation>
1446 <xsd:documentation>This value indicates that all the information in the font attribute can be modified.</xsd:documentation>
1447 </xsd:annotation>
1448 </xsd:enumeration>
1449 <xsd:enumeration value="font-name">
1450 <xsd:annotation>
1451 <xsd:documentation>This value indicates that the name information in the font attribute can be modified.</xsd:documentation>
1452 </xsd:annotation>
1453 </xsd:enumeration>
1454 <xsd:enumeration value="font-size">
1455 <xsd:annotation>
1456 <xsd:documentation>This value indicates that the size information in the font attribute can be modified.</xsd:documentation>
1457 </xsd:annotation>
1458 </xsd:enumeration>
1459 <xsd:enumeration value="font-weight">
1460 <xsd:annotation>
1461 <xsd:documentation>This value indicates that the weight information in the font attribute can be modified.</xsd:documentation>
1462 </xsd:annotation>
1463 </xsd:enumeration>
1464 <xsd:enumeration value="css-style">
1465 <xsd:annotation>
1466 <xsd:documentation>This value indicates that the information in the css-style attribute can be modified.</xsd:documentation>
1467 </xsd:annotation>
1468 </xsd:enumeration>
1469 <xsd:enumeration value="style">
1470 <xsd:annotation>
1471 <xsd:documentation>This value indicates that the information in the style attribute can be modified.</xsd:documentation>
1472 </xsd:annotation>
1473 </xsd:enumeration>
1474 <xsd:enumeration value="ex-style">
1475 <xsd:annotation>
1476 <xsd:documentation>This value indicates that the information in the exstyle attribute can be modified.</xsd:documentation>
1477 </xsd:annotation>
1478 </xsd:enumeration>
1479 </xsd:restriction>
1480 </xsd:simpleType>
1481 </xsd:union>
1482 </xsd:simpleType>
1483 </xsd:list>
1484 </xsd:simpleType>
1485 <xsd:simpleType name="purposeValueList">
1486 <xsd:restriction base="xsd:string">
1487 <xsd:enumeration value="information">
1488 <xsd:annotation>
1489 <xsd:documentation>Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document.</xsd:documentation>
1490 </xsd:annotation>
1491 </xsd:enumeration>
1492 <xsd:enumeration value="location">
1493 <xsd:annotation>
1494 <xsd:documentation>Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed.</xsd:documentation>
1495 </xsd:annotation>
1496 </xsd:enumeration>
1497 <xsd:enumeration value="match">
1498 <xsd:annotation>
1499 <xsd:documentation>Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed.</xsd:documentation>
1500 </xsd:annotation>
1501 </xsd:enumeration>
1502 </xsd:restriction>
1503 </xsd:simpleType>
1504 <xsd:simpleType name="alttranstypeValueList">
1505 <xsd:restriction base="xsd:string">
1506 <xsd:enumeration value="proposal">
1507 <xsd:annotation>
1508 <xsd:documentation>Represents a translation proposal from a translation memory or other resource.</xsd:documentation>
1509 </xsd:annotation>
1510 </xsd:enumeration>
1511 <xsd:enumeration value="previous-version">
1512 <xsd:annotation>
1513 <xsd:documentation>Represents a previous version of the target element.</xsd:documentation>
1514 </xsd:annotation>
1515 </xsd:enumeration>
1516 <xsd:enumeration value="rejected">
1517 <xsd:annotation>
1518 <xsd:documentation>Represents a rejected version of the target element.</xsd:documentation>
1519 </xsd:annotation>
1520 </xsd:enumeration>
1521 <xsd:enumeration value="reference">
1522 <xsd:annotation>
1523 <xsd:documentation>Represents a translation to be used for reference purposes only, for example from a related product or a different language.</xsd:documentation>
1524 </xsd:annotation>
1525 </xsd:enumeration>
1526 <xsd:enumeration value="accepted">
1527 <xsd:annotation>
1528 <xsd:documentation>Represents a proposed translation that was used for the translation of the trans-unit, possibly modified.</xsd:documentation>
1529 </xsd:annotation>
1530 </xsd:enumeration>
1531 </xsd:restriction>
1532 </xsd:simpleType>
1533 <!-- Other Types -->
1534 <xsd:complexType name="ElemType_ExternalReference">
1535 <xsd:choice>
1536 <xsd:element ref="xlf:internal-file"/>
1537 <xsd:element ref="xlf:external-file"/>
1538 </xsd:choice>
1539 </xsd:complexType>
1540 <xsd:simpleType name="AttrType_purpose">
1541 <xsd:list>
1542 <xsd:simpleType>
1543 <xsd:union memberTypes="xlf:purposeValueList xlf:XTend"/>
1544 </xsd:simpleType>
1545 </xsd:list>
1546 </xsd:simpleType>
1547 <xsd:simpleType name="AttrType_datatype">
1548 <xsd:union memberTypes="xlf:datatypeValueList xlf:XTend"/>
1549 </xsd:simpleType>
1550 <xsd:simpleType name="AttrType_restype">
1551 <xsd:union memberTypes="xlf:restypeValueList xlf:XTend"/>
1552 </xsd:simpleType>
1553 <xsd:simpleType name="AttrType_alttranstype">
1554 <xsd:union memberTypes="xlf:alttranstypeValueList xlf:XTend"/>
1555 </xsd:simpleType>
1556 <xsd:simpleType name="AttrType_context-type">
1557 <xsd:union memberTypes="xlf:context-typeValueList xlf:XTend"/>
1558 </xsd:simpleType>
1559 <xsd:simpleType name="AttrType_state">
1560 <xsd:union memberTypes="xlf:stateValueList xlf:XTend"/>
1561 </xsd:simpleType>
1562 <xsd:simpleType name="AttrType_state-qualifier">
1563 <xsd:union memberTypes="xlf:state-qualifierValueList xlf:XTend"/>
1564 </xsd:simpleType>
1565 <xsd:simpleType name="AttrType_count-type">
1566 <xsd:union memberTypes="xlf:restypeValueList xlf:count-typeValueList xlf:datatypeValueList xlf:stateValueList xlf:state-qualifierValueList xlf:XTend"/>
1567 </xsd:simpleType>
1568 <xsd:simpleType name="AttrType_InlineDelimiters">
1569 <xsd:union memberTypes="xlf:InlineDelimitersValueList xlf:XTend"/>
1570 </xsd:simpleType>
1571 <xsd:simpleType name="AttrType_InlinePlaceholders">
1572 <xsd:union memberTypes="xlf:InlinePlaceholdersValueList xlf:XTend"/>
1573 </xsd:simpleType>
1574 <xsd:simpleType name="AttrType_size-unit">
1575 <xsd:union memberTypes="xlf:size-unitValueList xlf:XTend"/>
1576 </xsd:simpleType>
1577 <xsd:simpleType name="AttrType_mtype">
1578 <xsd:union memberTypes="xlf:mtypeValueList xlf:XTend"/>
1579 </xsd:simpleType>
1580 <xsd:simpleType name="AttrType_unit">
1581 <xsd:union memberTypes="xlf:unitValueList xlf:XTend"/>
1582 </xsd:simpleType>
1583 <xsd:simpleType name="AttrType_priority">
1584 <xsd:union memberTypes="xlf:priorityValueList"/>
1585 </xsd:simpleType>
1586 <xsd:simpleType name="AttrType_reformat">
1587 <xsd:union memberTypes="xlf:reformatValueYesNo xlf:reformatValueList"/>
1588 </xsd:simpleType>
1589 <xsd:simpleType name="AttrType_YesNo">
1590 <xsd:restriction base="xsd:NMTOKEN">
1591 <xsd:enumeration value="yes"/>
1592 <xsd:enumeration value="no"/>
1593 </xsd:restriction>
1594 </xsd:simpleType>
1595 <xsd:simpleType name="AttrType_Position">
1596 <xsd:restriction base="xsd:NMTOKEN">
1597 <xsd:enumeration value="open"/>
1598 <xsd:enumeration value="close"/>
1599 </xsd:restriction>
1600 </xsd:simpleType>
1601 <xsd:simpleType name="AttrType_assoc">
1602 <xsd:restriction base="xsd:NMTOKEN">
1603 <xsd:enumeration value="preceding"/>
1604 <xsd:enumeration value="following"/>
1605 <xsd:enumeration value="both"/>
1606 </xsd:restriction>
1607 </xsd:simpleType>
1608 <xsd:simpleType name="AttrType_annotates">
1609 <xsd:restriction base="xsd:NMTOKEN">
1610 <xsd:enumeration value="source"/>
1611 <xsd:enumeration value="target"/>
1612 <xsd:enumeration value="general"/>
1613 </xsd:restriction>
1614 </xsd:simpleType>
1615 <xsd:simpleType name="AttrType_Coordinates">
1616 <xsd:annotation>
1617 <xsd:documentation>Values for the attribute 'coord'.</xsd:documentation>
1618 </xsd:annotation>
1619 <xsd:restriction base="xsd:string">
1620 <xsd:pattern value="(-?\d+|#);(-?\d+|#);(-?\d+|#);(-?\d+|#)"/>
1621 </xsd:restriction>
1622 </xsd:simpleType>
1623 <xsd:simpleType name="AttrType_Version">
1624 <xsd:annotation>
1625 <xsd:documentation>Version values: 1.0 and 1.1 are allowed for backward compatibility.</xsd:documentation>
1626 </xsd:annotation>
1627 <xsd:restriction base="xsd:string">
1628 <xsd:enumeration value="1.2"/>
1629 <xsd:enumeration value="1.1"/>
1630 <xsd:enumeration value="1.0"/>
1631 </xsd:restriction>
1632 </xsd:simpleType>
1633 <!-- Groups -->
1634 <xsd:group name="ElemGroup_TextContent">
1635 <xsd:choice>
1636 <xsd:element ref="xlf:g"/>
1637 <xsd:element ref="xlf:bpt"/>
1638 <xsd:element ref="xlf:ept"/>
1639 <xsd:element ref="xlf:ph"/>
1640 <xsd:element ref="xlf:it"/>
1641 <xsd:element ref="xlf:mrk"/>
1642 <xsd:element ref="xlf:x"/>
1643 <xsd:element ref="xlf:bx"/>
1644 <xsd:element ref="xlf:ex"/>
1645 </xsd:choice>
1646 </xsd:group>
1647 <xsd:attributeGroup name="AttrGroup_TextContent">
1648 <xsd:attribute name="id" type="xsd:string" use="required"/>
1649 <xsd:attribute name="xid" type="xsd:string" use="optional"/>
1650 <xsd:attribute name="equiv-text" type="xsd:string" use="optional"/>
1651 <xsd:anyAttribute namespace="##other" processContents="strict"/>
1652 </xsd:attributeGroup>
1653 <!-- XLIFF Structure -->
1654 <xsd:element name="xliff">
1655 <xsd:complexType>
1656 <xsd:sequence maxOccurs="unbounded">
1657 <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1658 <xsd:element ref="xlf:file"/>
1659 </xsd:sequence>
1660 <xsd:attribute name="version" type="xlf:AttrType_Version" use="required"/>
1661 <xsd:attribute ref="xml:lang" use="optional"/>
1662 <xsd:anyAttribute namespace="##other" processContents="strict"/>
1663 </xsd:complexType>
1664 </xsd:element>
1665 <xsd:element name="file">
1666 <xsd:complexType>
1667 <xsd:sequence>
1668 <xsd:element minOccurs="0" ref="xlf:header"/>
1669 <xsd:element ref="xlf:body"/>
1670 </xsd:sequence>
1671 <xsd:attribute name="original" type="xsd:string" use="required"/>
1672 <xsd:attribute name="source-language" type="xsd:language" use="required"/>
1673 <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="required"/>
1674 <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
1675 <xsd:attribute name="date" type="xsd:dateTime" use="optional"/>
1676 <xsd:attribute ref="xml:space" use="optional"/>
1677 <xsd:attribute name="category" type="xsd:string" use="optional"/>
1678 <xsd:attribute name="target-language" type="xsd:language" use="optional"/>
1679 <xsd:attribute name="product-name" type="xsd:string" use="optional"/>
1680 <xsd:attribute name="product-version" type="xsd:string" use="optional"/>
1681 <xsd:attribute name="build-num" type="xsd:string" use="optional"/>
1682 <xsd:anyAttribute namespace="##other" processContents="strict"/>
1683 </xsd:complexType>
1684 <xsd:unique name="U_group_id">
1685 <xsd:selector xpath=".//xlf:group"/>
1686 <xsd:field xpath="@id"/>
1687 </xsd:unique>
1688 <xsd:key name="K_unit_id">
1689 <xsd:selector xpath=".//xlf:trans-unit|.//xlf:bin-unit"/>
1690 <xsd:field xpath="@id"/>
1691 </xsd:key>
1692 <xsd:keyref name="KR_unit_id" refer="xlf:K_unit_id">
1693 <xsd:selector xpath=".//bpt|.//ept|.//it|.//ph|.//g|.//x|.//bx|.//ex|.//sub"/>
1694 <xsd:field xpath="@xid"/>
1695 </xsd:keyref>
1696 <xsd:key name="K_tool-id">
1697 <xsd:selector xpath="xlf:header/xlf:tool"/>
1698 <xsd:field xpath="@tool-id"/>
1699 </xsd:key>
1700 <xsd:keyref name="KR_file_tool-id" refer="xlf:K_tool-id">
1701 <xsd:selector xpath="."/>
1702 <xsd:field xpath="@tool-id"/>
1703 </xsd:keyref>
1704 <xsd:keyref name="KR_phase_tool-id" refer="xlf:K_tool-id">
1705 <xsd:selector xpath="xlf:header/xlf:phase-group/xlf:phase"/>
1706 <xsd:field xpath="@tool-id"/>
1707 </xsd:keyref>
1708 <xsd:keyref name="KR_alt-trans_tool-id" refer="xlf:K_tool-id">
1709 <xsd:selector xpath=".//xlf:trans-unit/xlf:alt-trans"/>
1710 <xsd:field xpath="@tool-id"/>
1711 </xsd:keyref>
1712 <xsd:key name="K_count-group_name">
1713 <xsd:selector xpath=".//xlf:count-group"/>
1714 <xsd:field xpath="@name"/>
1715 </xsd:key>
1716 <xsd:unique name="U_context-group_name">
1717 <xsd:selector xpath=".//xlf:context-group"/>
1718 <xsd:field xpath="@name"/>
1719 </xsd:unique>
1720 <xsd:key name="K_phase-name">
1721 <xsd:selector xpath="xlf:header/xlf:phase-group/xlf:phase"/>
1722 <xsd:field xpath="@phase-name"/>
1723 </xsd:key>
1724 <xsd:keyref name="KR_phase-name" refer="xlf:K_phase-name">
1725 <xsd:selector xpath=".//xlf:count|.//xlf:trans-unit|.//xlf:target|.//bin-unit|.//bin-target"/>
1726 <xsd:field xpath="@phase-name"/>
1727 </xsd:keyref>
1728 <xsd:unique name="U_uid">
1729 <xsd:selector xpath=".//xlf:external-file"/>
1730 <xsd:field xpath="@uid"/>
1731 </xsd:unique>
1732 </xsd:element>
1733 <xsd:element name="header">
1734 <xsd:complexType>
1735 <xsd:sequence>
1736 <xsd:element minOccurs="0" name="skl" type="xlf:ElemType_ExternalReference"/>
1737 <xsd:element minOccurs="0" ref="xlf:phase-group"/>
1738 <xsd:choice maxOccurs="unbounded" minOccurs="0">
1739 <xsd:element name="glossary" type="xlf:ElemType_ExternalReference"/>
1740 <xsd:element name="reference" type="xlf:ElemType_ExternalReference"/>
1741 <xsd:element ref="xlf:count-group"/>
1742 <xsd:element ref="xlf:note"/>
1743 <xsd:element ref="xlf:tool"/>
1744 </xsd:choice>
1745 <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1746 </xsd:sequence>
1747 </xsd:complexType>
1748 </xsd:element>
1749 <xsd:element name="internal-file">
1750 <xsd:complexType>
1751 <xsd:simpleContent>
1752 <xsd:extension base="xsd:string">
1753 <xsd:attribute name="form" type="xsd:string"/>
1754 <xsd:attribute name="crc" type="xsd:NMTOKEN"/>
1755 </xsd:extension>
1756 </xsd:simpleContent>
1757 </xsd:complexType>
1758 </xsd:element>
1759 <xsd:element name="external-file">
1760 <xsd:complexType>
1761 <xsd:attribute name="href" type="xsd:string" use="required"/>
1762 <xsd:attribute name="crc" type="xsd:NMTOKEN"/>
1763 <xsd:attribute name="uid" type="xsd:NMTOKEN"/>
1764 </xsd:complexType>
1765 </xsd:element>
1766 <xsd:element name="note">
1767 <xsd:complexType>
1768 <xsd:simpleContent>
1769 <xsd:extension base="xsd:string">
1770 <xsd:attribute ref="xml:lang" use="optional"/>
1771 <xsd:attribute default="1" name="priority" type="xlf:AttrType_priority" use="optional"/>
1772 <xsd:attribute name="from" type="xsd:string" use="optional"/>
1773 <xsd:attribute default="general" name="annotates" type="xlf:AttrType_annotates" use="optional"/>
1774 </xsd:extension>
1775 </xsd:simpleContent>
1776 </xsd:complexType>
1777 </xsd:element>
1778 <xsd:element name="phase-group">
1779 <xsd:complexType>
1780 <xsd:sequence maxOccurs="unbounded">
1781 <xsd:element ref="xlf:phase"/>
1782 </xsd:sequence>
1783 </xsd:complexType>
1784 </xsd:element>
1785 <xsd:element name="phase">
1786 <xsd:complexType>
1787 <xsd:sequence maxOccurs="unbounded" minOccurs="0">
1788 <xsd:element ref="xlf:note"/>
1789 </xsd:sequence>
1790 <xsd:attribute name="phase-name" type="xsd:string" use="required"/>
1791 <xsd:attribute name="process-name" type="xsd:string" use="required"/>
1792 <xsd:attribute name="company-name" type="xsd:string" use="optional"/>
1793 <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
1794 <xsd:attribute name="date" type="xsd:dateTime" use="optional"/>
1795 <xsd:attribute name="job-id" type="xsd:string" use="optional"/>
1796 <xsd:attribute name="contact-name" type="xsd:string" use="optional"/>
1797 <xsd:attribute name="contact-email" type="xsd:string" use="optional"/>
1798 <xsd:attribute name="contact-phone" type="xsd:string" use="optional"/>
1799 </xsd:complexType>
1800 </xsd:element>
1801 <xsd:element name="count-group">
1802 <xsd:complexType>
1803 <xsd:sequence maxOccurs="unbounded" minOccurs="0">
1804 <xsd:element ref="xlf:count"/>
1805 </xsd:sequence>
1806 <xsd:attribute name="name" type="xsd:string" use="required"/>
1807 </xsd:complexType>
1808 </xsd:element>
1809 <xsd:element name="count">
1810 <xsd:complexType>
1811 <xsd:simpleContent>
1812 <xsd:extension base="xsd:string">
1813 <xsd:attribute name="count-type" type="xlf:AttrType_count-type" use="optional"/>
1814 <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
1815 <xsd:attribute default="word" name="unit" type="xlf:AttrType_unit" use="optional"/>
1816 </xsd:extension>
1817 </xsd:simpleContent>
1818 </xsd:complexType>
1819 </xsd:element>
1820 <xsd:element name="context-group">
1821 <xsd:complexType>
1822 <xsd:sequence maxOccurs="unbounded">
1823 <xsd:element ref="xlf:context"/>
1824 </xsd:sequence>
1825 <xsd:attribute name="name" type="xsd:string" use="optional"/>
1826 <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
1827 <xsd:attribute name="purpose" type="xlf:AttrType_purpose" use="optional"/>
1828 </xsd:complexType>
1829 </xsd:element>
1830 <xsd:element name="context">
1831 <xsd:complexType>
1832 <xsd:simpleContent>
1833 <xsd:extension base="xsd:string">
1834 <xsd:attribute name="context-type" type="xlf:AttrType_context-type" use="required"/>
1835 <xsd:attribute default="no" name="match-mandatory" type="xlf:AttrType_YesNo" use="optional"/>
1836 <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
1837 </xsd:extension>
1838 </xsd:simpleContent>
1839 </xsd:complexType>
1840 </xsd:element>
1841 <xsd:element name="tool">
1842 <xsd:complexType mixed="true">
1843 <xsd:sequence>
1844 <xsd:any namespace="##any" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
1845 </xsd:sequence>
1846 <xsd:attribute name="tool-id" type="xsd:string" use="required"/>
1847 <xsd:attribute name="tool-name" type="xsd:string" use="required"/>
1848 <xsd:attribute name="tool-version" type="xsd:string" use="optional"/>
1849 <xsd:attribute name="tool-company" type="xsd:string" use="optional"/>
1850 <xsd:anyAttribute namespace="##other" processContents="strict"/>
1851 </xsd:complexType>
1852 </xsd:element>
1853 <xsd:element name="body">
1854 <xsd:complexType>
1855 <xsd:choice maxOccurs="unbounded" minOccurs="0">
1856 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:group"/>
1857 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:trans-unit"/>
1858 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:bin-unit"/>
1859 </xsd:choice>
1860 </xsd:complexType>
1861 </xsd:element>
1862 <xsd:element name="group">
1863 <xsd:complexType>
1864 <xsd:sequence>
1865 <xsd:sequence>
1866 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:context-group"/>
1867 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:count-group"/>
1868 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:note"/>
1869 <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1870 </xsd:sequence>
1871 <xsd:choice maxOccurs="unbounded">
1872 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:group"/>
1873 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:trans-unit"/>
1874 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:bin-unit"/>
1875 </xsd:choice>
1876 </xsd:sequence>
1877 <xsd:attribute name="id" type="xsd:string" use="optional"/>
1878 <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
1879 <xsd:attribute default="default" ref="xml:space" use="optional"/>
1880 <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
1881 <xsd:attribute name="resname" type="xsd:string" use="optional"/>
1882 <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
1883 <xsd:attribute name="extype" type="xsd:string" use="optional"/>
1884 <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
1885 <xsd:attribute name="menu" type="xsd:string" use="optional"/>
1886 <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
1887 <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
1888 <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
1889 <xsd:attribute name="font" type="xsd:string" use="optional"/>
1890 <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
1891 <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
1892 <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
1893 <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
1894 <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
1895 <xsd:attribute default="pixel" name="size-unit" type="xlf:AttrType_size-unit" use="optional"/>
1896 <xsd:attribute name="maxwidth" type="xsd:NMTOKEN" use="optional"/>
1897 <xsd:attribute name="minwidth" type="xsd:NMTOKEN" use="optional"/>
1898 <xsd:attribute name="maxheight" type="xsd:NMTOKEN" use="optional"/>
1899 <xsd:attribute name="minheight" type="xsd:NMTOKEN" use="optional"/>
1900 <xsd:attribute name="maxbytes" type="xsd:NMTOKEN" use="optional"/>
1901 <xsd:attribute name="minbytes" type="xsd:NMTOKEN" use="optional"/>
1902 <xsd:attribute name="charclass" type="xsd:string" use="optional"/>
1903 <xsd:attribute default="no" name="merged-trans" type="xlf:AttrType_YesNo" use="optional"/>
1904 <xsd:anyAttribute namespace="##other" processContents="strict"/>
1905 </xsd:complexType>
1906 </xsd:element>
1907 <xsd:element name="trans-unit">
1908 <xsd:complexType>
1909 <xsd:sequence>
1910 <xsd:element ref="xlf:source"/>
1911 <xsd:element minOccurs="0" ref="xlf:seg-source"/>
1912 <xsd:element minOccurs="0" ref="xlf:target"/>
1913 <xsd:choice maxOccurs="unbounded" minOccurs="0">
1914 <xsd:element ref="xlf:context-group"/>
1915 <xsd:element ref="xlf:count-group"/>
1916 <xsd:element ref="xlf:note"/>
1917 <xsd:element ref="xlf:alt-trans"/>
1918 </xsd:choice>
1919 <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1920 </xsd:sequence>
1921 <xsd:attribute name="id" type="xsd:string" use="required"/>
1922 <xsd:attribute name="approved" type="xlf:AttrType_YesNo" use="optional"/>
1923 <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
1924 <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
1925 <xsd:attribute default="default" ref="xml:space" use="optional"/>
1926 <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
1927 <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
1928 <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
1929 <xsd:attribute name="resname" type="xsd:string" use="optional"/>
1930 <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
1931 <xsd:attribute name="extype" type="xsd:string" use="optional"/>
1932 <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
1933 <xsd:attribute name="menu" type="xsd:string" use="optional"/>
1934 <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
1935 <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
1936 <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
1937 <xsd:attribute name="font" type="xsd:string" use="optional"/>
1938 <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
1939 <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
1940 <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
1941 <xsd:attribute default="pixel" name="size-unit" type="xlf:AttrType_size-unit" use="optional"/>
1942 <xsd:attribute name="maxwidth" type="xsd:NMTOKEN" use="optional"/>
1943 <xsd:attribute name="minwidth" type="xsd:NMTOKEN" use="optional"/>
1944 <xsd:attribute name="maxheight" type="xsd:NMTOKEN" use="optional"/>
1945 <xsd:attribute name="minheight" type="xsd:NMTOKEN" use="optional"/>
1946 <xsd:attribute name="maxbytes" type="xsd:NMTOKEN" use="optional"/>
1947 <xsd:attribute name="minbytes" type="xsd:NMTOKEN" use="optional"/>
1948 <xsd:attribute name="charclass" type="xsd:string" use="optional"/>
1949 <xsd:attribute default="yes" name="merged-trans" type="xlf:AttrType_YesNo" use="optional"/>
1950 <xsd:anyAttribute namespace="##other" processContents="strict"/>
1951 </xsd:complexType>
1952 <xsd:unique name="U_tu_segsrc_mid">
1953 <xsd:selector xpath="./xlf:seg-source/xlf:mrk"/>
1954 <xsd:field xpath="@mid"/>
1955 </xsd:unique>
1956 <xsd:keyref name="KR_tu_segsrc_mid" refer="xlf:U_tu_segsrc_mid">
1957 <xsd:selector xpath="./xlf:target/xlf:mrk|./xlf:alt-trans"/>
1958 <xsd:field xpath="@mid"/>
1959 </xsd:keyref>
1960 </xsd:element>
1961 <xsd:element name="source">
1962 <xsd:complexType mixed="true">
1963 <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
1964 <xsd:attribute ref="xml:lang" use="optional"/>
1965 <xsd:anyAttribute namespace="##other" processContents="strict"/>
1966 </xsd:complexType>
1967 <xsd:unique name="U_source_bpt_rid">
1968 <xsd:selector xpath=".//xlf:bpt"/>
1969 <xsd:field xpath="@rid"/>
1970 </xsd:unique>
1971 <xsd:keyref name="KR_source_ept_rid" refer="xlf:U_source_bpt_rid">
1972 <xsd:selector xpath=".//xlf:ept"/>
1973 <xsd:field xpath="@rid"/>
1974 </xsd:keyref>
1975 <xsd:unique name="U_source_bx_rid">
1976 <xsd:selector xpath=".//xlf:bx"/>
1977 <xsd:field xpath="@rid"/>
1978 </xsd:unique>
1979 <xsd:keyref name="KR_source_ex_rid" refer="xlf:U_source_bx_rid">
1980 <xsd:selector xpath=".//xlf:ex"/>
1981 <xsd:field xpath="@rid"/>
1982 </xsd:keyref>
1983 </xsd:element>
1984 <xsd:element name="seg-source">
1985 <xsd:complexType mixed="true">
1986 <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
1987 <xsd:attribute ref="xml:lang" use="optional"/>
1988 <xsd:anyAttribute namespace="##other" processContents="strict"/>
1989 </xsd:complexType>
1990 <xsd:unique name="U_segsrc_bpt_rid">
1991 <xsd:selector xpath=".//xlf:bpt"/>
1992 <xsd:field xpath="@rid"/>
1993 </xsd:unique>
1994 <xsd:keyref name="KR_segsrc_ept_rid" refer="xlf:U_segsrc_bpt_rid">
1995 <xsd:selector xpath=".//xlf:ept"/>
1996 <xsd:field xpath="@rid"/>
1997 </xsd:keyref>
1998 <xsd:unique name="U_segsrc_bx_rid">
1999 <xsd:selector xpath=".//xlf:bx"/>
2000 <xsd:field xpath="@rid"/>
2001 </xsd:unique>
2002 <xsd:keyref name="KR_segsrc_ex_rid" refer="xlf:U_segsrc_bx_rid">
2003 <xsd:selector xpath=".//xlf:ex"/>
2004 <xsd:field xpath="@rid"/>
2005 </xsd:keyref>
2006 </xsd:element>
2007 <xsd:element name="target">
2008 <xsd:complexType mixed="true">
2009 <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2010 <xsd:attribute name="state" type="xlf:AttrType_state" use="optional"/>
2011 <xsd:attribute name="state-qualifier" type="xlf:AttrType_state-qualifier" use="optional"/>
2012 <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
2013 <xsd:attribute ref="xml:lang" use="optional"/>
2014 <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2015 <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
2016 <xsd:attribute name="font" type="xsd:string" use="optional"/>
2017 <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
2018 <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
2019 <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
2020 <xsd:attribute default="yes" name="equiv-trans" type="xlf:AttrType_YesNo" use="optional"/>
2021 <xsd:anyAttribute namespace="##other" processContents="strict"/>
2022 </xsd:complexType>
2023 <xsd:unique name="U_target_bpt_rid">
2024 <xsd:selector xpath=".//xlf:bpt"/>
2025 <xsd:field xpath="@rid"/>
2026 </xsd:unique>
2027 <xsd:keyref name="KR_target_ept_rid" refer="xlf:U_target_bpt_rid">
2028 <xsd:selector xpath=".//xlf:ept"/>
2029 <xsd:field xpath="@rid"/>
2030 </xsd:keyref>
2031 <xsd:unique name="U_target_bx_rid">
2032 <xsd:selector xpath=".//xlf:bx"/>
2033 <xsd:field xpath="@rid"/>
2034 </xsd:unique>
2035 <xsd:keyref name="KR_target_ex_rid" refer="xlf:U_target_bx_rid">
2036 <xsd:selector xpath=".//xlf:ex"/>
2037 <xsd:field xpath="@rid"/>
2038 </xsd:keyref>
2039 </xsd:element>
2040 <xsd:element name="alt-trans">
2041 <xsd:complexType>
2042 <xsd:sequence>
2043 <xsd:element minOccurs="0" ref="xlf:source"/>
2044 <xsd:element minOccurs="0" ref="xlf:seg-source"/>
2045 <xsd:element maxOccurs="1" ref="xlf:target"/>
2046 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:context-group"/>
2047 <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:note"/>
2048 <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
2049 </xsd:sequence>
2050 <xsd:attribute name="match-quality" type="xsd:string" use="optional"/>
2051 <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
2052 <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
2053 <xsd:attribute ref="xml:lang" use="optional"/>
2054 <xsd:attribute name="origin" type="xsd:string" use="optional"/>
2055 <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
2056 <xsd:attribute default="default" ref="xml:space" use="optional"/>
2057 <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
2058 <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2059 <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
2060 <xsd:attribute name="extype" type="xsd:string" use="optional"/>
2061 <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
2062 <xsd:attribute name="menu" type="xsd:string" use="optional"/>
2063 <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
2064 <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
2065 <xsd:attribute name="mid" type="xsd:NMTOKEN" use="optional"/>
2066 <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
2067 <xsd:attribute name="font" type="xsd:string" use="optional"/>
2068 <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
2069 <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
2070 <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
2071 <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
2072 <xsd:attribute default="proposal" name="alttranstype" type="xlf:AttrType_alttranstype" use="optional"/>
2073 <xsd:anyAttribute namespace="##other" processContents="strict"/>
2074 </xsd:complexType>
2075 <xsd:unique name="U_at_segsrc_mid">
2076 <xsd:selector xpath="./xlf:seg-source/xlf:mrk"/>
2077 <xsd:field xpath="@mid"/>
2078 </xsd:unique>
2079 <xsd:keyref name="KR_at_segsrc_mid" refer="xlf:U_at_segsrc_mid">
2080 <xsd:selector xpath="./xlf:target/xlf:mrk"/>
2081 <xsd:field xpath="@mid"/>
2082 </xsd:keyref>
2083 </xsd:element>
2084 <xsd:element name="bin-unit">
2085 <xsd:complexType>
2086 <xsd:sequence>
2087 <xsd:element ref="xlf:bin-source"/>
2088 <xsd:element minOccurs="0" ref="xlf:bin-target"/>
2089 <xsd:choice maxOccurs="unbounded" minOccurs="0">
2090 <xsd:element ref="xlf:context-group"/>
2091 <xsd:element ref="xlf:count-group"/>
2092 <xsd:element ref="xlf:note"/>
2093 <xsd:element ref="xlf:trans-unit"/>
2094 </xsd:choice>
2095 <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
2096 </xsd:sequence>
2097 <xsd:attribute name="id" type="xsd:string" use="required"/>
2098 <xsd:attribute name="mime-type" type="xlf:mime-typeValueList" use="required"/>
2099 <xsd:attribute name="approved" type="xlf:AttrType_YesNo" use="optional"/>
2100 <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
2101 <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
2102 <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
2103 <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2104 <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
2105 <xsd:anyAttribute namespace="##other" processContents="strict"/>
2106 </xsd:complexType>
2107 </xsd:element>
2108 <xsd:element name="bin-source">
2109 <xsd:complexType>
2110 <xsd:choice>
2111 <xsd:element ref="xlf:internal-file"/>
2112 <xsd:element ref="xlf:external-file"/>
2113 </xsd:choice>
2114 <xsd:anyAttribute namespace="##other" processContents="strict"/>
2115 </xsd:complexType>
2116 </xsd:element>
2117 <xsd:element name="bin-target">
2118 <xsd:complexType>
2119 <xsd:choice>
2120 <xsd:element ref="xlf:internal-file"/>
2121 <xsd:element ref="xlf:external-file"/>
2122 </xsd:choice>
2123 <xsd:attribute name="mime-type" type="xlf:mime-typeValueList" use="optional"/>
2124 <xsd:attribute name="state" type="xlf:AttrType_state" use="optional"/>
2125 <xsd:attribute name="state-qualifier" type="xlf:AttrType_state-qualifier" use="optional"/>
2126 <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
2127 <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
2128 <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2129 <xsd:anyAttribute namespace="##other" processContents="strict"/>
2130 </xsd:complexType>
2131 </xsd:element>
2132 <!-- Element for inline codes -->
2133 <xsd:element name="g">
2134 <xsd:complexType mixed="true">
2135 <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2136 <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2137 <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
2138 <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2139 </xsd:complexType>
2140 </xsd:element>
2141 <xsd:element name="x">
2142 <xsd:complexType>
2143 <xsd:attribute name="ctype" type="xlf:AttrType_InlinePlaceholders" use="optional"/>
2144 <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
2145 <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2146 </xsd:complexType>
2147 </xsd:element>
2148 <xsd:element name="bx">
2149 <xsd:complexType>
2150 <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2151 <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2152 <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
2153 <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2154 </xsd:complexType>
2155 </xsd:element>
2156 <xsd:element name="ex">
2157 <xsd:complexType>
2158 <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2159 <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2160 </xsd:complexType>
2161 </xsd:element>
2162 <xsd:element name="ph">
2163 <xsd:complexType mixed="true">
2164 <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2165 <xsd:element ref="xlf:sub"/>
2166 </xsd:sequence>
2167 <xsd:attribute name="ctype" type="xlf:AttrType_InlinePlaceholders" use="optional"/>
2168 <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2169 <xsd:attribute name="assoc" type="xlf:AttrType_assoc" use="optional"/>
2170 <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2171 </xsd:complexType>
2172 </xsd:element>
2173 <xsd:element name="bpt">
2174 <xsd:complexType mixed="true">
2175 <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2176 <xsd:element ref="xlf:sub"/>
2177 </xsd:sequence>
2178 <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2179 <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2180 <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2181 <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2182 </xsd:complexType>
2183 </xsd:element>
2184 <xsd:element name="ept">
2185 <xsd:complexType mixed="true">
2186 <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2187 <xsd:element ref="xlf:sub"/>
2188 </xsd:sequence>
2189 <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2190 <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2191 <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2192 </xsd:complexType>
2193 </xsd:element>
2194 <xsd:element name="it">
2195 <xsd:complexType mixed="true">
2196 <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2197 <xsd:element ref="xlf:sub"/>
2198 </xsd:sequence>
2199 <xsd:attribute name="pos" type="xlf:AttrType_Position" use="required"/>
2200 <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2201 <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2202 <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2203 <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2204 </xsd:complexType>
2205 </xsd:element>
2206 <xsd:element name="sub">
2207 <xsd:complexType mixed="true">
2208 <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2209 <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
2210 <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2211 <xsd:attribute name="xid" type="xsd:string" use="optional"/>
2212 </xsd:complexType>
2213 </xsd:element>
2214 <xsd:element name="mrk">
2215 <xsd:complexType mixed="true">
2216 <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2217 <xsd:attribute name="mtype" type="xlf:AttrType_mtype" use="required"/>
2218 <xsd:attribute name="mid" type="xsd:NMTOKEN" use="optional"/>
2219 <xsd:attribute name="comment" type="xsd:string" use="optional"/>
2220 <xsd:anyAttribute namespace="##other" processContents="strict"/>
2221 </xsd:complexType>
2222 </xsd:element>
2223</xsd:schema>
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xml.xsd b/vendor/symfony/translation/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xml.xsd
new file mode 100644
index 00000000..8fcb991a
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xml.xsd
@@ -0,0 +1,309 @@
1<?xml version='1.0'?>
2<?xml-stylesheet href="../2008/09/xsd.xsl" type="text/xsl"?>
3<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace"
4 xmlns:xs="http://www.w3.org/2001/XMLSchema"
5 xmlns ="http://www.w3.org/1999/xhtml"
6 xml:lang="en">
7
8 <xs:annotation>
9 <xs:documentation>
10 <div>
11 <h1>About the XML namespace</h1>
12
13 <div class="bodytext">
14 <p>
15
16 This schema document describes the XML namespace, in a form
17 suitable for import by other schema documents.
18 </p>
19 <p>
20 See <a href="http://www.w3.org/XML/1998/namespace.html">
21 http://www.w3.org/XML/1998/namespace.html</a> and
22 <a href="http://www.w3.org/TR/REC-xml">
23 http://www.w3.org/TR/REC-xml</a> for information
24 about this namespace.
25 </p>
26
27 <p>
28 Note that local names in this namespace are intended to be
29 defined only by the World Wide Web Consortium or its subgroups.
30 The names currently defined in this namespace are listed below.
31 They should not be used with conflicting semantics by any Working
32 Group, specification, or document instance.
33 </p>
34 <p>
35 See further below in this document for more information about <a
36 href="#usage">how to refer to this schema document from your own
37 XSD schema documents</a> and about <a href="#nsversioning">the
38 namespace-versioning policy governing this schema document</a>.
39 </p>
40 </div>
41 </div>
42
43 </xs:documentation>
44 </xs:annotation>
45
46 <xs:attribute name="lang">
47 <xs:annotation>
48 <xs:documentation>
49 <div>
50
51 <h3>lang (as an attribute name)</h3>
52 <p>
53
54 denotes an attribute whose value
55 is a language code for the natural language of the content of
56 any element; its value is inherited. This name is reserved
57 by virtue of its definition in the XML specification.</p>
58
59 </div>
60 <div>
61 <h4>Notes</h4>
62 <p>
63 Attempting to install the relevant ISO 2- and 3-letter
64 codes as the enumerated possible values is probably never
65 going to be a realistic possibility.
66 </p>
67 <p>
68
69 See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
70 http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
71 and the IANA language subtag registry at
72 <a href="http://www.iana.org/assignments/language-subtag-registry">
73 http://www.iana.org/assignments/language-subtag-registry</a>
74 for further information.
75 </p>
76 <p>
77
78 The union allows for the 'un-declaration' of xml:lang with
79 the empty string.
80 </p>
81 </div>
82 </xs:documentation>
83 </xs:annotation>
84 <xs:simpleType>
85 <xs:union memberTypes="xs:language">
86 <xs:simpleType>
87 <xs:restriction base="xs:string">
88 <xs:enumeration value=""/>
89
90 </xs:restriction>
91 </xs:simpleType>
92 </xs:union>
93 </xs:simpleType>
94 </xs:attribute>
95
96 <xs:attribute name="space">
97 <xs:annotation>
98 <xs:documentation>
99
100 <div>
101
102 <h3>space (as an attribute name)</h3>
103 <p>
104 denotes an attribute whose
105 value is a keyword indicating what whitespace processing
106 discipline is intended for the content of the element; its
107 value is inherited. This name is reserved by virtue of its
108 definition in the XML specification.</p>
109
110 </div>
111 </xs:documentation>
112 </xs:annotation>
113 <xs:simpleType>
114
115 <xs:restriction base="xs:NCName">
116 <xs:enumeration value="default"/>
117 <xs:enumeration value="preserve"/>
118 </xs:restriction>
119 </xs:simpleType>
120 </xs:attribute>
121
122 <xs:attribute name="base" type="xs:anyURI"> <xs:annotation>
123 <xs:documentation>
124
125 <div>
126
127 <h3>base (as an attribute name)</h3>
128 <p>
129 denotes an attribute whose value
130 provides a URI to be used as the base for interpreting any
131 relative URIs in the scope of the element on which it
132 appears; its value is inherited. This name is reserved
133 by virtue of its definition in the XML Base specification.</p>
134
135 <p>
136 See <a
137 href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
138 for information about this attribute.
139 </p>
140
141 </div>
142 </xs:documentation>
143 </xs:annotation>
144 </xs:attribute>
145
146 <xs:attribute name="id" type="xs:ID">
147 <xs:annotation>
148 <xs:documentation>
149 <div>
150
151 <h3>id (as an attribute name)</h3>
152 <p>
153
154 denotes an attribute whose value
155 should be interpreted as if declared to be of type ID.
156 This name is reserved by virtue of its definition in the
157 xml:id specification.</p>
158
159 <p>
160 See <a
161 href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a>
162 for information about this attribute.
163 </p>
164 </div>
165 </xs:documentation>
166 </xs:annotation>
167
168 </xs:attribute>
169
170 <xs:attributeGroup name="specialAttrs">
171 <xs:attribute ref="xml:base"/>
172 <xs:attribute ref="xml:lang"/>
173 <xs:attribute ref="xml:space"/>
174 <xs:attribute ref="xml:id"/>
175 </xs:attributeGroup>
176
177 <xs:annotation>
178
179 <xs:documentation>
180 <div>
181
182 <h3>Father (in any context at all)</h3>
183
184 <div class="bodytext">
185 <p>
186 denotes Jon Bosak, the chair of
187 the original XML Working Group. This name is reserved by
188 the following decision of the W3C XML Plenary and
189 XML Coordination groups:
190 </p>
191 <blockquote>
192 <p>
193
194 In appreciation for his vision, leadership and
195 dedication the W3C XML Plenary on this 10th day of
196 February, 2000, reserves for Jon Bosak in perpetuity
197 the XML name "xml:Father".
198 </p>
199 </blockquote>
200 </div>
201 </div>
202 </xs:documentation>
203 </xs:annotation>
204
205 <xs:annotation>
206 <xs:documentation>
207
208 <div xml:id="usage" id="usage">
209 <h2><a name="usage">About this schema document</a></h2>
210
211 <div class="bodytext">
212 <p>
213 This schema defines attributes and an attribute group suitable
214 for use by schemas wishing to allow <code>xml:base</code>,
215 <code>xml:lang</code>, <code>xml:space</code> or
216 <code>xml:id</code> attributes on elements they define.
217 </p>
218
219 <p>
220 To enable this, such a schema must import this schema for
221 the XML namespace, e.g. as follows:
222 </p>
223 <pre>
224 &lt;schema.. .>
225 .. .
226 &lt;import namespace="http://www.w3.org/XML/1998/namespace"
227 schemaLocation="http://www.w3.org/2001/xml.xsd"/>
228 </pre>
229 <p>
230 or
231 </p>
232 <pre>
233
234 &lt;import namespace="http://www.w3.org/XML/1998/namespace"
235 schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
236 </pre>
237 <p>
238 Subsequently, qualified reference to any of the attributes or the
239 group defined below will have the desired effect, e.g.
240 </p>
241 <pre>
242 &lt;type.. .>
243 .. .
244 &lt;attributeGroup ref="xml:specialAttrs"/>
245 </pre>
246 <p>
247 will define a type which will schema-validate an instance element
248 with any of those attributes.
249 </p>
250
251 </div>
252 </div>
253 </xs:documentation>
254 </xs:annotation>
255
256 <xs:annotation>
257 <xs:documentation>
258 <div id="nsversioning" xml:id="nsversioning">
259 <h2><a name="nsversioning">Versioning policy for this schema document</a></h2>
260
261 <div class="bodytext">
262 <p>
263 In keeping with the XML Schema WG's standard versioning
264 policy, this schema document will persist at
265 <a href="http://www.w3.org/2009/01/xml.xsd">
266 http://www.w3.org/2009/01/xml.xsd</a>.
267 </p>
268 <p>
269 At the date of issue it can also be found at
270 <a href="http://www.w3.org/2001/xml.xsd">
271 http://www.w3.org/2001/xml.xsd</a>.
272 </p>
273
274 <p>
275 The schema document at that URI may however change in the future,
276 in order to remain compatible with the latest version of XML
277 Schema itself, or with the XML namespace itself. In other words,
278 if the XML Schema or XML namespaces change, the version of this
279 document at <a href="http://www.w3.org/2001/xml.xsd">
280 http://www.w3.org/2001/xml.xsd
281 </a>
282 will change accordingly; the version at
283 <a href="http://www.w3.org/2009/01/xml.xsd">
284 http://www.w3.org/2009/01/xml.xsd
285 </a>
286 will not change.
287 </p>
288 <p>
289
290 Previous dated (and unchanging) versions of this schema
291 document are at:
292 </p>
293 <ul>
294 <li><a href="http://www.w3.org/2009/01/xml.xsd">
295 http://www.w3.org/2009/01/xml.xsd</a></li>
296 <li><a href="http://www.w3.org/2007/08/xml.xsd">
297 http://www.w3.org/2007/08/xml.xsd</a></li>
298 <li><a href="http://www.w3.org/2004/10/xml.xsd">
299
300 http://www.w3.org/2004/10/xml.xsd</a></li>
301 <li><a href="http://www.w3.org/2001/03/xml.xsd">
302 http://www.w3.org/2001/03/xml.xsd</a></li>
303 </ul>
304 </div>
305 </div>
306 </xs:documentation>
307 </xs:annotation>
308
309</xs:schema>
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogue.php b/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogue.php
new file mode 100644
index 00000000..1d8a08d8
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogue.php
@@ -0,0 +1,295 @@
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
12namespace Symfony\Component\Translation;
13
14use Symfony\Component\Config\Resource\ResourceInterface;
15
16/**
17 * MessageCatalogue.
18 *
19 * @author Fabien Potencier <fabien@symfony.com>
20 *
21 * @api
22 */
23class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterface
24{
25 private $messages = array();
26 private $metadata = array();
27 private $resources = array();
28 private $locale;
29 private $fallbackCatalogue;
30 private $parent;
31
32 /**
33 * Constructor.
34 *
35 * @param string $locale The locale
36 * @param array $messages An array of messages classified by domain
37 *
38 * @api
39 */
40 public function __construct($locale, array $messages = array())
41 {
42 $this->locale = $locale;
43 $this->messages = $messages;
44 }
45
46 /**
47 * {@inheritdoc}
48 *
49 * @api
50 */
51 public function getLocale()
52 {
53 return $this->locale;
54 }
55
56 /**
57 * {@inheritdoc}
58 *
59 * @api
60 */
61 public function getDomains()
62 {
63 return array_keys($this->messages);
64 }
65
66 /**
67 * {@inheritdoc}
68 *
69 * @api
70 */
71 public function all($domain = null)
72 {
73 if (null === $domain) {
74 return $this->messages;
75 }
76
77 return isset($this->messages[$domain]) ? $this->messages[$domain] : array();
78 }
79
80 /**
81 * {@inheritdoc}
82 *
83 * @api
84 */
85 public function set($id, $translation, $domain = 'messages')
86 {
87 $this->add(array($id => $translation), $domain);
88 }
89
90 /**
91 * {@inheritdoc}
92 *
93 * @api
94 */
95 public function has($id, $domain = 'messages')
96 {
97 if (isset($this->messages[$domain][$id])) {
98 return true;
99 }
100
101 if (null !== $this->fallbackCatalogue) {
102 return $this->fallbackCatalogue->has($id, $domain);
103 }
104
105 return false;
106 }
107
108 /**
109 * {@inheritdoc}
110 */
111 public function defines($id, $domain = 'messages')
112 {
113 return isset($this->messages[$domain][$id]);
114 }
115
116 /**
117 * {@inheritdoc}
118 *
119 * @api
120 */
121 public function get($id, $domain = 'messages')
122 {
123 if (isset($this->messages[$domain][$id])) {
124 return $this->messages[$domain][$id];
125 }
126
127 if (null !== $this->fallbackCatalogue) {
128 return $this->fallbackCatalogue->get($id, $domain);
129 }
130
131 return $id;
132 }
133
134 /**
135 * {@inheritdoc}
136 *
137 * @api
138 */
139 public function replace($messages, $domain = 'messages')
140 {
141 $this->messages[$domain] = array();
142
143 $this->add($messages, $domain);
144 }
145
146 /**
147 * {@inheritdoc}
148 *
149 * @api
150 */
151 public function add($messages, $domain = 'messages')
152 {
153 if (!isset($this->messages[$domain])) {
154 $this->messages[$domain] = $messages;
155 } else {
156 $this->messages[$domain] = array_replace($this->messages[$domain], $messages);
157 }
158 }
159
160 /**
161 * {@inheritdoc}
162 *
163 * @api
164 */
165 public function addCatalogue(MessageCatalogueInterface $catalogue)
166 {
167 if ($catalogue->getLocale() !== $this->locale) {
168 throw new \LogicException(sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s"', $catalogue->getLocale(), $this->locale));
169 }
170
171 foreach ($catalogue->all() as $domain => $messages) {
172 $this->add($messages, $domain);
173 }
174
175 foreach ($catalogue->getResources() as $resource) {
176 $this->addResource($resource);
177 }
178
179 if ($catalogue instanceof MetadataAwareInterface) {
180 $metadata = $catalogue->getMetadata('', '');
181 $this->addMetadata($metadata);
182 }
183 }
184
185 /**
186 * {@inheritdoc}
187 *
188 * @api
189 */
190 public function addFallbackCatalogue(MessageCatalogueInterface $catalogue)
191 {
192 // detect circular references
193 $c = $this;
194 do {
195 if ($c->getLocale() === $catalogue->getLocale()) {
196 throw new \LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
197 }
198 } while ($c = $c->parent);
199
200 $catalogue->parent = $this;
201 $this->fallbackCatalogue = $catalogue;
202
203 foreach ($catalogue->getResources() as $resource) {
204 $this->addResource($resource);
205 }
206 }
207
208 /**
209 * {@inheritdoc}
210 *
211 * @api
212 */
213 public function getFallbackCatalogue()
214 {
215 return $this->fallbackCatalogue;
216 }
217
218 /**
219 * {@inheritdoc}
220 *
221 * @api
222 */
223 public function getResources()
224 {
225 return array_values($this->resources);
226 }
227
228 /**
229 * {@inheritdoc}
230 *
231 * @api
232 */
233 public function addResource(ResourceInterface $resource)
234 {
235 $this->resources[$resource->__toString()] = $resource;
236 }
237
238 /**
239 * {@inheritdoc}
240 */
241 public function getMetadata($key = '', $domain = 'messages')
242 {
243 if ('' == $domain) {
244 return $this->metadata;
245 }
246
247 if (isset($this->metadata[$domain])) {
248 if ('' == $key) {
249 return $this->metadata[$domain];
250 }
251
252 if (isset($this->metadata[$domain][$key])) {
253 return $this->metadata[$domain][$key];
254 }
255 }
256
257 return null;
258 }
259
260 /**
261 * {@inheritdoc}
262 */
263 public function setMetadata($key, $value, $domain = 'messages')
264 {
265 $this->metadata[$domain][$key] = $value;
266 }
267
268 /**
269 * {@inheritdoc}
270 */
271 public function deleteMetadata($key = '', $domain = 'messages')
272 {
273 if ('' == $domain) {
274 $this->metadata = array();
275 } elseif ('' == $key) {
276 unset($this->metadata[$domain]);
277 } else {
278 unset($this->metadata[$domain][$key]);
279 }
280 }
281
282 /**
283 * Adds current values with the new values.
284 *
285 * @param array $values Values to add
286 */
287 private function addMetadata(array $values)
288 {
289 foreach ($values as $domain => $keys) {
290 foreach ($keys as $key => $value) {
291 $this->setMetadata($key, $value, $domain);
292 }
293 }
294 }
295}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogueInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogueInterface.php
new file mode 100644
index 00000000..5e9be20c
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogueInterface.php
@@ -0,0 +1,172 @@
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
12namespace Symfony\Component\Translation;
13
14use Symfony\Component\Config\Resource\ResourceInterface;
15
16/**
17 * MessageCatalogueInterface.
18 *
19 * @author Fabien Potencier <fabien@symfony.com>
20 *
21 * @api
22 */
23interface MessageCatalogueInterface
24{
25 /**
26 * Gets the catalogue locale.
27 *
28 * @return string The locale
29 *
30 * @api
31 */
32 public function getLocale();
33
34 /**
35 * Gets the domains.
36 *
37 * @return array An array of domains
38 *
39 * @api
40 */
41 public function getDomains();
42
43 /**
44 * Gets the messages within a given domain.
45 *
46 * If $domain is null, it returns all messages.
47 *
48 * @param string $domain The domain name
49 *
50 * @return array An array of messages
51 *
52 * @api
53 */
54 public function all($domain = null);
55
56 /**
57 * Sets a message translation.
58 *
59 * @param string $id The message id
60 * @param string $translation The messages translation
61 * @param string $domain The domain name
62 *
63 * @api
64 */
65 public function set($id, $translation, $domain = 'messages');
66
67 /**
68 * Checks if a message has a translation.
69 *
70 * @param string $id The message id
71 * @param string $domain The domain name
72 *
73 * @return Boolean true if the message has a translation, false otherwise
74 *
75 * @api
76 */
77 public function has($id, $domain = 'messages');
78
79 /**
80 * Checks if a message has a translation (it does not take into account the fallback mechanism).
81 *
82 * @param string $id The message id
83 * @param string $domain The domain name
84 *
85 * @return Boolean true if the message has a translation, false otherwise
86 *
87 * @api
88 */
89 public function defines($id, $domain = 'messages');
90
91 /**
92 * Gets a message translation.
93 *
94 * @param string $id The message id
95 * @param string $domain The domain name
96 *
97 * @return string The message translation
98 *
99 * @api
100 */
101 public function get($id, $domain = 'messages');
102
103 /**
104 * Sets translations for a given domain.
105 *
106 * @param array $messages An array of translations
107 * @param string $domain The domain name
108 *
109 * @api
110 */
111 public function replace($messages, $domain = 'messages');
112
113 /**
114 * Adds translations for a given domain.
115 *
116 * @param array $messages An array of translations
117 * @param string $domain The domain name
118 *
119 * @api
120 */
121 public function add($messages, $domain = 'messages');
122
123 /**
124 * Merges translations from the given Catalogue into the current one.
125 *
126 * The two catalogues must have the same locale.
127 *
128 * @param MessageCatalogueInterface $catalogue A MessageCatalogueInterface instance
129 *
130 * @api
131 */
132 public function addCatalogue(MessageCatalogueInterface $catalogue);
133
134 /**
135 * Merges translations from the given Catalogue into the current one
136 * only when the translation does not exist.
137 *
138 * This is used to provide default translations when they do not exist for the current locale.
139 *
140 * @param MessageCatalogueInterface $catalogue A MessageCatalogueInterface instance
141 *
142 * @api
143 */
144 public function addFallbackCatalogue(MessageCatalogueInterface $catalogue);
145
146 /**
147 * Gets the fallback catalogue.
148 *
149 * @return MessageCatalogueInterface|null A MessageCatalogueInterface instance or null when no fallback has been set
150 *
151 * @api
152 */
153 public function getFallbackCatalogue();
154
155 /**
156 * Returns an array of resources loaded to build this collection.
157 *
158 * @return ResourceInterface[] An array of resources
159 *
160 * @api
161 */
162 public function getResources();
163
164 /**
165 * Adds a resource for this collection.
166 *
167 * @param ResourceInterface $resource A resource instance
168 *
169 * @api
170 */
171 public function addResource(ResourceInterface $resource);
172}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/MessageSelector.php b/vendor/symfony/translation/Symfony/Component/Translation/MessageSelector.php
new file mode 100644
index 00000000..387c964d
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/MessageSelector.php
@@ -0,0 +1,82 @@
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
12namespace Symfony\Component\Translation;
13
14/**
15 * MessageSelector.
16 *
17 * @author Fabien Potencier <fabien@symfony.com>
18 *
19 * @api
20 */
21class MessageSelector
22{
23 /**
24 * Given a message with different plural translations separated by a
25 * pipe (|), this method returns the correct portion of the message based
26 * on the given number, locale and the pluralization rules in the message
27 * itself.
28 *
29 * The message supports two different types of pluralization rules:
30 *
31 * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples
32 * indexed: There is one apple|There are %count% apples
33 *
34 * The indexed solution can also contain labels (e.g. one: There is one apple).
35 * This is purely for making the translations more clear - it does not
36 * affect the functionality.
37 *
38 * The two methods can also be mixed:
39 * {0} There are no apples|one: There is one apple|more: There are %count% apples
40 *
41 * @param string $message The message being translated
42 * @param integer $number The number of items represented for the message
43 * @param string $locale The locale to use for choosing
44 *
45 * @return string
46 *
47 * @throws \InvalidArgumentException
48 *
49 * @api
50 */
51 public function choose($message, $number, $locale)
52 {
53 $parts = explode('|', $message);
54 $explicitRules = array();
55 $standardRules = array();
56 foreach ($parts as $part) {
57 $part = trim($part);
58
59 if (preg_match('/^(?P<interval>'.Interval::getIntervalRegexp().')\s*(?P<message>.*?)$/x', $part, $matches)) {
60 $explicitRules[$matches['interval']] = $matches['message'];
61 } elseif (preg_match('/^\w+\:\s*(.*?)$/', $part, $matches)) {
62 $standardRules[] = $matches[1];
63 } else {
64 $standardRules[] = $part;
65 }
66 }
67
68 // try to match an explicit rule, then fallback to the standard ones
69 foreach ($explicitRules as $interval => $m) {
70 if (Interval::test($number, $interval)) {
71 return $m;
72 }
73 }
74
75 $position = PluralizationRules::get($number, $locale);
76 if (!isset($standardRules[$position])) {
77 throw new \InvalidArgumentException(sprintf('Unable to choose a translation for "%s" with locale "%s". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $message, $locale));
78 }
79
80 return $standardRules[$position];
81 }
82}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/MetadataAwareInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/MetadataAwareInterface.php
new file mode 100644
index 00000000..1c439351
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/MetadataAwareInterface.php
@@ -0,0 +1,54 @@
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
12namespace Symfony\Component\Translation;
13
14/**
15 * MetadataAwareInterface.
16 *
17 * @author Fabien Potencier <fabien@symfony.com>
18 */
19interface MetadataAwareInterface
20{
21 /**
22 * Gets metadata for the given domain and key.
23 *
24 * Passing an empty domain will return an array with all metadata indexed by
25 * domain and then by key. Passing an empty key will return an array with all
26 * metadata for the given domain.
27 *
28 * @param string $domain The domain name
29 * @param string $key The key
30 *
31 * @return mixed The value that was set or an array with the domains/keys or null
32 */
33 public function getMetadata($key = '', $domain = 'messages');
34
35 /**
36 * Adds metadata to a message domain.
37 *
38 * @param string $key The key
39 * @param mixed $value The value
40 * @param string $domain The domain name
41 */
42 public function setMetadata($key, $value, $domain = 'messages');
43
44 /**
45 * Deletes metadata for the given key and domain.
46 *
47 * Passing an empty domain will delete all metadata. Passing an empty key will
48 * delete all metadata for the given domain.
49 *
50 * @param string $domain The domain name
51 * @param string $key The key
52 */
53 public function deleteMetadata($key = '', $domain = 'messages');
54}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/PluralizationRules.php b/vendor/symfony/translation/Symfony/Component/Translation/PluralizationRules.php
new file mode 100644
index 00000000..5c63b8d0
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/PluralizationRules.php
@@ -0,0 +1,219 @@
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
12namespace Symfony\Component\Translation;
13
14/**
15 * Returns the plural rules for a given locale.
16 *
17 * @author Fabien Potencier <fabien@symfony.com>
18 */
19class PluralizationRules
20{
21 // @codeCoverageIgnoreStart
22 private static $rules = array();
23
24 /**
25 * Returns the plural position to use for the given locale and number.
26 *
27 * @param integer $number The number
28 * @param string $locale The locale
29 *
30 * @return integer The plural position
31 */
32 public static function get($number, $locale)
33 {
34 if ("pt_BR" == $locale) {
35 // temporary set a locale for brazilian
36 $locale = "xbr";
37 }
38
39 if (strlen($locale) > 3) {
40 $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
41 }
42
43 if (isset(self::$rules[$locale])) {
44 $return = call_user_func(self::$rules[$locale], $number);
45
46 if (!is_int($return) || $return < 0) {
47 return 0;
48 }
49
50 return $return;
51 }
52
53 /*
54 * The plural rules are derived from code of the Zend Framework (2010-09-25),
55 * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).
56 * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
57 */
58 switch ($locale) {
59 case 'bo':
60 case 'dz':
61 case 'id':
62 case 'ja':
63 case 'jv':
64 case 'ka':
65 case 'km':
66 case 'kn':
67 case 'ko':
68 case 'ms':
69 case 'th':
70 case 'tr':
71 case 'vi':
72 case 'zh':
73 return 0;
74 break;
75
76 case 'af':
77 case 'az':
78 case 'bn':
79 case 'bg':
80 case 'ca':
81 case 'da':
82 case 'de':
83 case 'el':
84 case 'en':
85 case 'eo':
86 case 'es':
87 case 'et':
88 case 'eu':
89 case 'fa':
90 case 'fi':
91 case 'fo':
92 case 'fur':
93 case 'fy':
94 case 'gl':
95 case 'gu':
96 case 'ha':
97 case 'he':
98 case 'hu':
99 case 'is':
100 case 'it':
101 case 'ku':
102 case 'lb':
103 case 'ml':
104 case 'mn':
105 case 'mr':
106 case 'nah':
107 case 'nb':
108 case 'ne':
109 case 'nl':
110 case 'nn':
111 case 'no':
112 case 'om':
113 case 'or':
114 case 'pa':
115 case 'pap':
116 case 'ps':
117 case 'pt':
118 case 'so':
119 case 'sq':
120 case 'sv':
121 case 'sw':
122 case 'ta':
123 case 'te':
124 case 'tk':
125 case 'ur':
126 case 'zu':
127 return ($number == 1) ? 0 : 1;
128
129 case 'am':
130 case 'bh':
131 case 'fil':
132 case 'fr':
133 case 'gun':
134 case 'hi':
135 case 'ln':
136 case 'mg':
137 case 'nso':
138 case 'xbr':
139 case 'ti':
140 case 'wa':
141 return (($number == 0) || ($number == 1)) ? 0 : 1;
142
143 case 'be':
144 case 'bs':
145 case 'hr':
146 case 'ru':
147 case 'sr':
148 case 'uk':
149 return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
150
151 case 'cs':
152 case 'sk':
153 return ($number == 1) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2);
154
155 case 'ga':
156 return ($number == 1) ? 0 : (($number == 2) ? 1 : 2);
157
158 case 'lt':
159 return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
160
161 case 'sl':
162 return ($number % 100 == 1) ? 0 : (($number % 100 == 2) ? 1 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 2 : 3));
163
164 case 'mk':
165 return ($number % 10 == 1) ? 0 : 1;
166
167 case 'mt':
168 return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3));
169
170 case 'lv':
171 return ($number == 0) ? 0 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2);
172
173 case 'pl':
174 return ($number == 1) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2);
175
176 case 'cy':
177 return ($number == 1) ? 0 : (($number == 2) ? 1 : ((($number == 8) || ($number == 11)) ? 2 : 3));
178
179 case 'ro':
180 return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2);
181
182 case 'ar':
183 return ($number == 0) ? 0 : (($number == 1) ? 1 : (($number == 2) ? 2 : ((($number >= 3) && ($number <= 10)) ? 3 : ((($number >= 11) && ($number <= 99)) ? 4 : 5))));
184
185 default:
186 return 0;
187 }
188 }
189
190 /**
191 * Overrides the default plural rule for a given locale.
192 *
193 * @param string $rule A PHP callable
194 * @param string $locale The locale
195 *
196 * @return null
197 *
198 * @throws \LogicException
199 */
200 public static function set($rule, $locale)
201 {
202 if ("pt_BR" == $locale) {
203 // temporary set a locale for brazilian
204 $locale = "xbr";
205 }
206
207 if (strlen($locale) > 3) {
208 $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
209 }
210
211 if (!is_callable($rule)) {
212 throw new \LogicException('The given rule can not be called');
213 }
214
215 self::$rules[$locale] = $rule;
216 }
217
218 // @codeCoverageIgnoreEnd
219}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/README.md b/vendor/symfony/translation/Symfony/Component/Translation/README.md
new file mode 100644
index 00000000..24e6210c
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/README.md
@@ -0,0 +1,35 @@
1Translation Component
2=====================
3
4Translation provides tools for loading translation files and generating
5translated strings from these including support for pluralization.
6
7 use Symfony\Component\Translation\Translator;
8 use Symfony\Component\Translation\MessageSelector;
9 use Symfony\Component\Translation\Loader\ArrayLoader;
10
11 $translator = new Translator('fr_FR', new MessageSelector());
12 $translator->setFallbackLocales(array('fr'));
13 $translator->addLoader('array', new ArrayLoader());
14 $translator->addResource('array', array(
15 'Hello World!' => 'Bonjour',
16 ), 'fr');
17
18 echo $translator->trans('Hello World!')."\n";
19
20Resources
21---------
22
23Silex integration:
24
25https://github.com/fabpot/Silex/blob/master/src/Silex/Provider/TranslationServiceProvider.php
26
27Documentation:
28
29http://symfony.com/doc/2.3/book/translation.html
30
31You can run the unit tests with the following command:
32
33 $ cd path/to/Symfony/Component/Translation/
34 $ composer.phar install --dev
35 $ phpunit
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTest.php
new file mode 100644
index 00000000..78023e1b
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTest.php
@@ -0,0 +1,74 @@
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
12namespace Symfony\Component\Translation\Test\Catalogue;
13
14use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
15use Symfony\Component\Translation\MessageCatalogue;
16use Symfony\Component\Translation\MessageCatalogueInterface;
17
18abstract class AbstractOperationTest extends TestCase
19{
20 public function testGetEmptyDomains()
21 {
22 $this->assertEquals(
23 array(),
24 $this->createOperation(
25 new MessageCatalogue('en'),
26 new MessageCatalogue('en')
27 )->getDomains()
28 );
29 }
30
31 public function testGetMergedDomains()
32 {
33 $this->assertEquals(
34 array('a', 'b', 'c'),
35 $this->createOperation(
36 new MessageCatalogue('en', array('a' => array(), 'b' => array())),
37 new MessageCatalogue('en', array('b' => array(), 'c' => array()))
38 )->getDomains()
39 );
40 }
41
42 public function testGetMessagesFromUnknownDomain()
43 {
44 $this->setExpectedException('InvalidArgumentException');
45 $this->createOperation(
46 new MessageCatalogue('en'),
47 new MessageCatalogue('en')
48 )->getMessages('domain');
49 }
50
51 public function testGetEmptyMessages()
52 {
53 $this->assertEquals(
54 array(),
55 $this->createOperation(
56 new MessageCatalogue('en', array('a' => array())),
57 new MessageCatalogue('en')
58 )->getMessages('a')
59 );
60 }
61
62 public function testGetEmptyResult()
63 {
64 $this->assertEquals(
65 new MessageCatalogue('en'),
66 $this->createOperation(
67 new MessageCatalogue('en'),
68 new MessageCatalogue('en')
69 )->getResult()
70 );
71 }
72
73 abstract protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target);
74}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/DiffOperationTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/DiffOperationTest.php
new file mode 100644
index 00000000..b2e852d9
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/DiffOperationTest.php
@@ -0,0 +1,60 @@
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
12namespace Symfony\Component\Translation\Test\Catalogue;
13
14use Symfony\Component\Translation\Catalogue\DiffOperation;
15use Symfony\Component\Translation\MessageCatalogue;
16use Symfony\Component\Translation\MessageCatalogueInterface;
17
18class DiffOperationTest extends AbstractOperationTest
19{
20 public function testGetMessagesFromSingleDomain()
21 {
22 $operation = $this->createOperation(
23 new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'))),
24 new MessageCatalogue('en', array('messages' => array('a' => 'new_a', 'c' => 'new_c')))
25 );
26
27 $this->assertEquals(
28 array('a' => 'old_a', 'c' => 'new_c'),
29 $operation->getMessages('messages')
30 );
31
32 $this->assertEquals(
33 array('c' => 'new_c'),
34 $operation->getNewMessages('messages')
35 );
36
37 $this->assertEquals(
38 array('b' => 'old_b'),
39 $operation->getObsoleteMessages('messages')
40 );
41 }
42
43 public function testGetResultFromSingleDomain()
44 {
45 $this->assertEquals(
46 new MessageCatalogue('en', array(
47 'messages' => array('a' => 'old_a', 'c' => 'new_c')
48 )),
49 $this->createOperation(
50 new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'))),
51 new MessageCatalogue('en', array('messages' => array('a' => 'new_a', 'c' => 'new_c')))
52 )->getResult()
53 );
54 }
55
56 protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
57 {
58 return new DiffOperation($source, $target);
59 }
60}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php
new file mode 100644
index 00000000..fa5118a7
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php
@@ -0,0 +1,60 @@
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
12namespace Symfony\Component\Translation\Test\Catalogue;
13
14use Symfony\Component\Translation\Catalogue\MergeOperation;
15use Symfony\Component\Translation\MessageCatalogue;
16use Symfony\Component\Translation\MessageCatalogueInterface;
17
18class MergeOperationTest extends AbstractOperationTest
19{
20 public function testGetMessagesFromSingleDomain()
21 {
22 $operation = $this->createOperation(
23 new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'))),
24 new MessageCatalogue('en', array('messages' => array('a' => 'new_a', 'c' => 'new_c')))
25 );
26
27 $this->assertEquals(
28 array('a' => 'old_a', 'b' => 'old_b', 'c' => 'new_c'),
29 $operation->getMessages('messages')
30 );
31
32 $this->assertEquals(
33 array('c' => 'new_c'),
34 $operation->getNewMessages('messages')
35 );
36
37 $this->assertEquals(
38 array(),
39 $operation->getObsoleteMessages('messages')
40 );
41 }
42
43 public function testGetResultFromSingleDomain()
44 {
45 $this->assertEquals(
46 new MessageCatalogue('en', array(
47 'messages' => array('a' => 'old_a', 'b' => 'old_b', 'c' => 'new_c')
48 )),
49 $this->createOperation(
50 new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'))),
51 new MessageCatalogue('en', array('messages' => array('a' => 'new_a', 'c' => 'new_c')))
52 )->getResult()
53 );
54 }
55
56 protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
57 {
58 return new MergeOperation($source, $target);
59 }
60}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/CsvFileDumperTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/CsvFileDumperTest.php
new file mode 100644
index 00000000..29177ff5
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/CsvFileDumperTest.php
@@ -0,0 +1,33 @@
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
12namespace Symfony\Component\Translation\Tests\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Dumper\CsvFileDumper;
16
17class CsvFileDumperTest extends \PHPUnit_Framework_TestCase
18{
19 public function testDump()
20 {
21 $catalogue = new MessageCatalogue('en');
22 $catalogue->add(array('foo' => 'bar', 'bar' => 'foo
23foo', 'foo;foo' => 'bar'));
24
25 $tempDir = sys_get_temp_dir();
26 $dumper = new CsvFileDumper();
27 $dumper->dump($catalogue, array('path' => $tempDir));
28
29 $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/valid.csv'), file_get_contents($tempDir.'/messages.en.csv'));
30
31 unlink($tempDir.'/messages.en.csv');
32 }
33}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php
new file mode 100644
index 00000000..d187ef1d
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php
@@ -0,0 +1,37 @@
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
12namespace Symfony\Component\Translation\Tests\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Dumper\IcuResFileDumper;
16
17class IcuResFileDumperTest extends \PHPUnit_Framework_TestCase
18{
19 public function testDump()
20 {
21 if (!extension_loaded('mbstring')) {
22 $this->markTestSkipped('This test requires mbstring to work.');
23 }
24
25 $catalogue = new MessageCatalogue('en');
26 $catalogue->add(array('foo' => 'bar'));
27
28 $tempDir = sys_get_temp_dir();
29 $dumper = new IcuResFileDumper();
30 $dumper->dump($catalogue, array('path' => $tempDir));
31
32 $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resourcebundle/res/en.res'), file_get_contents($tempDir.'/messages/en.res'));
33
34 unlink($tempDir.'/messages/en.res');
35 rmdir($tempDir.'/messages');
36 }
37}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/IniFileDumperTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/IniFileDumperTest.php
new file mode 100644
index 00000000..2a2cefde
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/IniFileDumperTest.php
@@ -0,0 +1,32 @@
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
12namespace Symfony\Component\Translation\Tests\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Dumper\IniFileDumper;
16
17class IniFileDumperTest extends \PHPUnit_Framework_TestCase
18{
19 public function testDump()
20 {
21 $catalogue = new MessageCatalogue('en');
22 $catalogue->add(array('foo' => 'bar'));
23
24 $tempDir = sys_get_temp_dir();
25 $dumper = new IniFileDumper();
26 $dumper->dump($catalogue, array('path' => $tempDir));
27
28 $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.ini'), file_get_contents($tempDir.'/messages.en.ini'));
29
30 unlink($tempDir.'/messages.en.ini');
31 }
32}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/MoFileDumperTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/MoFileDumperTest.php
new file mode 100644
index 00000000..439a25cd
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/MoFileDumperTest.php
@@ -0,0 +1,31 @@
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
12namespace Symfony\Component\Translation\Tests\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Dumper\MoFileDumper;
16
17class MoFileDumperTest extends \PHPUnit_Framework_TestCase
18{
19 public function testDump()
20 {
21 $catalogue = new MessageCatalogue('en');
22 $catalogue->add(array('foo' => 'bar'));
23
24 $tempDir = sys_get_temp_dir();
25 $dumper = new MoFileDumper();
26 $dumper->dump($catalogue, array('path' => $tempDir));
27 $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.mo'), file_get_contents($tempDir.'/messages.en.mo'));
28
29 unlink($tempDir.'/messages.en.mo');
30 }
31}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/PhpFileDumperTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/PhpFileDumperTest.php
new file mode 100644
index 00000000..18be5a0d
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/PhpFileDumperTest.php
@@ -0,0 +1,32 @@
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
12namespace Symfony\Component\Translation\Tests\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Dumper\PhpFileDumper;
16
17class PhpFileDumperTest extends \PHPUnit_Framework_TestCase
18{
19 public function testDump()
20 {
21 $catalogue = new MessageCatalogue('en');
22 $catalogue->add(array('foo' => 'bar'));
23
24 $tempDir = sys_get_temp_dir();
25 $dumper = new PhpFileDumper();
26 $dumper->dump($catalogue, array('path' => $tempDir));
27
28 $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.php'), file_get_contents($tempDir.'/messages.en.php'));
29
30 unlink($tempDir.'/messages.en.php');
31 }
32}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.php
new file mode 100644
index 00000000..0296d6b2
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.php
@@ -0,0 +1,31 @@
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
12namespace Symfony\Component\Translation\Tests\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Dumper\PoFileDumper;
16
17class PoFileDumperTest extends \PHPUnit_Framework_TestCase
18{
19 public function testDump()
20 {
21 $catalogue = new MessageCatalogue('en');
22 $catalogue->add(array('foo' => 'bar'));
23
24 $tempDir = sys_get_temp_dir();
25 $dumper = new PoFileDumper();
26 $dumper->dump($catalogue, array('path' => $tempDir));
27 $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.po'), file_get_contents($tempDir.'/messages.en.po'));
28
29 unlink($tempDir.'/messages.en.po');
30 }
31}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/QtFileDumperTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/QtFileDumperTest.php
new file mode 100644
index 00000000..d7d8fb7e
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/QtFileDumperTest.php
@@ -0,0 +1,32 @@
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
12namespace Symfony\Component\Translation\Tests\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Dumper\QtFileDumper;
16
17class QtFileDumperTest extends \PHPUnit_Framework_TestCase
18{
19 public function testDump()
20 {
21 $catalogue = new MessageCatalogue('en');
22 $catalogue->add(array('foo' => 'bar'), 'resources');
23
24 $tempDir = sys_get_temp_dir();
25 $dumper = new QtFileDumper();
26 $dumper->dump($catalogue, array('path' => $tempDir));
27
28 $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.ts'), file_get_contents($tempDir.'/resources.en.ts'));
29
30 unlink($tempDir.'/resources.en.ts');
31 }
32}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php
new file mode 100644
index 00000000..bef31358
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php
@@ -0,0 +1,32 @@
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
12namespace Symfony\Component\Translation\Tests\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Dumper\XliffFileDumper;
16
17class XliffFileDumperTest extends \PHPUnit_Framework_TestCase
18{
19 public function testDump()
20 {
21 $catalogue = new MessageCatalogue('en');
22 $catalogue->add(array('foo' => 'bar', 'key' => ''));
23
24 $tempDir = sys_get_temp_dir();
25 $dumper = new XliffFileDumper();
26 $dumper->dump($catalogue, array('path' => $tempDir));
27
28 $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources-clean.xlf'), file_get_contents($tempDir.'/messages.en.xlf'));
29
30 unlink($tempDir.'/messages.en.xlf');
31 }
32}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/YamlFileDumperTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/YamlFileDumperTest.php
new file mode 100644
index 00000000..e4e68e02
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Dumper/YamlFileDumperTest.php
@@ -0,0 +1,39 @@
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
12namespace Symfony\Component\Translation\Tests\Dumper;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Dumper\YamlFileDumper;
16
17class YamlFileDumperTest extends \PHPUnit_Framework_TestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Yaml\Yaml')) {
22 $this->markTestSkipped('The "Yaml" component is not available');
23 }
24 }
25
26 public function testDump()
27 {
28 $catalogue = new MessageCatalogue('en');
29 $catalogue->add(array('foo' => 'bar'));
30
31 $tempDir = sys_get_temp_dir();
32 $dumper = new YamlFileDumper();
33 $dumper->dump($catalogue, array('path' => $tempDir));
34
35 $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.yml'), file_get_contents($tempDir.'/messages.en.yml'));
36
37 unlink($tempDir.'/messages.en.yml');
38 }
39}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/IdentityTranslatorTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/IdentityTranslatorTest.php
new file mode 100644
index 00000000..435f0c28
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/IdentityTranslatorTest.php
@@ -0,0 +1,61 @@
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
12namespace Symfony\Component\Translation\Tests;
13
14use Symfony\Component\Translation\IdentityTranslator;
15use Symfony\Component\Translation\MessageSelector;
16
17class IdentityTranslatorTest extends \PHPUnit_Framework_TestCase
18{
19 /**
20 * @dataProvider getTransTests
21 */
22 public function testTrans($expected, $id, $parameters)
23 {
24 $translator = new IdentityTranslator(new MessageSelector());
25
26 $this->assertEquals($expected, $translator->trans($id, $parameters));
27 }
28
29 /**
30 * @dataProvider getTransChoiceTests
31 */
32 public function testTransChoice($expected, $id, $number, $parameters)
33 {
34 $translator = new IdentityTranslator(new MessageSelector());
35
36 $this->assertEquals($expected, $translator->transChoice($id, $number, $parameters));
37 }
38
39 // noop
40 public function testGetSetLocale()
41 {
42 $translator = new IdentityTranslator(new MessageSelector());
43 $translator->setLocale('en');
44 $translator->getLocale();
45 }
46
47 public function getTransTests()
48 {
49 return array(
50 array('Symfony2 is great!', 'Symfony2 is great!', array()),
51 array('Symfony2 is awesome!', 'Symfony2 is %what%!', array('%what%' => 'awesome')),
52 );
53 }
54
55 public function getTransChoiceTests()
56 {
57 return array(
58 array('There is 10 apples', '{0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples', 10, array('%count%' => 10)),
59 );
60 }
61}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/IntervalTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/IntervalTest.php
new file mode 100644
index 00000000..075c98b7
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/IntervalTest.php
@@ -0,0 +1,48 @@
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
12namespace Symfony\Component\Translation\Tests;
13
14use Symfony\Component\Translation\Interval;
15
16class IntervalTest extends \PHPUnit_Framework_TestCase
17{
18 /**
19 * @dataProvider getTests
20 */
21 public function testTest($expected, $number, $interval)
22 {
23 $this->assertEquals($expected, Interval::test($number, $interval));
24 }
25
26 /**
27 * @expectedException \InvalidArgumentException
28 */
29 public function testTestException()
30 {
31 Interval::test(1, 'foobar');
32 }
33
34 public function getTests()
35 {
36 return array(
37 array(true, 3, '{1,2, 3 ,4}'),
38 array(false, 10, '{1,2, 3 ,4}'),
39 array(false, 3, '[1,2]'),
40 array(true, 1, '[1,2]'),
41 array(true, 2, '[1,2]'),
42 array(false, 1, ']1,2['),
43 array(false, 2, ']1,2['),
44 array(true, log(0), '[-Inf,2['),
45 array(true, -log(0), '[-2,+Inf]'),
46 );
47 }
48}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.php
new file mode 100644
index 00000000..59569a3d
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.php
@@ -0,0 +1,67 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14use Symfony\Component\Translation\Loader\CsvFileLoader;
15use Symfony\Component\Config\Resource\FileResource;
16
17class CsvFileLoaderTest extends \PHPUnit_Framework_TestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
22 $this->markTestSkipped('The "Config" component is not available');
23 }
24 }
25
26 public function testLoad()
27 {
28 $loader = new CsvFileLoader();
29 $resource = __DIR__.'/../fixtures/resources.csv';
30 $catalogue = $loader->load($resource, 'en', 'domain1');
31
32 $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
33 $this->assertEquals('en', $catalogue->getLocale());
34 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
35 }
36
37 public function testLoadDoesNothingIfEmpty()
38 {
39 $loader = new CsvFileLoader();
40 $resource = __DIR__.'/../fixtures/empty.csv';
41 $catalogue = $loader->load($resource, 'en', 'domain1');
42
43 $this->assertEquals(array(), $catalogue->all('domain1'));
44 $this->assertEquals('en', $catalogue->getLocale());
45 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
46 }
47
48 /**
49 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
50 */
51 public function testLoadNonExistingResource()
52 {
53 $loader = new CsvFileLoader();
54 $resource = __DIR__.'/../fixtures/not-exists.csv';
55 $loader->load($resource, 'en', 'domain1');
56 }
57
58 /**
59 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
60 */
61 public function testLoadNonLocalResource()
62 {
63 $loader = new CsvFileLoader();
64 $resource = 'http://example.com/resources.csv';
65 $loader->load($resource, 'en', 'domain1');
66 }
67}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IcuDatFileLoaderTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IcuDatFileLoaderTest.php
new file mode 100644
index 00000000..a3bd67ab
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IcuDatFileLoaderTest.php
@@ -0,0 +1,72 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14use Symfony\Component\Translation\Loader\IcuDatFileLoader;
15use Symfony\Component\Config\Resource\FileResource;
16
17class IcuDatFileLoaderTest extends LocalizedTestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
22 $this->markTestSkipped('The "Config" component is not available');
23 }
24
25 if (!extension_loaded('intl')) {
26 $this->markTestSkipped('This test requires intl extension to work.');
27 }
28 }
29
30 /**
31 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
32 */
33 public function testLoadInvalidResource()
34 {
35 $loader = new IcuDatFileLoader();
36 $loader->load(__DIR__.'/../fixtures/resourcebundle/corrupted/resources', 'es', 'domain2');
37 }
38
39 public function testDatEnglishLoad()
40 {
41 // bundled resource is build using pkgdata command which at least in ICU 4.2 comes in extremely! buggy form
42 // you must specify an temporary build directory which is not the same as current directory and
43 // MUST reside on the same partition. pkgdata -p resources -T /srv -d.packagelist.txt
44 $loader = new IcuDatFileLoader();
45 $resource = __DIR__.'/../fixtures/resourcebundle/dat/resources';
46 $catalogue = $loader->load($resource, 'en', 'domain1');
47
48 $this->assertEquals(array('symfony' => 'Symfony 2 is great'), $catalogue->all('domain1'));
49 $this->assertEquals('en', $catalogue->getLocale());
50 $this->assertEquals(array(new FileResource($resource.'.dat')), $catalogue->getResources());
51 }
52
53 public function testDatFrenchLoad()
54 {
55 $loader = new IcuDatFileLoader();
56 $resource = __DIR__.'/../fixtures/resourcebundle/dat/resources';
57 $catalogue = $loader->load($resource, 'fr', 'domain1');
58
59 $this->assertEquals(array('symfony' => 'Symfony 2 est génial'), $catalogue->all('domain1'));
60 $this->assertEquals('fr', $catalogue->getLocale());
61 $this->assertEquals(array(new FileResource($resource.'.dat')), $catalogue->getResources());
62 }
63
64 /**
65 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
66 */
67 public function testLoadNonExistingResource()
68 {
69 $loader = new IcuDatFileLoader();
70 $loader->load(__DIR__.'/../fixtures/non-existing.txt', 'en', 'domain1');
71 }
72}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IcuResFileLoaderTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IcuResFileLoaderTest.php
new file mode 100644
index 00000000..233e1897
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IcuResFileLoaderTest.php
@@ -0,0 +1,59 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14use Symfony\Component\Translation\Loader\IcuResFileLoader;
15use Symfony\Component\Config\Resource\DirectoryResource;
16
17class IcuResFileLoaderTest extends LocalizedTestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
22 $this->markTestSkipped('The "Config" component is not available');
23 }
24
25 if (!extension_loaded('intl')) {
26 $this->markTestSkipped('This test requires intl extension to work.');
27 }
28 }
29
30 public function testLoad()
31 {
32 // resource is build using genrb command
33 $loader = new IcuResFileLoader();
34 $resource = __DIR__.'/../fixtures/resourcebundle/res';
35 $catalogue = $loader->load($resource, 'en', 'domain1');
36
37 $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
38 $this->assertEquals('en', $catalogue->getLocale());
39 $this->assertEquals(array(new DirectoryResource($resource)), $catalogue->getResources());
40 }
41
42 /**
43 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
44 */
45 public function testLoadNonExistingResource()
46 {
47 $loader = new IcuResFileLoader();
48 $loader->load(__DIR__.'/../fixtures/non-existing.txt', 'en', 'domain1');
49 }
50
51 /**
52 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
53 */
54 public function testLoadInvalidResource()
55 {
56 $loader = new IcuResFileLoader();
57 $loader->load(__DIR__.'/../fixtures/resourcebundle/corrupted', 'en', 'domain1');
58 }
59}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IniFileLoaderTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IniFileLoaderTest.php
new file mode 100644
index 00000000..ae1289d0
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/IniFileLoaderTest.php
@@ -0,0 +1,57 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14use Symfony\Component\Translation\Loader\IniFileLoader;
15use Symfony\Component\Config\Resource\FileResource;
16
17class IniFileLoaderTest extends \PHPUnit_Framework_TestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
22 $this->markTestSkipped('The "Config" component is not available');
23 }
24 }
25
26 public function testLoad()
27 {
28 $loader = new IniFileLoader();
29 $resource = __DIR__.'/../fixtures/resources.ini';
30 $catalogue = $loader->load($resource, 'en', 'domain1');
31
32 $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
33 $this->assertEquals('en', $catalogue->getLocale());
34 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
35 }
36
37 public function testLoadDoesNothingIfEmpty()
38 {
39 $loader = new IniFileLoader();
40 $resource = __DIR__.'/../fixtures/empty.ini';
41 $catalogue = $loader->load($resource, 'en', 'domain1');
42
43 $this->assertEquals(array(), $catalogue->all('domain1'));
44 $this->assertEquals('en', $catalogue->getLocale());
45 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
46 }
47
48 /**
49 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
50 */
51 public function testLoadNonExistingResource()
52 {
53 $loader = new IniFileLoader();
54 $resource = __DIR__.'/../fixtures/non-existing.ini';
55 $loader->load($resource, 'en', 'domain1');
56 }
57}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/LocalizedTestCase.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/LocalizedTestCase.php
new file mode 100644
index 00000000..9d7c5d70
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/LocalizedTestCase.php
@@ -0,0 +1,22 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14abstract class LocalizedTestCase extends \PHPUnit_Framework_TestCase
15{
16 protected function setUp()
17 {
18 if (!extension_loaded('intl')) {
19 $this->markTestSkipped('The "intl" extension is not available');
20 }
21 }
22}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/MoFileLoaderTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/MoFileLoaderTest.php
new file mode 100644
index 00000000..c2616bda
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/MoFileLoaderTest.php
@@ -0,0 +1,67 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14use Symfony\Component\Translation\Loader\MoFileLoader;
15use Symfony\Component\Config\Resource\FileResource;
16
17class MoFileLoaderTest extends \PHPUnit_Framework_TestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
22 $this->markTestSkipped('The "Config" component is not available');
23 }
24 }
25
26 public function testLoad()
27 {
28 $loader = new MoFileLoader();
29 $resource = __DIR__.'/../fixtures/resources.mo';
30 $catalogue = $loader->load($resource, 'en', 'domain1');
31
32 $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
33 $this->assertEquals('en', $catalogue->getLocale());
34 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
35 }
36
37 public function testLoadPlurals()
38 {
39 $loader = new MoFileLoader();
40 $resource = __DIR__.'/../fixtures/plurals.mo';
41 $catalogue = $loader->load($resource, 'en', 'domain1');
42
43 $this->assertEquals(array('foo' => 'bar', 'foos' => '{0} bar|{1} bars'), $catalogue->all('domain1'));
44 $this->assertEquals('en', $catalogue->getLocale());
45 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
46 }
47
48 /**
49 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
50 */
51 public function testLoadNonExistingResource()
52 {
53 $loader = new MoFileLoader();
54 $resource = __DIR__.'/../fixtures/non-existing.mo';
55 $loader->load($resource, 'en', 'domain1');
56 }
57
58 /**
59 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
60 */
61 public function testLoadInvalidResource()
62 {
63 $loader = new MoFileLoader();
64 $resource = __DIR__.'/../fixtures/empty.mo';
65 $loader->load($resource, 'en', 'domain1');
66 }
67}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/PhpFileLoaderTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/PhpFileLoaderTest.php
new file mode 100644
index 00000000..5dfe837d
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/PhpFileLoaderTest.php
@@ -0,0 +1,56 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14use Symfony\Component\Translation\Loader\PhpFileLoader;
15use Symfony\Component\Config\Resource\FileResource;
16
17class PhpFileLoaderTest extends \PHPUnit_Framework_TestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
22 $this->markTestSkipped('The "Config" component is not available');
23 }
24 }
25
26 public function testLoad()
27 {
28 $loader = new PhpFileLoader();
29 $resource = __DIR__.'/../fixtures/resources.php';
30 $catalogue = $loader->load($resource, 'en', 'domain1');
31
32 $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
33 $this->assertEquals('en', $catalogue->getLocale());
34 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
35 }
36
37 /**
38 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
39 */
40 public function testLoadNonExistingResource()
41 {
42 $loader = new PhpFileLoader();
43 $resource = __DIR__.'/../fixtures/non-existing.php';
44 $loader->load($resource, 'en', 'domain1');
45 }
46
47 /**
48 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
49 */
50 public function testLoadThrowsAnExceptionIfFileNotLocal()
51 {
52 $loader = new PhpFileLoader();
53 $resource = 'http://example.com/resources.php';
54 $loader->load($resource, 'en', 'domain1');
55 }
56}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.php
new file mode 100644
index 00000000..cd3d85a1
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.php
@@ -0,0 +1,79 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14use Symfony\Component\Translation\Loader\PoFileLoader;
15use Symfony\Component\Config\Resource\FileResource;
16
17class PoFileLoaderTest extends \PHPUnit_Framework_TestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
22 $this->markTestSkipped('The "Config" component is not available');
23 }
24 }
25
26 public function testLoad()
27 {
28 $loader = new PoFileLoader();
29 $resource = __DIR__.'/../fixtures/resources.po';
30 $catalogue = $loader->load($resource, 'en', 'domain1');
31
32 $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
33 $this->assertEquals('en', $catalogue->getLocale());
34 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
35 }
36
37 public function testLoadPlurals()
38 {
39 $loader = new PoFileLoader();
40 $resource = __DIR__.'/../fixtures/plurals.po';
41 $catalogue = $loader->load($resource, 'en', 'domain1');
42
43 $this->assertEquals(array('foo' => 'bar', 'foos' => 'bar|bars'), $catalogue->all('domain1'));
44 $this->assertEquals('en', $catalogue->getLocale());
45 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
46 }
47
48 public function testLoadDoesNothingIfEmpty()
49 {
50 $loader = new PoFileLoader();
51 $resource = __DIR__.'/../fixtures/empty.po';
52 $catalogue = $loader->load($resource, 'en', 'domain1');
53
54 $this->assertEquals(array(), $catalogue->all('domain1'));
55 $this->assertEquals('en', $catalogue->getLocale());
56 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
57 }
58
59 /**
60 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
61 */
62 public function testLoadNonExistingResource()
63 {
64 $loader = new PoFileLoader();
65 $resource = __DIR__.'/../fixtures/non-existing.po';
66 $loader->load($resource, 'en', 'domain1');
67 }
68
69 public function testLoadEmptyTranslation()
70 {
71 $loader = new PoFileLoader();
72 $resource = __DIR__.'/../fixtures/empty-translation.po';
73 $catalogue = $loader->load($resource, 'en', 'domain1');
74
75 $this->assertEquals(array('foo' => ''), $catalogue->all('domain1'));
76 $this->assertEquals('en', $catalogue->getLocale());
77 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
78 }
79}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/QtFileLoaderTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/QtFileLoaderTest.php
new file mode 100644
index 00000000..c1dd7b10
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/QtFileLoaderTest.php
@@ -0,0 +1,66 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14use Symfony\Component\Translation\Loader\QtFileLoader;
15use Symfony\Component\Config\Resource\FileResource;
16
17class QtFileLoaderTest extends \PHPUnit_Framework_TestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
22 $this->markTestSkipped('The "Config" component is not available');
23 }
24 }
25
26 public function testLoad()
27 {
28 $loader = new QtFileLoader();
29 $resource = __DIR__.'/../fixtures/resources.ts';
30 $catalogue = $loader->load($resource, 'en', 'resources');
31
32 $this->assertEquals(array('foo' => 'bar'), $catalogue->all('resources'));
33 $this->assertEquals('en', $catalogue->getLocale());
34 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
35 }
36
37 /**
38 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
39 */
40 public function testLoadNonExistingResource()
41 {
42 $loader = new QtFileLoader();
43 $resource = __DIR__.'/../fixtures/non-existing.ts';
44 $loader->load($resource, 'en', 'domain1');
45 }
46
47 /**
48 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
49 */
50 public function testLoadNonLocalResource()
51 {
52 $loader = new QtFileLoader();
53 $resource = 'http://domain1.com/resources.ts';
54 $loader->load($resource, 'en', 'domain1');
55 }
56
57 /**
58 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
59 */
60 public function testLoadInvalidResource()
61 {
62 $loader = new QtFileLoader();
63 $resource = __DIR__.'/../fixtures/invalid-xml-resources.xlf';
64 $loader->load($resource, 'en', 'domain1');
65 }
66}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php
new file mode 100644
index 00000000..1d58e0ee
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php
@@ -0,0 +1,113 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14use Symfony\Component\Translation\Loader\XliffFileLoader;
15use Symfony\Component\Config\Resource\FileResource;
16
17class XliffFileLoaderTest extends \PHPUnit_Framework_TestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
22 $this->markTestSkipped('The "Config" component is not available');
23 }
24 }
25
26 public function testLoad()
27 {
28 $loader = new XliffFileLoader();
29 $resource = __DIR__.'/../fixtures/resources.xlf';
30 $catalogue = $loader->load($resource, 'en', 'domain1');
31
32 $this->assertEquals('en', $catalogue->getLocale());
33 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
34 }
35
36 public function testLoadWithResname()
37 {
38 $loader = new XliffFileLoader();
39 $catalogue = $loader->load(__DIR__.'/../fixtures/resname.xlf', 'en', 'domain1');
40
41 $this->assertEquals(array('foo' => 'bar', 'bar' => 'baz', 'baz' => 'foo'), $catalogue->all('domain1'));
42 }
43
44 public function testIncompleteResource()
45 {
46 $loader = new XliffFileLoader();
47 $catalogue = $loader->load(__DIR__.'/../fixtures/resources.xlf', 'en', 'domain1');
48
49 $this->assertEquals(array('foo' => 'bar', 'key' => '', 'test' => 'with'), $catalogue->all('domain1'));
50 $this->assertFalse($catalogue->has('extra', 'domain1'));
51 }
52
53 public function testEncoding()
54 {
55 if (!function_exists('iconv') && !function_exists('mb_convert_encoding')) {
56 $this->markTestSkipped('The iconv and mbstring extensions are not available.');
57 }
58
59 $loader = new XliffFileLoader();
60 $catalogue = $loader->load(__DIR__.'/../fixtures/encoding.xlf', 'en', 'domain1');
61
62 $this->assertEquals(utf8_decode('föö'), $catalogue->get('bar', 'domain1'));
63 $this->assertEquals(utf8_decode('bär'), $catalogue->get('foo', 'domain1'));
64 }
65
66 /**
67 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
68 */
69 public function testLoadInvalidResource()
70 {
71 $loader = new XliffFileLoader();
72 $loader->load(__DIR__.'/../fixtures/resources.php', 'en', 'domain1');
73 }
74
75 /**
76 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
77 */
78 public function testLoadResourceDoesNotValidate()
79 {
80 $loader = new XliffFileLoader();
81 $loader->load(__DIR__.'/../fixtures/non-valid.xlf', 'en', 'domain1');
82 }
83
84 /**
85 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
86 */
87 public function testLoadNonExistingResource()
88 {
89 $loader = new XliffFileLoader();
90 $resource = __DIR__.'/../fixtures/non-existing.xlf';
91 $loader->load($resource, 'en', 'domain1');
92 }
93
94 /**
95 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
96 */
97 public function testLoadThrowsAnExceptionIfFileNotLocal()
98 {
99 $loader = new XliffFileLoader();
100 $resource = 'http://example.com/resources.xlf';
101 $loader->load($resource, 'en', 'domain1');
102 }
103
104 /**
105 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
106 * @expectedExceptionMessage Document types are not allowed.
107 */
108 public function testDocTypeIsNotAllowed()
109 {
110 $loader = new XliffFileLoader();
111 $loader->load(__DIR__.'/../fixtures/withdoctype.xlf', 'en', 'domain1');
112 }
113}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/YamlFileLoaderTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/YamlFileLoaderTest.php
new file mode 100644
index 00000000..511b1279
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/Loader/YamlFileLoaderTest.php
@@ -0,0 +1,81 @@
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
12namespace Symfony\Component\Translation\Tests\Loader;
13
14use Symfony\Component\Translation\Loader\YamlFileLoader;
15use Symfony\Component\Config\Resource\FileResource;
16
17class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
18{
19 protected function setUp()
20 {
21 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
22 $this->markTestSkipped('The "Config" component is not available');
23 }
24
25 if (!class_exists('Symfony\Component\Yaml\Yaml')) {
26 $this->markTestSkipped('The "Yaml" component is not available');
27 }
28 }
29
30 public function testLoad()
31 {
32 $loader = new YamlFileLoader();
33 $resource = __DIR__.'/../fixtures/resources.yml';
34 $catalogue = $loader->load($resource, 'en', 'domain1');
35
36 $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
37 $this->assertEquals('en', $catalogue->getLocale());
38 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
39 }
40
41 public function testLoadDoesNothingIfEmpty()
42 {
43 $loader = new YamlFileLoader();
44 $resource = __DIR__.'/../fixtures/empty.yml';
45 $catalogue = $loader->load($resource, 'en', 'domain1');
46
47 $this->assertEquals(array(), $catalogue->all('domain1'));
48 $this->assertEquals('en', $catalogue->getLocale());
49 $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
50 }
51
52 /**
53 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
54 */
55 public function testLoadNonExistingResource()
56 {
57 $loader = new YamlFileLoader();
58 $resource = __DIR__.'/../fixtures/non-existing.yml';
59 $loader->load($resource, 'en', 'domain1');
60 }
61
62 /**
63 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
64 */
65 public function testLoadThrowsAnExceptionIfFileNotLocal()
66 {
67 $loader = new YamlFileLoader();
68 $resource = 'http://example.com/resources.yml';
69 $loader->load($resource, 'en', 'domain1');
70 }
71
72 /**
73 * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
74 */
75 public function testLoadThrowsAnExceptionIfNotAnArray()
76 {
77 $loader = new YamlFileLoader();
78 $resource = __DIR__.'/../fixtures/non-valid.yml';
79 $loader->load($resource, 'en', 'domain1');
80 }
81}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/MessageCatalogueTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/MessageCatalogueTest.php
new file mode 100644
index 00000000..aa6f8707
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/MessageCatalogueTest.php
@@ -0,0 +1,212 @@
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
12namespace Symfony\Component\Translation\Tests;
13
14use Symfony\Component\Translation\MessageCatalogue;
15
16class MessageCatalogueTest extends \PHPUnit_Framework_TestCase
17{
18 public function testGetLocale()
19 {
20 $catalogue = new MessageCatalogue('en');
21
22 $this->assertEquals('en', $catalogue->getLocale());
23 }
24
25 public function testGetDomains()
26 {
27 $catalogue = new MessageCatalogue('en', array('domain1' => array(), 'domain2' => array()));
28
29 $this->assertEquals(array('domain1', 'domain2'), $catalogue->getDomains());
30 }
31
32 public function testAll()
33 {
34 $catalogue = new MessageCatalogue('en', $messages = array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
35
36 $this->assertEquals(array('foo' => 'foo'), $catalogue->all('domain1'));
37 $this->assertEquals(array(), $catalogue->all('domain88'));
38 $this->assertEquals($messages, $catalogue->all());
39 }
40
41 public function testHas()
42 {
43 $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
44
45 $this->assertTrue($catalogue->has('foo', 'domain1'));
46 $this->assertFalse($catalogue->has('bar', 'domain1'));
47 $this->assertFalse($catalogue->has('foo', 'domain88'));
48 }
49
50 public function testGetSet()
51 {
52 $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
53 $catalogue->set('foo1', 'foo1', 'domain1');
54
55 $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
56 $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
57 }
58
59 public function testAdd()
60 {
61 $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
62 $catalogue->add(array('foo1' => 'foo1'), 'domain1');
63
64 $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
65 $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
66
67 $catalogue->add(array('foo' => 'bar'), 'domain1');
68 $this->assertEquals('bar', $catalogue->get('foo', 'domain1'));
69 $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
70
71 $catalogue->add(array('foo' => 'bar'), 'domain88');
72 $this->assertEquals('bar', $catalogue->get('foo', 'domain88'));
73 }
74
75 public function testReplace()
76 {
77 $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
78 $catalogue->replace($messages = array('foo1' => 'foo1'), 'domain1');
79
80 $this->assertEquals($messages, $catalogue->all('domain1'));
81 }
82
83 public function testAddCatalogue()
84 {
85 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
86 $this->markTestSkipped('The "Config" component is not available');
87 }
88
89 $r = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
90 $r->expects($this->any())->method('__toString')->will($this->returnValue('r'));
91
92 $r1 = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
93 $r1->expects($this->any())->method('__toString')->will($this->returnValue('r1'));
94
95 $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
96 $catalogue->addResource($r);
97
98 $catalogue1 = new MessageCatalogue('en', array('domain1' => array('foo1' => 'foo1')));
99 $catalogue1->addResource($r1);
100
101 $catalogue->addCatalogue($catalogue1);
102
103 $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
104 $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
105
106 $this->assertEquals(array($r, $r1), $catalogue->getResources());
107 }
108
109 public function testAddFallbackCatalogue()
110 {
111 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
112 $this->markTestSkipped('The "Config" component is not available');
113 }
114
115 $r = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
116 $r->expects($this->any())->method('__toString')->will($this->returnValue('r'));
117
118 $r1 = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
119 $r1->expects($this->any())->method('__toString')->will($this->returnValue('r1'));
120
121 $catalogue = new MessageCatalogue('en_US', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
122 $catalogue->addResource($r);
123
124 $catalogue1 = new MessageCatalogue('en', array('domain1' => array('foo' => 'bar', 'foo1' => 'foo1')));
125 $catalogue1->addResource($r1);
126
127 $catalogue->addFallbackCatalogue($catalogue1);
128
129 $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
130 $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
131
132 $this->assertEquals(array($r, $r1), $catalogue->getResources());
133 }
134
135 /**
136 * @expectedException LogicException
137 */
138 public function testAddFallbackCatalogueWithCircularReference()
139 {
140 $main = new MessageCatalogue('en_US');
141 $fallback = new MessageCatalogue('fr_FR');
142
143 $fallback->addFallbackCatalogue($main);
144 $main->addFallbackCatalogue($fallback);
145 }
146
147 /**
148 * @expectedException LogicException
149 */
150 public function testAddCatalogueWhenLocaleIsNotTheSameAsTheCurrentOne()
151 {
152 $catalogue = new MessageCatalogue('en');
153 $catalogue->addCatalogue(new MessageCatalogue('fr', array()));
154 }
155
156 public function testGetAddResource()
157 {
158 if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
159 $this->markTestSkipped('The "Config" component is not available');
160 }
161
162 $catalogue = new MessageCatalogue('en');
163 $r = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
164 $r->expects($this->any())->method('__toString')->will($this->returnValue('r'));
165 $catalogue->addResource($r);
166 $catalogue->addResource($r);
167 $r1 = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
168 $r1->expects($this->any())->method('__toString')->will($this->returnValue('r1'));
169 $catalogue->addResource($r1);
170
171 $this->assertEquals(array($r, $r1), $catalogue->getResources());
172 }
173
174 public function testMetadataDelete()
175 {
176 $catalogue = new MessageCatalogue('en');
177 $this->assertEquals(array(), $catalogue->getMetadata('', ''), 'Metadata is empty');
178 $catalogue->deleteMetadata('key', 'messages');
179 $catalogue->deleteMetadata('', 'messages');
180 $catalogue->deleteMetadata();
181 }
182
183 public function testMetadataSetGetDelete()
184 {
185 $catalogue = new MessageCatalogue('en');
186 $catalogue->setMetadata('key', 'value');
187 $this->assertEquals('value', $catalogue->getMetadata('key', 'messages'), "Metadata 'key' = 'value'");
188
189 $catalogue->setMetadata('key2', array());
190 $this->assertEquals(array(), $catalogue->getMetadata('key2', 'messages'), 'Metadata key2 is array');
191
192 $catalogue->deleteMetadata('key2', 'messages');
193 $this->assertEquals(null, $catalogue->getMetadata('key2', 'messages'), 'Metadata key2 should is deleted.');
194
195 $catalogue->deleteMetadata('key2', 'domain');
196 $this->assertEquals(null, $catalogue->getMetadata('key2', 'domain'), 'Metadata key2 should is deleted.');
197 }
198
199 public function testMetadataMerge()
200 {
201 $cat1 = new MessageCatalogue('en');
202 $cat1->setMetadata('a', 'b');
203 $this->assertEquals(array('messages' => array('a' => 'b')), $cat1->getMetadata('', ''), 'Cat1 contains messages metadata.');
204
205 $cat2 = new MessageCatalogue('en');
206 $cat2->setMetadata('b', 'c', 'domain');
207 $this->assertEquals(array('domain' => array('b' => 'c')), $cat2->getMetadata('', ''), 'Cat2 contains domain metadata.');
208
209 $cat1->addCatalogue($cat2);
210 $this->assertEquals(array('messages' => array('a' => 'b'), 'domain' => array('b' => 'c')), $cat1->getMetadata('', ''), 'Cat1 contains merged metadata.');
211 }
212}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/MessageSelectorTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/MessageSelectorTest.php
new file mode 100644
index 00000000..74956294
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/MessageSelectorTest.php
@@ -0,0 +1,80 @@
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
12namespace Symfony\Component\Translation\Tests;
13
14use Symfony\Component\Translation\MessageSelector;
15
16class MessageSelectorTest extends \PHPUnit_Framework_TestCase
17{
18 /**
19 * @dataProvider getChooseTests
20 */
21 public function testChoose($expected, $id, $number)
22 {
23 $selector = new MessageSelector();
24
25 $this->assertEquals($expected, $selector->choose($id, $number, 'en'));
26 }
27
28 /**
29 * @expectedException InvalidArgumentException
30 */
31 public function testChooseWhenNoEnoughChoices()
32 {
33 $selector = new MessageSelector();
34
35 $selector->choose('foo', 10, 'en');
36 }
37
38 public function getChooseTests()
39 {
40 return array(
41 array('There is no apples', '{0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples', 0),
42 array('There is no apples', '{0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples', 0),
43 array('There is no apples', '{0}There is no apples|{1} There is one apple|]1,Inf] There is %count% apples', 0),
44
45 array('There is one apple', '{0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples', 1),
46
47 array('There is %count% apples', '{0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples', 10),
48 array('There is %count% apples', '{0} There is no apples|{1} There is one apple|]1,Inf]There is %count% apples', 10),
49 array('There is %count% apples', '{0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples', 10),
50
51 array('There is %count% apples', 'There is one apple|There is %count% apples', 0),
52 array('There is one apple', 'There is one apple|There is %count% apples', 1),
53 array('There is %count% apples', 'There is one apple|There is %count% apples', 10),
54
55 array('There is %count% apples', 'one: There is one apple|more: There is %count% apples', 0),
56 array('There is one apple', 'one: There is one apple|more: There is %count% apples', 1),
57 array('There is %count% apples', 'one: There is one apple|more: There is %count% apples', 10),
58
59 array('There is no apples', '{0} There is no apples|one: There is one apple|more: There is %count% apples', 0),
60 array('There is one apple', '{0} There is no apples|one: There is one apple|more: There is %count% apples', 1),
61 array('There is %count% apples', '{0} There is no apples|one: There is one apple|more: There is %count% apples', 10),
62
63 array('', '{0}|{1} There is one apple|]1,Inf] There is %count% apples', 0),
64 array('', '{0} There is no apples|{1}|]1,Inf] There is %count% apples', 1),
65
66 // Indexed only tests which are Gettext PoFile* compatible strings.
67 array('There are %count% apples', 'There is one apple|There are %count% apples', 0),
68 array('There is one apple', 'There is one apple|There are %count% apples', 1),
69 array('There are %count% apples', 'There is one apple|There are %count% apples', 2),
70
71 // Tests for float numbers
72 array('There is almost one apple', '{0} There is no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7),
73 array('There is one apple', '{0} There is no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1),
74 array('There is more than one apple', '{0} There is no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7),
75 array('There is no apples', '{0} There is no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0),
76 array('There is no apples', '{0} There is no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0),
77 array('There is no apples', '{0.0} There is no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0),
78 );
79 }
80}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.php
new file mode 100644
index 00000000..26f9e2f9
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.php
@@ -0,0 +1,124 @@
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
12namespace Symfony\Component\Translation\Tests;
13
14use Symfony\Component\Translation\PluralizationRules;
15
16/**
17 * Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms
18 * and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms
19 *
20 * See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms.
21 * The mozilla code is also interesting to check for.
22 *
23 * As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199
24 *
25 * The goal to cover all languages is to far fetched so this test case is smaller.
26 *
27 * @author Clemens Tolboom clemens@build2be.nl
28 */
29class PluralizationRulesTest extends \PHPUnit_Framework_TestCase
30{
31
32 /**
33 * We test failed langcode here.
34 *
35 * TODO: The languages mentioned in the data provide need to get fixed somehow within PluralizationRules.
36 *
37 * @dataProvider failingLangcodes
38 */
39 public function testFailedLangcodes($nplural, $langCodes)
40 {
41 $matrix = $this->generateTestData($nplural, $langCodes);
42 $this->validateMatrix($nplural, $matrix, false);
43 }
44
45 /**
46 * @dataProvider successLangcodes
47 */
48 public function testLangcodes($nplural, $langCodes)
49 {
50 $matrix = $this->generateTestData($nplural, $langCodes);
51 $this->validateMatrix($nplural, $matrix);
52 }
53
54 /**
55 * This array should contain all currently known langcodes.
56 *
57 * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete.
58 *
59 * @return type
60 */
61 public function successLangcodes()
62 {
63 return array(
64 array('1' , array('ay','bo', 'cgg','dz','id', 'ja', 'jbo', 'ka','kk','km','ko','ky')),
65 array('2' , array('nl', 'fr', 'en', 'de', 'de_GE')),
66 array('3' , array('be','bs','cs','hr')),
67 array('4' , array('cy','mt', 'sl')),
68 array('5' , array()),
69 array('6' , array('ar')),
70 );
71 }
72
73 /**
74 * This array should be at least empty within the near future.
75 *
76 * This both depends on a complete list trying to add above as understanding
77 * the plural rules of the current failing languages.
78 *
79 * @return array with nplural together with langcodes
80 */
81 public function failingLangcodes()
82 {
83 return array(
84 array('1' , array('fa')),
85 array('2' , array('jbo')),
86 array('3' , array('cbs')),
87 array('4' , array('gd','kw')),
88 array('5' , array('ga')),
89 array('6' , array()),
90 );
91 }
92
93 /**
94 * We validate only on the plural coverage. Thus the real rules is not tested.
95 *
96 * @param string $nplural plural expected
97 * @param array $matrix containing langcodes and their plural index values.
98 * @param boolean $expectSuccess
99 */
100 protected function validateMatrix($nplural, $matrix, $expectSuccess = true)
101 {
102 foreach ($matrix as $langCode => $data) {
103 $indexes = array_flip($data);
104 if ($expectSuccess) {
105 $this->assertEquals($nplural, count($indexes), "Langcode '$langCode' has '$nplural' plural forms.");
106 } else {
107 $this->assertNotEquals((int) $nplural, count($indexes), "Langcode '$langCode' has '$nplural' plural forms.");
108 }
109 }
110 }
111
112 protected function generateTestData($plural, $langCodes)
113 {
114 $matrix = array();
115 foreach ($langCodes as $langCode) {
116 for ($count=0; $count<200; $count++) {
117 $plural = PluralizationRules::get($count, $langCode);
118 $matrix[$langCode][$count] = $plural;
119 }
120 }
121
122 return $matrix;
123 }
124}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/TranslatorTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/TranslatorTest.php
new file mode 100644
index 00000000..fb843d72
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/TranslatorTest.php
@@ -0,0 +1,306 @@
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
12namespace Symfony\Component\Translation\Tests;
13
14use Symfony\Component\Translation\Translator;
15use Symfony\Component\Translation\MessageSelector;
16use Symfony\Component\Translation\Loader\ArrayLoader;
17
18class TranslatorTest extends \PHPUnit_Framework_TestCase
19{
20 public function testSetGetLocale()
21 {
22 $translator = new Translator('en', new MessageSelector());
23
24 $this->assertEquals('en', $translator->getLocale());
25
26 $translator->setLocale('fr');
27 $this->assertEquals('fr', $translator->getLocale());
28 }
29
30 public function testSetFallbackLocales()
31 {
32 $translator = new Translator('en', new MessageSelector());
33 $translator->addLoader('array', new ArrayLoader());
34 $translator->addResource('array', array('foo' => 'foofoo'), 'en');
35 $translator->addResource('array', array('bar' => 'foobar'), 'fr');
36
37 // force catalogue loading
38 $translator->trans('bar');
39
40 $translator->setFallbackLocales(array('fr'));
41 $this->assertEquals('foobar', $translator->trans('bar'));
42 }
43
44 public function testSetFallbackLocalesMultiple()
45 {
46 $translator = new Translator('en', new MessageSelector());
47 $translator->addLoader('array', new ArrayLoader());
48 $translator->addResource('array', array('foo' => 'foo (en)'), 'en');
49 $translator->addResource('array', array('bar' => 'bar (fr)'), 'fr');
50
51 // force catalogue loading
52 $translator->trans('bar');
53
54 $translator->setFallbackLocales(array('fr_FR', 'fr'));
55 $this->assertEquals('bar (fr)', $translator->trans('bar'));
56 }
57
58 public function testTransWithFallbackLocale()
59 {
60 $translator = new Translator('fr_FR', new MessageSelector());
61 $translator->addLoader('array', new ArrayLoader());
62 $translator->addResource('array', array('foo' => 'foofoo'), 'en_US');
63 $translator->addResource('array', array('bar' => 'foobar'), 'en');
64
65 $translator->setFallbackLocales(array('en'));
66
67 $this->assertEquals('foobar', $translator->trans('bar'));
68 }
69
70 public function testAddResourceAfterTrans()
71 {
72 $translator = new Translator('fr', new MessageSelector());
73 $translator->addLoader('array', new ArrayLoader());
74
75 $translator->setFallbackLocale(array('en'));
76
77 $translator->addResource('array', array('foo' => 'foofoo'), 'en');
78 $this->assertEquals('foofoo', $translator->trans('foo'));
79
80 $translator->addResource('array', array('bar' => 'foobar'), 'en');
81 $this->assertEquals('foobar', $translator->trans('bar'));
82 }
83
84 /**
85 * @dataProvider getTransFileTests
86 * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
87 */
88 public function testTransWithoutFallbackLocaleFile($format, $loader)
89 {
90 $loaderClass = 'Symfony\\Component\\Translation\\Loader\\'.$loader;
91 $translator = new Translator('en', new MessageSelector());
92 $translator->addLoader($format, new $loaderClass());
93 $translator->addResource($format, __DIR__.'/fixtures/non-existing', 'en');
94 $translator->addResource($format, __DIR__.'/fixtures/resources.'.$format, 'en');
95
96 // force catalogue loading
97 $translator->trans('foo');
98 }
99
100 /**
101 * @dataProvider getTransFileTests
102 */
103 public function testTransWithFallbackLocaleFile($format, $loader)
104 {
105 $loaderClass = 'Symfony\\Component\\Translation\\Loader\\'.$loader;
106 $translator = new Translator('en_GB', new MessageSelector());
107 $translator->addLoader($format, new $loaderClass());
108 $translator->addResource($format, __DIR__.'/fixtures/non-existing', 'en_GB');
109 $translator->addResource($format, __DIR__.'/fixtures/resources.'.$format, 'en', 'resources');
110
111 $this->assertEquals('bar', $translator->trans('foo', array(), 'resources'));
112 }
113
114 public function testTransWithFallbackLocaleBis()
115 {
116 $translator = new Translator('en_US', new MessageSelector());
117 $translator->addLoader('array', new ArrayLoader());
118 $translator->addResource('array', array('foo' => 'foofoo'), 'en_US');
119 $translator->addResource('array', array('bar' => 'foobar'), 'en');
120 $this->assertEquals('foobar', $translator->trans('bar'));
121 }
122
123 public function testTransWithFallbackLocaleTer()
124 {
125 $translator = new Translator('fr_FR', new MessageSelector());
126 $translator->addLoader('array', new ArrayLoader());
127 $translator->addResource('array', array('foo' => 'foo (en_US)'), 'en_US');
128 $translator->addResource('array', array('bar' => 'bar (en)'), 'en');
129
130 $translator->setFallbackLocales(array('en_US', 'en'));
131
132 $this->assertEquals('foo (en_US)', $translator->trans('foo'));
133 $this->assertEquals('bar (en)', $translator->trans('bar'));
134 }
135
136 public function testTransNonExistentWithFallback()
137 {
138 $translator = new Translator('fr', new MessageSelector());
139 $translator->setFallbackLocales(array('en'));
140 $translator->addLoader('array', new ArrayLoader());
141 $this->assertEquals('non-existent', $translator->trans('non-existent'));
142 }
143
144 /**
145 * @expectedException RuntimeException
146 */
147 public function testWhenAResourceHasNoRegisteredLoader()
148 {
149 $translator = new Translator('en', new MessageSelector());
150 $translator->addResource('array', array('foo' => 'foofoo'), 'en');
151
152 $translator->trans('foo');
153 }
154
155 /**
156 * @dataProvider getTransTests
157 */
158 public function testTrans($expected, $id, $translation, $parameters, $locale, $domain)
159 {
160 $translator = new Translator('en', new MessageSelector());
161 $translator->addLoader('array', new ArrayLoader());
162 $translator->addResource('array', array((string) $id => $translation), $locale, $domain);
163
164 $this->assertEquals($expected, $translator->trans($id, $parameters, $domain, $locale));
165 }
166
167 /**
168 * @dataProvider getFlattenedTransTests
169 */
170 public function testFlattenedTrans($expected, $messages, $id)
171 {
172 $translator = new Translator('en', new MessageSelector());
173 $translator->addLoader('array', new ArrayLoader());
174 $translator->addResource('array', $messages, 'fr', '');
175
176 $this->assertEquals($expected, $translator->trans($id, array(), '', 'fr'));
177 }
178
179 /**
180 * @dataProvider getTransChoiceTests
181 */
182 public function testTransChoice($expected, $id, $translation, $number, $parameters, $locale, $domain)
183 {
184 $translator = new Translator('en', new MessageSelector());
185 $translator->addLoader('array', new ArrayLoader());
186 $translator->addResource('array', array((string) $id => $translation), $locale, $domain);
187
188 $this->assertEquals($expected, $translator->transChoice($id, $number, $parameters, $domain, $locale));
189 }
190
191 public function getTransFileTests()
192 {
193 return array(
194 array('csv', 'CsvFileLoader'),
195 array('ini', 'IniFileLoader'),
196 array('mo', 'MoFileLoader'),
197 array('po', 'PoFileLoader'),
198 array('php', 'PhpFileLoader'),
199 array('ts', 'QtFileLoader'),
200 array('xlf', 'XliffFileLoader'),
201 array('yml', 'YamlFileLoader'),
202 );
203 }
204
205 public function getTransTests()
206 {
207 return array(
208 array('Symfony2 est super !', 'Symfony2 is great!', 'Symfony2 est super !', array(), 'fr', ''),
209 array('Symfony2 est awesome !', 'Symfony2 is %what%!', 'Symfony2 est %what% !', array('%what%' => 'awesome'), 'fr', ''),
210 array('Symfony2 est super !', new String('Symfony2 is great!'), 'Symfony2 est super !', array(), 'fr', ''),
211 );
212 }
213
214 public function getFlattenedTransTests()
215 {
216 $messages = array(
217 'symfony2' => array(
218 'is' => array(
219 'great' => 'Symfony2 est super!'
220 )
221 ),
222 'foo' => array(
223 'bar' => array(
224 'baz' => 'Foo Bar Baz'
225 ),
226 'baz' => 'Foo Baz',
227 ),
228 );
229
230 return array(
231 array('Symfony2 est super!', $messages, 'symfony2.is.great'),
232 array('Foo Bar Baz', $messages, 'foo.bar.baz'),
233 array('Foo Baz', $messages, 'foo.baz'),
234 );
235 }
236
237 public function getTransChoiceTests()
238 {
239 return array(
240 array('Il y a 0 pomme', '{0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 0, array('%count%' => 0), 'fr', ''),
241 array('Il y a 1 pomme', '{0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 1, array('%count%' => 1), 'fr', ''),
242 array('Il y a 10 pommes', '{0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 10, array('%count%' => 10), 'fr', ''),
243
244 array('Il y a 0 pomme', 'There is one apple|There is %count% apples', 'Il y a %count% pomme|Il y a %count% pommes', 0, array('%count%' => 0), 'fr', ''),
245 array('Il y a 1 pomme', 'There is one apple|There is %count% apples', 'Il y a %count% pomme|Il y a %count% pommes', 1, array('%count%' => 1), 'fr', ''),
246 array('Il y a 10 pommes', 'There is one apple|There is %count% apples', 'Il y a %count% pomme|Il y a %count% pommes', 10, array('%count%' => 10), 'fr', ''),
247
248 array('Il y a 0 pomme', 'one: There is one apple|more: There is %count% apples', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 0, array('%count%' => 0), 'fr', ''),
249 array('Il y a 1 pomme', 'one: There is one apple|more: There is %count% apples', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 1, array('%count%' => 1), 'fr', ''),
250 array('Il y a 10 pommes', 'one: There is one apple|more: There is %count% apples', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 10, array('%count%' => 10), 'fr', ''),
251
252 array('Il n\'y a aucune pomme', '{0} There is no apple|one: There is one apple|more: There is %count% apples', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 0, array('%count%' => 0), 'fr', ''),
253 array('Il y a 1 pomme', '{0} There is no apple|one: There is one apple|more: There is %count% apples', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 1, array('%count%' => 1), 'fr', ''),
254 array('Il y a 10 pommes', '{0} There is no apple|one: There is one apple|more: There is %count% apples', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 10, array('%count%' => 10), 'fr', ''),
255
256 array('Il y a 0 pomme', new String('{0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples'), '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 0, array('%count%' => 0), 'fr', ''),
257 );
258 }
259
260 public function testTransChoiceFallback()
261 {
262 $translator = new Translator('ru', new MessageSelector());
263 $translator->setFallbackLocales(array('en'));
264 $translator->addLoader('array', new ArrayLoader());
265 $translator->addResource('array', array('some_message2' => 'one thing|%count% things'), 'en');
266
267 $this->assertEquals('10 things', $translator->transChoice('some_message2', 10, array('%count%' => 10)));
268 }
269
270 public function testTransChoiceFallbackBis()
271 {
272 $translator = new Translator('ru', new MessageSelector());
273 $translator->setFallbackLocales(array('en_US', 'en'));
274 $translator->addLoader('array', new ArrayLoader());
275 $translator->addResource('array', array('some_message2' => 'one thing|%count% things'), 'en_US');
276
277 $this->assertEquals('10 things', $translator->transChoice('some_message2', 10, array('%count%' => 10)));
278 }
279
280 /**
281 * @expectedException \InvalidArgumentException
282 */
283 public function testTransChoiceFallbackWithNoTranslation()
284 {
285 $translator = new Translator('ru', new MessageSelector());
286 $translator->setFallbackLocales(array('en'));
287 $translator->addLoader('array', new ArrayLoader());
288
289 $this->assertEquals('10 things', $translator->transChoice('some_message2', 10, array('%count%' => 10)));
290 }
291}
292
293class String
294{
295 protected $str;
296
297 public function __construct($str)
298 {
299 $this->str = $str;
300 }
301
302 public function __toString()
303 {
304 return $this->str;
305 }
306}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty-translation.po b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty-translation.po
new file mode 100644
index 00000000..ff6f22af
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty-translation.po
@@ -0,0 +1,3 @@
1msgid "foo"
2msgstr ""
3
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.csv b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.csv
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.csv
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.ini b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.ini
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.ini
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.mo b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.mo
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.mo
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.po b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.po
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.po
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.yml b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.yml
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/empty.yml
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/encoding.xlf b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/encoding.xlf
new file mode 100644
index 00000000..6be901bd
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/encoding.xlf
@@ -0,0 +1,15 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
3 <file source-language="en" datatype="plaintext" original="file.ext">
4 <body>
5 <trans-unit id="1" resname="foo">
6 <source>foo</source>
7 <target>bär</target>
8 </trans-unit>
9 <trans-unit id="2" resname="bar">
10 <source>bar</source>
11 <target>föö</target>
12 </trans-unit>
13 </body>
14 </file>
15</xliff>
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/invalid-xml-resources.xlf b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/invalid-xml-resources.xlf
new file mode 100644
index 00000000..7bf6c98b
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/invalid-xml-resources.xlf
@@ -0,0 +1,23 @@
1<?xml version="1.0" encoding="utf-8"?>
2<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
3 <file source-language="en" datatype="plaintext" original="file.ext">
4 <body>
5 <trans-unit id="1">
6 <source>foo</source>
7 <target>bar
8 </trans-unit>
9 <trans-unit id="2">
10 <source>extra</source>
11 </trans-unit>
12 <trans-unit id="3">
13 <source>key</source>
14 <target></target>
15 </trans-unit>
16 <trans-unit id="4">
17 <source>test</source>
18 <target>with</target>
19 <note>note</note>
20 </trans-unit>
21 </body>
22 </file>
23</xliff>
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/non-valid.xlf b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/non-valid.xlf
new file mode 100644
index 00000000..734fc97e
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/non-valid.xlf
@@ -0,0 +1,11 @@
1<?xml version="1.0"?>
2<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
3 <file source-language="en" datatype="plaintext" original="file.ext">
4 <body>
5 <trans-unit>
6 <source>foo</source>
7 <target>bar</target>
8 </trans-unit>
9 </body>
10 </file>
11</xliff>
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/non-valid.yml b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/non-valid.yml
new file mode 100644
index 00000000..257cc564
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/non-valid.yml
@@ -0,0 +1 @@
foo
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/plurals.mo b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/plurals.mo
new file mode 100644
index 00000000..6445e77b
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/plurals.mo
Binary files differ
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/plurals.po b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/plurals.po
new file mode 100644
index 00000000..439c41ad
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/plurals.po
@@ -0,0 +1,5 @@
1msgid "foo"
2msgid_plural "foos"
3msgstr[0] "bar"
4msgstr[1] "bars"
5
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resname.xlf b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resname.xlf
new file mode 100644
index 00000000..2df16af9
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resname.xlf
@@ -0,0 +1,19 @@
1<?xml version="1.0" encoding="utf-8"?>
2<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
3 <file source-language="en" datatype="plaintext" original="file.ext">
4 <body>
5 <trans-unit id="1" resname="foo">
6 <source></source>
7 <target>bar</target>
8 </trans-unit>
9 <trans-unit id="2" resname="bar">
10 <source>bar source</source>
11 <target>baz</target>
12 </trans-unit>
13 <trans-unit id="3">
14 <source>baz</source>
15 <target>foo</target>
16 </trans-unit>
17 </body>
18 </file>
19</xliff>
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted/resources.dat b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted/resources.dat
new file mode 100644
index 00000000..391250ca
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted/resources.dat
@@ -0,0 +1 @@
XXX \ No newline at end of file
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.res b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.res
new file mode 100644
index 00000000..1fc1436d
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.res
Binary files differ
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.txt b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.txt
new file mode 100644
index 00000000..c04a4e85
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.txt
@@ -0,0 +1,3 @@
1en{
2 symfony{"Symfony 2 is great"}
3} \ No newline at end of file
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.res b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.res
new file mode 100644
index 00000000..f5841609
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.res
Binary files differ
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.txt b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.txt
new file mode 100644
index 00000000..7e84f67a
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.txt
@@ -0,0 +1,3 @@
1fr{
2 symfony{"Symfony 2 est génial"}
3} \ No newline at end of file
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/packagelist.txt b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/packagelist.txt
new file mode 100644
index 00000000..c5783ed4
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/packagelist.txt
@@ -0,0 +1,2 @@
1en.res
2fr.res
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/resources.dat b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/resources.dat
new file mode 100644
index 00000000..563b0eae
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/resources.dat
Binary files differ
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/res/en.res b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/res/en.res
new file mode 100644
index 00000000..ad894a92
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/res/en.res
Binary files differ
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources-clean.xlf b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources-clean.xlf
new file mode 100644
index 00000000..464b0792
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources-clean.xlf
@@ -0,0 +1,15 @@
1<?xml version="1.0" encoding="utf-8"?>
2<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
3 <file source-language="en" datatype="plaintext" original="file.ext">
4 <body>
5 <trans-unit id="acbd18db4cc2f85cedef654fccc4a4d8" resname="foo">
6 <source>foo</source>
7 <target>bar</target>
8 </trans-unit>
9 <trans-unit id="3c6e0b8a9c15224a8228b9a98ca1531d" resname="key">
10 <source>key</source>
11 <target></target>
12 </trans-unit>
13 </body>
14 </file>
15</xliff>
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.csv b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.csv
new file mode 100644
index 00000000..374b9eb5
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.csv
@@ -0,0 +1,4 @@
1"foo"; "bar"
2#"bar"; "foo"
3"incorrect"; "number"; "columns"; "will"; "be"; "ignored"
4"incorrect" \ No newline at end of file
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.ini b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.ini
new file mode 100644
index 00000000..4953062e
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.ini
@@ -0,0 +1 @@
foo="bar"
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.mo b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.mo
new file mode 100644
index 00000000..0a966025
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.mo
Binary files differ
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.php
new file mode 100644
index 00000000..c2913985
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.php
@@ -0,0 +1,5 @@
1<?php
2
3return array (
4 'foo' => 'bar',
5);
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.po b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.po
new file mode 100644
index 00000000..da0d5f46
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.po
@@ -0,0 +1,2 @@
1msgid "foo"
2msgstr "bar" \ No newline at end of file
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.ts b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.ts
new file mode 100644
index 00000000..40e18522
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.ts
@@ -0,0 +1,10 @@
1<?xml version="1.0" encoding="utf-8"?>
2<TS>
3 <context>
4 <name>resources</name>
5 <message>
6 <source>foo</source>
7 <translation>bar</translation>
8 </message>
9 </context>
10</TS>
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.xlf b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.xlf
new file mode 100644
index 00000000..b0e59880
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.xlf
@@ -0,0 +1,23 @@
1<?xml version="1.0" encoding="utf-8"?>
2<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
3 <file source-language="en" datatype="plaintext" original="file.ext">
4 <body>
5 <trans-unit id="1">
6 <source>foo</source>
7 <target>bar</target>
8 </trans-unit>
9 <trans-unit id="2">
10 <source>extra</source>
11 </trans-unit>
12 <trans-unit id="3">
13 <source>key</source>
14 <target></target>
15 </trans-unit>
16 <trans-unit id="4">
17 <source>test</source>
18 <target>with</target>
19 <note>note</note>
20 </trans-unit>
21 </body>
22 </file>
23</xliff>
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.yml b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.yml
new file mode 100644
index 00000000..20e9ff3f
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/resources.yml
@@ -0,0 +1 @@
foo: bar
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/valid.csv b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/valid.csv
new file mode 100644
index 00000000..59882e5d
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/valid.csv
@@ -0,0 +1,4 @@
1foo;bar
2bar;"foo
3foo"
4"foo;foo";bar
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/withdoctype.xlf b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/withdoctype.xlf
new file mode 100644
index 00000000..f83e834d
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/fixtures/withdoctype.xlf
@@ -0,0 +1,12 @@
1<?xml version="1.0"?>
2<!DOCTYPE foo>
3<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
4 <file source-language="en" datatype="plaintext" original="file.ext">
5 <body>
6 <trans-unit id="1">
7 <source>foo</source>
8 <target>bar</target>
9 </trans-unit>
10 </body>
11 </file>
12</xliff>
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Translator.php b/vendor/symfony/translation/Symfony/Component/Translation/Translator.php
new file mode 100644
index 00000000..8e74b79f
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Translator.php
@@ -0,0 +1,282 @@
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
12namespace Symfony\Component\Translation;
13
14use Symfony\Component\Translation\Loader\LoaderInterface;
15use Symfony\Component\Translation\Exception\NotFoundResourceException;
16
17/**
18 * Translator.
19 *
20 * @author Fabien Potencier <fabien@symfony.com>
21 *
22 * @api
23 */
24class Translator implements TranslatorInterface
25{
26 /**
27 * @var MessageCatalogueInterface[]
28 */
29 protected $catalogues = array();
30
31 /**
32 * @var string
33 */
34 protected $locale;
35
36 /**
37 * @var array
38 */
39 private $fallbackLocales = array();
40
41 /**
42 * @var LoaderInterface[]
43 */
44 private $loaders = array();
45
46 /**
47 * @var array
48 */
49 private $resources = array();
50
51 /**
52 * @var MessageSelector
53 */
54 private $selector;
55
56 /**
57 * Constructor.
58 *
59 * @param string $locale The locale
60 * @param MessageSelector|null $selector The message selector for pluralization
61 *
62 * @api
63 */
64 public function __construct($locale, MessageSelector $selector = null)
65 {
66 $this->locale = $locale;
67 $this->selector = $selector ?: new MessageSelector();
68 }
69
70 /**
71 * Adds a Loader.
72 *
73 * @param string $format The name of the loader (@see addResource())
74 * @param LoaderInterface $loader A LoaderInterface instance
75 *
76 * @api
77 */
78 public function addLoader($format, LoaderInterface $loader)
79 {
80 $this->loaders[$format] = $loader;
81 }
82
83 /**
84 * Adds a Resource.
85 *
86 * @param string $format The name of the loader (@see addLoader())
87 * @param mixed $resource The resource name
88 * @param string $locale The locale
89 * @param string $domain The domain
90 *
91 * @api
92 */
93 public function addResource($format, $resource, $locale, $domain = null)
94 {
95 if (null === $domain) {
96 $domain = 'messages';
97 }
98
99 $this->resources[$locale][] = array($format, $resource, $domain);
100
101 if (in_array($locale, $this->fallbackLocales)) {
102 $this->catalogues = array();
103 } else {
104 unset($this->catalogues[$locale]);
105 }
106 }
107
108 /**
109 * {@inheritdoc}
110 *
111 * @api
112 */
113 public function setLocale($locale)
114 {
115 $this->locale = $locale;
116 }
117
118 /**
119 * {@inheritdoc}
120 *
121 * @api
122 */
123 public function getLocale()
124 {
125 return $this->locale;
126 }
127
128 /**
129 * Sets the fallback locale(s).
130 *
131 * @param string|array $locales The fallback locale(s)
132 *
133 * @deprecated since 2.3, to be removed in 3.0. Use setFallbackLocales() instead.
134 *
135 * @api
136 */
137 public function setFallbackLocale($locales)
138 {
139 $this->setFallbackLocales(is_array($locales) ? $locales : array($locales));
140 }
141
142 /**
143 * Sets the fallback locales.
144 *
145 * @param array $locales The fallback locales
146 *
147 * @api
148 */
149 public function setFallbackLocales(array $locales)
150 {
151 // needed as the fallback locales are linked to the already loaded catalogues
152 $this->catalogues = array();
153
154 $this->fallbackLocales = $locales;
155 }
156
157 /**
158 * Gets the fallback locales.
159 *
160 * @return array $locales The fallback locales
161 *
162 * @api
163 */
164 public function getFallbackLocales()
165 {
166 return $this->fallbackLocales;
167 }
168
169 /**
170 * {@inheritdoc}
171 *
172 * @api
173 */
174 public function trans($id, array $parameters = array(), $domain = null, $locale = null)
175 {
176 if (null === $locale) {
177 $locale = $this->getLocale();
178 }
179
180 if (null === $domain) {
181 $domain = 'messages';
182 }
183
184 if (!isset($this->catalogues[$locale])) {
185 $this->loadCatalogue($locale);
186 }
187
188 return strtr($this->catalogues[$locale]->get((string) $id, $domain), $parameters);
189 }
190
191 /**
192 * {@inheritdoc}
193 *
194 * @api
195 */
196 public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
197 {
198 if (null === $locale) {
199 $locale = $this->getLocale();
200 }
201
202 if (null === $domain) {
203 $domain = 'messages';
204 }
205
206 if (!isset($this->catalogues[$locale])) {
207 $this->loadCatalogue($locale);
208 }
209
210 $id = (string) $id;
211
212 $catalogue = $this->catalogues[$locale];
213 while (!$catalogue->defines($id, $domain)) {
214 if ($cat = $catalogue->getFallbackCatalogue()) {
215 $catalogue = $cat;
216 $locale = $catalogue->getLocale();
217 } else {
218 break;
219 }
220 }
221
222 return strtr($this->selector->choose($catalogue->get($id, $domain), (int) $number, $locale), $parameters);
223 }
224
225 protected function loadCatalogue($locale)
226 {
227 try {
228 $this->doLoadCatalogue($locale);
229 } catch (NotFoundResourceException $e) {
230 if (!$this->computeFallbackLocales($locale)) {
231 throw $e;
232 }
233 }
234 $this->loadFallbackCatalogues($locale);
235 }
236
237 private function doLoadCatalogue($locale)
238 {
239 $this->catalogues[$locale] = new MessageCatalogue($locale);
240
241 if (isset($this->resources[$locale])) {
242 foreach ($this->resources[$locale] as $resource) {
243 if (!isset($this->loaders[$resource[0]])) {
244 throw new \RuntimeException(sprintf('The "%s" translation loader is not registered.', $resource[0]));
245 }
246 $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2]));
247 }
248 }
249 }
250
251 private function loadFallbackCatalogues($locale)
252 {
253 $current = $this->catalogues[$locale];
254
255 foreach ($this->computeFallbackLocales($locale) as $fallback) {
256 if (!isset($this->catalogues[$fallback])) {
257 $this->doLoadCatalogue($fallback);
258 }
259
260 $current->addFallbackCatalogue($this->catalogues[$fallback]);
261 $current = $this->catalogues[$fallback];
262 }
263 }
264
265 protected function computeFallbackLocales($locale)
266 {
267 $locales = array();
268 foreach ($this->fallbackLocales as $fallback) {
269 if ($fallback === $locale) {
270 continue;
271 }
272
273 $locales[] = $fallback;
274 }
275
276 if (strrchr($locale, '_') !== false) {
277 array_unshift($locales, substr($locale, 0, -strlen(strrchr($locale, '_'))));
278 }
279
280 return array_unique($locales);
281 }
282}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/TranslatorInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/TranslatorInterface.php
new file mode 100644
index 00000000..3dcdd4fc
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/TranslatorInterface.php
@@ -0,0 +1,69 @@
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
12namespace Symfony\Component\Translation;
13
14/**
15 * TranslatorInterface.
16 *
17 * @author Fabien Potencier <fabien@symfony.com>
18 *
19 * @api
20 */
21interface TranslatorInterface
22{
23 /**
24 * Translates the given message.
25 *
26 * @param string $id The message id (may also be an object that can be cast to string)
27 * @param array $parameters An array of parameters for the message
28 * @param string $domain The domain for the message
29 * @param string $locale The locale
30 *
31 * @return string The translated string
32 *
33 * @api
34 */
35 public function trans($id, array $parameters = array(), $domain = null, $locale = null);
36
37 /**
38 * Translates the given choice message by choosing a translation according to a number.
39 *
40 * @param string $id The message id (may also be an object that can be cast to string)
41 * @param integer $number The number to use to find the indice of the message
42 * @param array $parameters An array of parameters for the message
43 * @param string $domain The domain for the message
44 * @param string $locale The locale
45 *
46 * @return string The translated string
47 *
48 * @api
49 */
50 public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null);
51
52 /**
53 * Sets the current locale.
54 *
55 * @param string $locale The locale
56 *
57 * @api
58 */
59 public function setLocale($locale);
60
61 /**
62 * Returns the current locale.
63 *
64 * @return string The locale
65 *
66 * @api
67 */
68 public function getLocale();
69}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Writer/TranslationWriter.php b/vendor/symfony/translation/Symfony/Component/Translation/Writer/TranslationWriter.php
new file mode 100644
index 00000000..9d70c12f
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/Writer/TranslationWriter.php
@@ -0,0 +1,73 @@
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
12namespace Symfony\Component\Translation\Writer;
13
14use Symfony\Component\Translation\MessageCatalogue;
15use Symfony\Component\Translation\Dumper\DumperInterface;
16
17/**
18 * TranslationWriter writes translation messages.
19 *
20 * @author Michel Salib <michelsalib@hotmail.com>
21 */
22class TranslationWriter
23{
24 /**
25 * Dumpers used for export.
26 *
27 * @var array
28 */
29 private $dumpers = array();
30
31 /**
32 * Adds a dumper to the writer.
33 *
34 * @param string $format The format of the dumper
35 * @param DumperInterface $dumper The dumper
36 */
37 public function addDumper($format, DumperInterface $dumper)
38 {
39 $this->dumpers[$format] = $dumper;
40 }
41
42 /**
43 * Obtains the list of supported formats.
44 *
45 * @return array
46 */
47 public function getFormats()
48 {
49 return array_keys($this->dumpers);
50 }
51
52 /**
53 * Writes translation from the catalogue according to the selected format.
54 *
55 * @param MessageCatalogue $catalogue The message catalogue to dump
56 * @param string $format The format to use to dump the messages
57 * @param array $options Options that are passed to the dumper
58 *
59 * @throws \InvalidArgumentException
60 */
61 public function writeTranslations(MessageCatalogue $catalogue, $format, $options = array())
62 {
63 if (!isset($this->dumpers[$format])) {
64 throw new \InvalidArgumentException(sprintf('There is no dumper associated with format "%s".', $format));
65 }
66
67 // get the right dumper
68 $dumper = $this->dumpers[$format];
69
70 // save
71 $dumper->dump($catalogue, $options);
72 }
73}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/composer.json b/vendor/symfony/translation/Symfony/Component/Translation/composer.json
new file mode 100644
index 00000000..96a8e662
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/composer.json
@@ -0,0 +1,39 @@
1{
2 "name": "symfony/translation",
3 "type": "library",
4 "description": "Symfony Translation Component",
5 "keywords": [],
6 "homepage": "http://symfony.com",
7 "license": "MIT",
8 "authors": [
9 {
10 "name": "Fabien Potencier",
11 "email": "fabien@symfony.com"
12 },
13 {
14 "name": "Symfony Community",
15 "homepage": "http://symfony.com/contributors"
16 }
17 ],
18 "require": {
19 "php": ">=5.3.3"
20 },
21 "require-dev": {
22 "symfony/config": "~2.0",
23 "symfony/yaml": "~2.2"
24 },
25 "suggest": {
26 "symfony/config": "",
27 "symfony/yaml": ""
28 },
29 "autoload": {
30 "psr-0": { "Symfony\\Component\\Translation\\": "" }
31 },
32 "target-dir": "Symfony/Component/Translation",
33 "minimum-stability": "dev",
34 "extra": {
35 "branch-alias": {
36 "dev-master": "2.3-dev"
37 }
38 }
39}
diff --git a/vendor/symfony/translation/Symfony/Component/Translation/phpunit.xml.dist b/vendor/symfony/translation/Symfony/Component/Translation/phpunit.xml.dist
new file mode 100644
index 00000000..1b37f214
--- /dev/null
+++ b/vendor/symfony/translation/Symfony/Component/Translation/phpunit.xml.dist
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="UTF-8"?>
2
3<phpunit backupGlobals="false"
4 backupStaticAttributes="false"
5 colors="true"
6 convertErrorsToExceptions="true"
7 convertNoticesToExceptions="true"
8 convertWarningsToExceptions="true"
9 processIsolation="false"
10 stopOnFailure="false"
11 syntaxCheck="false"
12 bootstrap="vendor/autoload.php"
13>
14 <testsuites>
15 <testsuite name="Symfony Translation Component Test Suite">
16 <directory>./Tests/</directory>
17 </testsuite>
18 </testsuites>
19
20 <filter>
21 <whitelist>
22 <directory>./</directory>
23 <exclude>
24 <directory>./vendor</directory>
25 <directory>./Tests</directory>
26 </exclude>
27 </whitelist>
28 </filter>
29</phpunit>