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