Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Translation\Loader; Chris@0: Chris@17: use Symfony\Component\Config\Resource\FileResource; Chris@0: use Symfony\Component\Config\Util\XmlUtils; Chris@0: use Symfony\Component\Translation\Exception\InvalidResourceException; Chris@0: use Symfony\Component\Translation\Exception\NotFoundResourceException; Chris@17: use Symfony\Component\Translation\MessageCatalogue; Chris@0: Chris@0: /** Chris@0: * QtFileLoader loads translations from QT Translations XML files. Chris@0: * Chris@0: * @author Benjamin Eberlei Chris@0: */ Chris@0: class QtFileLoader implements LoaderInterface Chris@0: { Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function load($resource, $locale, $domain = 'messages') Chris@0: { Chris@0: if (!stream_is_local($resource)) { Chris@0: throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); Chris@0: } Chris@0: Chris@0: if (!file_exists($resource)) { Chris@0: throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); Chris@0: } Chris@0: Chris@0: try { Chris@0: $dom = XmlUtils::loadFile($resource); Chris@0: } catch (\InvalidArgumentException $e) { Chris@0: throw new InvalidResourceException(sprintf('Unable to load "%s".', $resource), $e->getCode(), $e); Chris@0: } Chris@0: Chris@0: $internalErrors = libxml_use_internal_errors(true); Chris@0: libxml_clear_errors(); Chris@0: Chris@0: $xpath = new \DOMXPath($dom); Chris@0: $nodes = $xpath->evaluate('//TS/context/name[text()="'.$domain.'"]'); Chris@0: Chris@0: $catalogue = new MessageCatalogue($locale); Chris@14: if (1 == $nodes->length) { Chris@0: $translations = $nodes->item(0)->nextSibling->parentNode->parentNode->getElementsByTagName('message'); Chris@0: foreach ($translations as $translation) { Chris@0: $translationValue = (string) $translation->getElementsByTagName('translation')->item(0)->nodeValue; Chris@0: Chris@0: if (!empty($translationValue)) { Chris@0: $catalogue->set( Chris@0: (string) $translation->getElementsByTagName('source')->item(0)->nodeValue, Chris@0: $translationValue, Chris@0: $domain Chris@0: ); Chris@0: } Chris@0: $translation = $translation->nextSibling; Chris@0: } Chris@0: Chris@0: if (class_exists('Symfony\Component\Config\Resource\FileResource')) { Chris@0: $catalogue->addResource(new FileResource($resource)); Chris@0: } Chris@0: } Chris@0: Chris@0: libxml_use_internal_errors($internalErrors); Chris@0: Chris@0: return $catalogue; Chris@0: } Chris@0: }