2020-08-31 20:52:57 -07:00

87 lines
2.9 KiB
PHP

<?php
namespace Gettext\Extractors;
use Gettext\Translations;
use Gettext\Translation;
use SimpleXMLElement;
/**
* Class to get gettext strings from xliff format.
*/
class Xliff extends Extractor implements ExtractorInterface
{
public static $options = [
'unitid_as_id' => false
];
/**
* {@inheritdoc}
*/
public static function fromString($string, Translations $translations, array $options = [])
{
$options += static::$options;
$xml = new SimpleXMLElement($string, null, false);
foreach ($xml->file as $file) {
if (isset($file->notes)) {
foreach ($file->notes->note as $note) {
$translations->setHeader($note['id'], (string) $note);
}
}
foreach ($file->unit as $unit) {
foreach ($unit->segment as $segment) {
$targets = [];
foreach ($segment->target as $target) {
$targets[] = (string) $target;
}
$translation = $translations->createNewTranslation(null, (string) $segment->source);
if (isset($unit['id'])) {
$unitId = (string) $unit['id'];
$translation->addComment("XLIFF_UNIT_ID: $unitId");
if ($options['unitid_as_id']) {
$translation->setId($unitId);
}
}
$translation->setTranslation(array_shift($targets));
$translation->setPluralTranslations($targets);
if (isset($unit->notes)) {
foreach ($unit->notes->note as $note) {
switch ($note['category']) {
case 'context':
$translation = $translation->getClone((string) $note);
break;
case 'extracted-comment':
$translation->addExtractedComment((string) $note);
break;
case 'flag':
$translation->addFlag((string) $note);
break;
case 'reference':
$ref = explode(':', (string) $note, 2);
$translation->addReference($ref[0], isset($ref[1]) ? $ref[1] : null);
break;
default:
$translation->addComment((string) $note);
break;
}
}
}
$translations[] = $translation;
}
}
}
}
}