You are here

class IcuResFileLoader in Plug 7

IcuResFileLoader loads translations from a resource bundle.

@author stealth35

Hierarchy

Expanded class hierarchy of IcuResFileLoader

1 file declares its use of IcuResFileLoader
IcuResFileLoaderTest.php in lib/Symfony/translation/Tests/Loader/IcuResFileLoaderTest.php

File

lib/Symfony/translation/Loader/IcuResFileLoader.php, line 24

Namespace

Symfony\Component\Translation\Loader
View source
class IcuResFileLoader 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 (!is_dir($resource)) {
      throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
    }
    try {
      $rb = new \ResourceBundle($locale, $resource);
    } catch (\Exception $e) {

      // HHVM compatibility: constructor throws on invalid resource
      $rb = null;
    }
    if (!$rb) {
      throw new InvalidResourceException(sprintf('Cannot load resource "%s"', $resource));
    }
    elseif (intl_is_failure($rb
      ->getErrorCode())) {
      throw new InvalidResourceException($rb
        ->getErrorMessage(), $rb
        ->getErrorCode());
    }
    $messages = $this
      ->flatten($rb);
    $catalogue = new MessageCatalogue($locale);
    $catalogue
      ->add($messages, $domain);
    if (class_exists('Symfony\\Component\\Config\\Resource\\DirectoryResource')) {
      $catalogue
        ->addResource(new DirectoryResource($resource));
    }
    return $catalogue;
  }

  /**
   * Flattens an ResourceBundle.
   *
   * The scheme used is:
   *   key { key2 { key3 { "value" } } }
   * Becomes:
   *   'key.key2.key3' => 'value'
   *
   * This function takes an array by reference and will modify it
   *
   * @param \ResourceBundle $rb       the ResourceBundle that will be flattened
   * @param array           $messages used internally for recursive calls
   * @param string          $path     current path being parsed, used internally for recursive calls
   *
   * @return array the flattened ResourceBundle
   */
  protected function flatten(\ResourceBundle $rb, array &$messages = array(), $path = null) {
    foreach ($rb as $key => $value) {
      $nodePath = $path ? $path . '.' . $key : $key;
      if ($value instanceof \ResourceBundle) {
        $this
          ->flatten($value, $messages, $nodePath);
      }
      else {
        $messages[$nodePath] = $value;
      }
    }
    return $messages;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
IcuResFileLoader::flatten protected function Flattens an ResourceBundle.
IcuResFileLoader::load public function Loads a locale. Overrides LoaderInterface::load 1