Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,11 @@ private function dumpXliff1(string $defaultLocale, MessageCatalogue $messages, ?
$translation->setAttribute('id', strtr(substr(base64_encode(hash('xxh128', $source, true)), 0, 7), '/+', '._'));
$translation->setAttribute('resname', $source);

$metadata = $messages->getMetadata($source, $domain);
$sourceText = $metadata['source'] ?? $source;

$s = $translation->appendChild($dom->createElement('source'));
$s->appendChild($dom->createTextNode($source));
$s->appendChild($dom->createTextNode($sourceText));

// Does the target contain characters requiring a CDATA section?
$text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
Expand Down Expand Up @@ -174,6 +177,7 @@ private function dumpXliff2(string $defaultLocale, MessageCatalogue $messages, ?
}

$metadata = $messages->getMetadata($source, $domain);
$sourceText = $metadata['source'] ?? $source;

// Add notes section
if ($this->hasMetadataArrayInfo('notes', $metadata) && $metadata['notes']) {
Expand All @@ -200,7 +204,7 @@ private function dumpXliff2(string $defaultLocale, MessageCatalogue $messages, ?
}

$s = $segment->appendChild($dom->createElement('source'));
$s->appendChild($dom->createTextNode($source));
$s->appendChild($dom->createTextNode($sourceText));

// Does the target contain characters requiring a CDATA section?
$text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,9 @@ private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, s

$catalogue->set((string) $source, $target, $domain);

$metadata = [];
$metadata = [
'source' => (string) $segment->source,
];
if ($segment->attributes()) {
$metadata['segment-attributes'] = [];
foreach ($segment->attributes() as $key => $value) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,4 +183,61 @@ public function testFormatCatalogueXliff2WithSegmentAttributes()
$dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'fr_FR', 'xliff_version' => '2.0'])
);
}

public function testFormatCatalogueWithSourceMetadata()
{
$catalogue = new MessageCatalogue('fr');
$catalogue->add([
'navbar.home' => 'Accueil',
'navbar.about' => 'À propos',
]);
$catalogue->setMetadata('navbar.home', ['source' => 'Home']);
$catalogue->setMetadata('navbar.about', ['source' => 'About']);

$dumper = new XliffFileDumper();
$output = $dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'en']);

$this->assertStringContainsString('<source>Home</source>', $output);
$this->assertStringContainsString('<source>About</source>', $output);
$this->assertStringContainsString('<target>Accueil</target>', $output);
$this->assertStringContainsString('<target>À propos</target>', $output);
$this->assertStringContainsString('resname="navbar.home"', $output);
$this->assertStringContainsString('resname="navbar.about"', $output);
}

public function testFormatCatalogueXliff2WithSourceMetadata()
{
$catalogue = new MessageCatalogue('fr');
$catalogue->add([
'navbar.home' => 'Accueil',
'navbar.about' => 'À propos',
]);
$catalogue->setMetadata('navbar.home', ['source' => 'Home']);
$catalogue->setMetadata('navbar.about', ['source' => 'About']);

$dumper = new XliffFileDumper();
$output = $dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'en', 'xliff_version' => '2.0']);

$this->assertStringContainsString('<source>Home</source>', $output);
$this->assertStringContainsString('<source>About</source>', $output);
$this->assertStringContainsString('<target>Accueil</target>', $output);
$this->assertStringContainsString('<target>À propos</target>', $output);
$this->assertStringContainsString('name="navbar.home"', $output);
$this->assertStringContainsString('name="navbar.about"', $output);
}

public function testFormatCatalogueWithoutSourceMetadataFallsBackToKey()
{
$catalogue = new MessageCatalogue('fr');
$catalogue->add([
'navbar.home' => 'Accueil',
]);
// No metadata['source'] set

$dumper = new XliffFileDumper();
$output = $dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'en']);

$this->assertStringContainsString('<source>navbar.home</source>', $output);
$this->assertStringContainsString('resname="navbar.home"', $output);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ public function testLoadVersion2()
$this->assertContainsOnlyString($catalogue->all('domain1'));

// target attributes
$this->assertEquals(['target-attributes' => ['order' => 1]], $catalogue->getMetadata('bar', 'domain1'));
$this->assertEquals(['source' => 'bar', 'target-attributes' => ['order' => 1]], $catalogue->getMetadata('bar', 'domain1'));
}

public function testLoadVersion2WithNoteMeta()
Expand Down Expand Up @@ -387,4 +387,22 @@ public function testLoadVersion2WithSegmentAttributes()
$this->assertArrayHasKey('subState', $metadata['segment-attributes']);
$this->assertSame('My Value', $metadata['segment-attributes']['subState']);
}

public function testLoadVersion2StoresSourceInMetadata()
{
$loader = new XliffFileLoader();
$resource = __DIR__.'/../Fixtures/resources-2.0.xlf';
$catalogue = $loader->load($resource, 'en', 'domain1');

// Verify that source text is stored in metadata for XLIFF 2.0
$metadata = $catalogue->getMetadata('foo', 'domain1');
$this->assertNotEmpty($metadata);
$this->assertArrayHasKey('source', $metadata);
$this->assertEquals('foo', $metadata['source']);

$metadata = $catalogue->getMetadata('bar', 'domain1');
$this->assertNotEmpty($metadata);
$this->assertArrayHasKey('source', $metadata);
$this->assertEquals('bar', $metadata['source']);
}
}