Source of file StructuredBundleReader.php
Size: 3,083 Bytes - Last Modified: 2013-07-17T08:22:21+02:00
/home/theseer/Downloads/Symfony/vendor/symfony/symfony/src/Symfony/Component/Intl/ResourceBundle/Reader/StructuredBundleReader.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | <?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\Intl\ResourceBundle\Reader; use Symfony\Component\Intl\ResourceBundle\Util\RecursiveArrayAccess; /** * A structured reader wrapping an existing resource bundle reader. * * @author Bernhard Schussek <bschussek@gmail.com> * * @see StructuredResourceBundleBundleReaderInterface */ class StructuredBundleReader implements StructuredBundleReaderInterface { /** * @var BundleReaderInterface */ private $reader; /** * Creates an entry reader based on the given resource bundle reader. * * @param BundleReaderInterface $reader A resource bundle reader to use. */ public function __construct(BundleReaderInterface $reader) { $this->reader = $reader; } /** * {@inheritdoc} */ public function read($path, $locale) { return $this->reader->read($path, $locale); } /** * {@inheritdoc} */ public function getLocales($path) { return $this->reader->getLocales($path); } /** * {@inheritdoc} */ public function readEntry($path, $locale, array $indices, $fallback = true) { $data = $this->reader->read($path, $locale); $entry = RecursiveArrayAccess::get($data, $indices); $multivalued = is_array($entry) || $entry instanceof \Traversable; if (!($fallback && (null === $entry || $multivalued))) { return $entry; } if (null !== ($fallbackLocale = $this->getFallbackLocale($locale))) { $parentEntry = $this->readEntry($path, $fallbackLocale, $indices, true); if ($entry || $parentEntry) { $multivalued = $multivalued || is_array($parentEntry) || $parentEntry instanceof \Traversable; if ($multivalued) { if ($entry instanceof \Traversable) { $entry = iterator_to_array($entry); } if ($parentEntry instanceof \Traversable) { $parentEntry = iterator_to_array($parentEntry); } $entry = array_merge( $parentEntry ?: array(), $entry ?: array() ); } else { $entry = null === $entry ? $parentEntry : $entry; } } } return $entry; } /** * Returns the fallback locale for a given locale, if any * * @param string $locale The locale to find the fallback for. * * @return string|null The fallback locale, or null if no parent exists */ private function getFallbackLocale($locale) { if (false === $pos = strrpos($locale, '_')) { return null; } return substr($locale, 0, $pos); } } |