Skip to content

Commit 3d12ac4

Browse files
jbtronicsfabpot
authored andcommitted
[Translation] Added segment-attributes metadata for Xliff2 files to preserve the "state" attribute of translations
1 parent 5937616 commit 3d12ac4

File tree

6 files changed

+75
-0
lines changed

6 files changed

+75
-0
lines changed

src/Symfony/Component/Translation/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ CHANGELOG
77
* Make `ProviderFactoryTestCase` and `ProviderTestCase` compatible with PHPUnit 10+
88
* Add `lint:translations` command
99
* Deprecate passing an escape character to `CsvFileLoader::setCsvControl()`
10+
* Make Xliff 2.0 attributes in segment element available as `segment-attributes`
11+
metadata returned by `XliffFileLoader` and make `XliffFileDumper` write them to the file
1012

1113
7.1
1214
---

src/Symfony/Component/Translation/Dumper/XliffFileDumper.php

+6
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,12 @@ private function dumpXliff2(string $defaultLocale, MessageCatalogue $messages, ?
193193

194194
$segment = $translation->appendChild($dom->createElement('segment'));
195195

196+
if ($this->hasMetadataArrayInfo('segment-attributes', $metadata)) {
197+
foreach ($metadata['segment-attributes'] as $name => $value) {
198+
$segment->setAttribute($name, $value);
199+
}
200+
}
201+
196202
$s = $segment->appendChild($dom->createElement('source'));
197203
$s->appendChild($dom->createTextNode($source));
198204

src/Symfony/Component/Translation/Loader/XliffFileLoader.php

+7
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,13 @@ private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, s
172172
$catalogue->set((string) $source, $target, $domain);
173173

174174
$metadata = [];
175+
if ($segment->attributes()) {
176+
$metadata['segment-attributes'] = [];
177+
foreach ($segment->attributes() as $key => $value) {
178+
$metadata['segment-attributes'][$key] = (string) $value;
179+
}
180+
}
181+
175182
if (isset($segment->target) && $segment->target->attributes()) {
176183
$metadata['target-attributes'] = [];
177184
foreach ($segment->target->attributes() as $key => $value) {

src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php

+18
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,22 @@ public function testDumpCatalogueWithXliffExtension()
147147
$dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'fr_FR'])
148148
);
149149
}
150+
151+
public function testFormatCatalogueXliff2WithSegmentAttributes()
152+
{
153+
$catalogue = new MessageCatalogue('en_US');
154+
$catalogue->add([
155+
'foo' => 'bar',
156+
'key' => '',
157+
]);
158+
$catalogue->setMetadata('foo', ['segment-attributes' => ['state' => 'translated']]);
159+
$catalogue->setMetadata('key', ['segment-attributes' => ['state' => 'translated', 'subState' => 'My Value']]);
160+
161+
$dumper = new XliffFileDumper();
162+
163+
$this->assertStringEqualsFile(
164+
__DIR__.'/../Fixtures/resources-2.0-segment-attributes.xlf',
165+
$dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'fr_FR', 'xliff_version' => '2.0'])
166+
);
167+
}
150168
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="fr-FR" trgLang="en-US">
3+
<file id="messages.en_US">
4+
<unit id="ea75LoN" name="foo">
5+
<segment state="translated">
6+
<source>foo</source>
7+
<target>bar</target>
8+
</segment>
9+
</unit>
10+
<unit id="pL305WR" name="key">
11+
<segment state="translated" subState="My Value">
12+
<source>key</source>
13+
<target></target>
14+
</segment>
15+
</unit>
16+
</file>
17+
</xliff>

src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php

+25
Original file line numberDiff line numberDiff line change
@@ -362,4 +362,29 @@ public function testLoadVersion2WithName()
362362

363363
$this->assertEquals(['foo' => 'bar', 'bar' => 'baz', 'baz' => 'foo', 'qux' => 'qux source'], $catalogue->all('domain1'));
364364
}
365+
366+
public function testLoadVersion2WithSegmentAttributes()
367+
{
368+
$loader = new XliffFileLoader();
369+
$resource = __DIR__.'/../Fixtures/resources-2.0-segment-attributes.xlf';
370+
$catalogue = $loader->load($resource, 'en', 'domain1');
371+
372+
// test for "foo" metadata
373+
$this->assertTrue($catalogue->defines('foo', 'domain1'));
374+
$metadata = $catalogue->getMetadata('foo', 'domain1');
375+
$this->assertNotEmpty($metadata);
376+
$this->assertCount(1, $metadata['segment-attributes']);
377+
$this->assertArrayHasKey('state', $metadata['segment-attributes']);
378+
$this->assertSame('translated', $metadata['segment-attributes']['state']);
379+
380+
// test for "key" metadata
381+
$this->assertTrue($catalogue->defines('key', 'domain1'));
382+
$metadata = $catalogue->getMetadata('key', 'domain1');
383+
$this->assertNotEmpty($metadata);
384+
$this->assertCount(2, $metadata['segment-attributes']);
385+
$this->assertArrayHasKey('state', $metadata['segment-attributes']);
386+
$this->assertSame('translated', $metadata['segment-attributes']['state']);
387+
$this->assertArrayHasKey('subState', $metadata['segment-attributes']);
388+
$this->assertSame('My Value', $metadata['segment-attributes']['subState']);
389+
}
365390
}

0 commit comments

Comments
 (0)