diff --git a/src/Symfony/Component/Translation/CHANGELOG.md b/src/Symfony/Component/Translation/CHANGELOG.md index 332bf8a31fef4..0d9382a216ff5 100644 --- a/src/Symfony/Component/Translation/CHANGELOG.md +++ b/src/Symfony/Component/Translation/CHANGELOG.md @@ -7,6 +7,8 @@ CHANGELOG * Make `ProviderFactoryTestCase` and `ProviderTestCase` compatible with PHPUnit 10+ * Add `lint:translations` command * Deprecate passing an escape character to `CsvFileLoader::setCsvControl()` + * Make Xliff 2.0 attributes in segment element available as `segment-attributes` + metadata returned by `XliffFileLoader` and make `XliffFileDumper` write them to the file 7.1 --- diff --git a/src/Symfony/Component/Translation/Dumper/XliffFileDumper.php b/src/Symfony/Component/Translation/Dumper/XliffFileDumper.php index 23564223b8a93..b41394c193789 100644 --- a/src/Symfony/Component/Translation/Dumper/XliffFileDumper.php +++ b/src/Symfony/Component/Translation/Dumper/XliffFileDumper.php @@ -193,6 +193,12 @@ private function dumpXliff2(string $defaultLocale, MessageCatalogue $messages, ? $segment = $translation->appendChild($dom->createElement('segment')); + if ($this->hasMetadataArrayInfo('segment-attributes', $metadata)) { + foreach ($metadata['segment-attributes'] as $name => $value) { + $segment->setAttribute($name, $value); + } + } + $s = $segment->appendChild($dom->createElement('source')); $s->appendChild($dom->createTextNode($source)); diff --git a/src/Symfony/Component/Translation/Loader/XliffFileLoader.php b/src/Symfony/Component/Translation/Loader/XliffFileLoader.php index 3a21ac6aedfa1..e76245dac49fa 100644 --- a/src/Symfony/Component/Translation/Loader/XliffFileLoader.php +++ b/src/Symfony/Component/Translation/Loader/XliffFileLoader.php @@ -172,6 +172,13 @@ private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, s $catalogue->set((string) $source, $target, $domain); $metadata = []; + if ($segment->attributes()) { + $metadata['segment-attributes'] = []; + foreach ($segment->attributes() as $key => $value) { + $metadata['segment-attributes'][$key] = (string) $value; + } + } + if (isset($segment->target) && $segment->target->attributes()) { $metadata['target-attributes'] = []; foreach ($segment->target->attributes() as $key => $value) { diff --git a/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php b/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php index f9ae8986f52fe..73e6681716def 100644 --- a/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php +++ b/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php @@ -147,4 +147,22 @@ public function testDumpCatalogueWithXliffExtension() $dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'fr_FR']) ); } + + public function testFormatCatalogueXliff2WithSegmentAttributes() + { + $catalogue = new MessageCatalogue('en_US'); + $catalogue->add([ + 'foo' => 'bar', + 'key' => '', + ]); + $catalogue->setMetadata('foo', ['segment-attributes' => ['state' => 'translated']]); + $catalogue->setMetadata('key', ['segment-attributes' => ['state' => 'translated', 'subState' => 'My Value']]); + + $dumper = new XliffFileDumper(); + + $this->assertStringEqualsFile( + __DIR__.'/../Fixtures/resources-2.0-segment-attributes.xlf', + $dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'fr_FR', 'xliff_version' => '2.0']) + ); + } } diff --git a/src/Symfony/Component/Translation/Tests/Fixtures/resources-2.0-segment-attributes.xlf b/src/Symfony/Component/Translation/Tests/Fixtures/resources-2.0-segment-attributes.xlf new file mode 100644 index 0000000000000..0db7df5c8b703 --- /dev/null +++ b/src/Symfony/Component/Translation/Tests/Fixtures/resources-2.0-segment-attributes.xlf @@ -0,0 +1,17 @@ + + + + + + foo + bar + + + + + key + + + + + diff --git a/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php b/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php index bc0e76a48b181..af20f9e7a5e1e 100644 --- a/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php +++ b/src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php @@ -362,4 +362,29 @@ public function testLoadVersion2WithName() $this->assertEquals(['foo' => 'bar', 'bar' => 'baz', 'baz' => 'foo', 'qux' => 'qux source'], $catalogue->all('domain1')); } + + public function testLoadVersion2WithSegmentAttributes() + { + $loader = new XliffFileLoader(); + $resource = __DIR__.'/../Fixtures/resources-2.0-segment-attributes.xlf'; + $catalogue = $loader->load($resource, 'en', 'domain1'); + + // test for "foo" metadata + $this->assertTrue($catalogue->defines('foo', 'domain1')); + $metadata = $catalogue->getMetadata('foo', 'domain1'); + $this->assertNotEmpty($metadata); + $this->assertCount(1, $metadata['segment-attributes']); + $this->assertArrayHasKey('state', $metadata['segment-attributes']); + $this->assertSame('translated', $metadata['segment-attributes']['state']); + + // test for "key" metadata + $this->assertTrue($catalogue->defines('key', 'domain1')); + $metadata = $catalogue->getMetadata('key', 'domain1'); + $this->assertNotEmpty($metadata); + $this->assertCount(2, $metadata['segment-attributes']); + $this->assertArrayHasKey('state', $metadata['segment-attributes']); + $this->assertSame('translated', $metadata['segment-attributes']['state']); + $this->assertArrayHasKey('subState', $metadata['segment-attributes']); + $this->assertSame('My Value', $metadata['segment-attributes']['subState']); + } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy