From b0cdb53d67035d95875018c7aeab2c158a6b8308 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Sat, 19 Aug 2017 14:09:44 +0200 Subject: [PATCH] [Translation] Adding the ability do load in xliff2.0 --- .../Component/Translation/CHANGELOG.md | 1 + .../Translation/Loader/XliffFileLoader.php | 15 ++++++- .../Tests/Dumper/XliffFileDumperTest.php | 5 +++ .../Tests/Loader/XliffFileLoaderTest.php | 40 +++++++++++++++++++ .../Tests/fixtures/resources-notes-meta.xlf | 10 +++++ 5 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Translation/CHANGELOG.md b/src/Symfony/Component/Translation/CHANGELOG.md index c973ea2a69ef..3a7814015327 100644 --- a/src/Symfony/Component/Translation/CHANGELOG.md +++ b/src/Symfony/Component/Translation/CHANGELOG.md @@ -8,6 +8,7 @@ CHANGELOG * Added `TranslationExtractorPass` * Added `TranslatorPass` * Added section to the Xliff 2.0 dumper. + * Improved Xliff 2.0 loader to load section. * Added `TranslationWriterInterface` * Deprecated `TranslationWriter::writeTranslations` in favor of `TranslationWriter::write` diff --git a/src/Symfony/Component/Translation/Loader/XliffFileLoader.php b/src/Symfony/Component/Translation/Loader/XliffFileLoader.php index 1603dc0b04fd..72f7216729c1 100644 --- a/src/Symfony/Component/Translation/Loader/XliffFileLoader.php +++ b/src/Symfony/Component/Translation/Loader/XliffFileLoader.php @@ -127,7 +127,8 @@ private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, $ $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0'); - foreach ($xml->xpath('//xliff:unit/xliff:segment') as $segment) { + foreach ($xml->xpath('//xliff:unit') as $unit) { + $segment = $unit->segment; $source = $segment->source; // If the xlf file has another encoding specified, try to convert it because @@ -144,6 +145,18 @@ private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, $ } } + if (isset($unit->notes)) { + $metadata['notes'] = array(); + foreach ($unit->notes->note as $noteNode) { + $note = array(); + foreach ($noteNode->attributes() as $key => $value) { + $note[$key] = (string) $value; + } + $note['content'] = (string) $noteNode; + $metadata['notes'][] = $note; + } + } + $catalogue->setMetadata((string) $source, $metadata, $domain); } } diff --git a/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php b/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php index 30ca4d3d2486..738d4b3b2f1e 100644 --- a/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php +++ b/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php @@ -93,12 +93,17 @@ public function testFormatCatalogueWithNotesMetadata() $catalogue = new MessageCatalogue('en_US'); $catalogue->add(array( 'foo' => 'bar', + 'baz' => 'biz', )); $catalogue->setMetadata('foo', array('notes' => array( array('category' => 'state', 'content' => 'new'), array('category' => 'approved', 'content' => 'true'), array('category' => 'section', 'content' => 'user login', 'priority' => '1'), ))); + $catalogue->setMetadata('baz', array('notes' => array( + array('id' => 'x', 'content' => 'x_content'), + array('appliesTo' => 'target', 'category' => 'quality', 'content' => 'Fuzzy'), + ))); $dumper = new XliffFileDumper(); diff --git a/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php b/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php index 32351d34e192..a06b7c099076 100644 --- a/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php +++ b/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php @@ -188,4 +188,44 @@ public function testLoadVersion2() // target attributes $this->assertEquals(array('target-attributes' => array('order' => 1)), $catalogue->getMetadata('bar', 'domain1')); } + + public function testLoadVersion2WithNoteMeta() + { + $loader = new XliffFileLoader(); + $resource = __DIR__.'/../fixtures/resources-notes-meta.xlf'; + $catalogue = $loader->load($resource, 'en', 'domain1'); + + $this->assertEquals('en', $catalogue->getLocale()); + $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources()); + $this->assertSame(array(), libxml_get_errors()); + + // test for "foo" metadata + $this->assertTrue($catalogue->defines('foo', 'domain1')); + $metadata = $catalogue->getMetadata('foo', 'domain1'); + $this->assertNotEmpty($metadata); + $this->assertCount(3, $metadata['notes']); + + $this->assertEquals('state', $metadata['notes'][0]['category']); + $this->assertEquals('new', $metadata['notes'][0]['content']); + + $this->assertEquals('approved', $metadata['notes'][1]['category']); + $this->assertEquals('true', $metadata['notes'][1]['content']); + + $this->assertEquals('section', $metadata['notes'][2]['category']); + $this->assertEquals('1', $metadata['notes'][2]['priority']); + $this->assertEquals('user login', $metadata['notes'][2]['content']); + + // test for "baz" metadata + $this->assertTrue($catalogue->defines('baz', 'domain1')); + $metadata = $catalogue->getMetadata('baz', 'domain1'); + $this->assertNotEmpty($metadata); + $this->assertCount(2, $metadata['notes']); + + $this->assertEquals('x', $metadata['notes'][0]['id']); + $this->assertEquals('x_content', $metadata['notes'][0]['content']); + + $this->assertEquals('target', $metadata['notes'][1]['appliesTo']); + $this->assertEquals('quality', $metadata['notes'][1]['category']); + $this->assertEquals('Fuzzy', $metadata['notes'][1]['content']); + } } diff --git a/src/Symfony/Component/Translation/Tests/fixtures/resources-notes-meta.xlf b/src/Symfony/Component/Translation/Tests/fixtures/resources-notes-meta.xlf index 04f9a0a06e23..e9995fa8474c 100644 --- a/src/Symfony/Component/Translation/Tests/fixtures/resources-notes-meta.xlf +++ b/src/Symfony/Component/Translation/Tests/fixtures/resources-notes-meta.xlf @@ -12,5 +12,15 @@ bar + + + x_content + Fuzzy + + + baz + biz + +