From ac5d01f0b51945b243dbd1b0f7ee9b80d286d673 Mon Sep 17 00:00:00 2001 From: Ryan Rogers Date: Tue, 20 Feb 2018 09:46:36 -0800 Subject: [PATCH] [Translation] Process multiple segments within a single unit. --- .../Translation/Loader/XliffFileLoader.php | 49 ++++++++++--------- .../Tests/Loader/XliffFileLoaderTest.php | 29 +++++++++++ .../resources-2.0-multi-segment-unit.xlf | 17 +++++++ 3 files changed, 71 insertions(+), 24 deletions(-) create mode 100644 src/Symfony/Component/Translation/Tests/fixtures/resources-2.0-multi-segment-unit.xlf diff --git a/src/Symfony/Component/Translation/Loader/XliffFileLoader.php b/src/Symfony/Component/Translation/Loader/XliffFileLoader.php index 8e4e5a787b..136685ba26 100644 --- a/src/Symfony/Component/Translation/Loader/XliffFileLoader.php +++ b/src/Symfony/Component/Translation/Loader/XliffFileLoader.php @@ -128,36 +128,37 @@ class XliffFileLoader implements LoaderInterface $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0'); foreach ($xml->xpath('//xliff:unit') as $unit) { - $segment = $unit->segment; - $source = $segment->source; + foreach ($unit->segment as $segment) { + $source = $segment->source; - // If the xlf file has another encoding specified, try to convert it because - // simple_xml will always return utf-8 encoded values - $target = $this->utf8ToCharset((string) (isset($segment->target) ? $segment->target : $source), $encoding); + // If the xlf file has another encoding specified, try to convert it because + // simple_xml will always return utf-8 encoded values + $target = $this->utf8ToCharset((string) (isset($segment->target) ? $segment->target : $source), $encoding); - $catalogue->set((string) $source, $target, $domain); + $catalogue->set((string) $source, $target, $domain); - $metadata = array(); - if (isset($segment->target) && $segment->target->attributes()) { - $metadata['target-attributes'] = array(); - foreach ($segment->target->attributes() as $key => $value) { - $metadata['target-attributes'][$key] = (string) $value; - } - } - - 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; + $metadata = array(); + if (isset($segment->target) && $segment->target->attributes()) { + $metadata['target-attributes'] = array(); + foreach ($segment->target->attributes() as $key => $value) { + $metadata['target-attributes'][$key] = (string) $value; } - $note['content'] = (string) $noteNode; - $metadata['notes'][] = $note; } - } - $catalogue->setMetadata((string) $source, $metadata, $domain); + 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/Loader/XliffFileLoaderTest.php b/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php index a06b7c0990..a8182895e0 100644 --- a/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php +++ b/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php @@ -228,4 +228,33 @@ class XliffFileLoaderTest extends TestCase $this->assertEquals('quality', $metadata['notes'][1]['category']); $this->assertEquals('Fuzzy', $metadata['notes'][1]['content']); } + + public function testLoadVersion2WithMultiSegmentUnit() + { + $loader = new XliffFileLoader(); + $resource = __DIR__.'/../fixtures/resources-2.0-multi-segment-unit.xlf'; + $catalog = $loader->load($resource, 'en', 'domain1'); + + $this->assertSame('en', $catalog->getLocale()); + $this->assertEquals(array(new FileResource($resource)), $catalog->getResources()); + $this->assertFalse(libxml_get_last_error()); + + // test for "foo" metadata + $this->assertTrue($catalog->defines('foo', 'domain1')); + $metadata = $catalog->getMetadata('foo', 'domain1'); + $this->assertNotEmpty($metadata); + $this->assertCount(1, $metadata['notes']); + + $this->assertSame('processed', $metadata['notes'][0]['category']); + $this->assertSame('true', $metadata['notes'][0]['content']); + + // test for "bar" metadata + $this->assertTrue($catalog->defines('bar', 'domain1')); + $metadata = $catalog->getMetadata('bar', 'domain1'); + $this->assertNotEmpty($metadata); + $this->assertCount(1, $metadata['notes']); + + $this->assertSame('processed', $metadata['notes'][0]['category']); + $this->assertSame('true', $metadata['notes'][0]['content']); + } } diff --git a/src/Symfony/Component/Translation/Tests/fixtures/resources-2.0-multi-segment-unit.xlf b/src/Symfony/Component/Translation/Tests/fixtures/resources-2.0-multi-segment-unit.xlf new file mode 100644 index 0000000000..d0dc2a8afe --- /dev/null +++ b/src/Symfony/Component/Translation/Tests/fixtures/resources-2.0-multi-segment-unit.xlf @@ -0,0 +1,17 @@ + + + + + true + + + foo + foo (translated) + + + bar + bar (translated) + + + +