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 @@
+
+
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: