示例#1
0
 public function testPluralRuleDefault()
 {
     $domain = new TextDomain();
     $this->assertEquals(0, $domain->getPluralRule()->evaluate(0));
     $this->assertEquals(1, $domain->getPluralRule()->evaluate(1));
     $this->assertEquals(0, $domain->getPluralRule()->evaluate(2));
 }
示例#2
0
 /**
  * load(): defined by FileLoaderInterface.
  *
  * @see    FileLoaderInterface::load()
  * @param  string $locale
  * @param  string $filename
  * @return TextDomain|null
  * @throws Exception\InvalidArgumentException
  */
 public function load($locale, $filename)
 {
     $resolvedIncludePath = stream_resolve_include_path($filename);
     $fromIncludePath = $resolvedIncludePath !== false ? $resolvedIncludePath : $filename;
     if (!$fromIncludePath || !is_file($fromIncludePath) || !is_readable($fromIncludePath)) {
         throw new Exception\InvalidArgumentException(sprintf('Could not find or open file %s for reading', $filename));
     }
     $messages = [];
     $iniReader = new IniReader();
     $messagesNamespaced = $iniReader->fromFile($fromIncludePath);
     $list = $messagesNamespaced;
     if (isset($messagesNamespaced['translation'])) {
         $list = $messagesNamespaced['translation'];
     }
     foreach ($list as $message) {
         if (!is_array($message) || count($message) < 2) {
             throw new Exception\InvalidArgumentException('Each INI row must be an array with message and translation');
         }
         if (isset($message['message']) && isset($message['translation'])) {
             $messages[$message['message']] = $message['translation'];
             continue;
         }
         $messages[array_shift($message)] = array_shift($message);
     }
     if (!is_array($messages)) {
         throw new Exception\InvalidArgumentException(sprintf('Expected an array, but received %s', gettype($messages)));
     }
     $textDomain = new TextDomain($messages);
     if (array_key_exists('plural', $messagesNamespaced) && isset($messagesNamespaced['plural']['plural_forms'])) {
         $textDomain->setPluralRule(PluralRule::fromString($messagesNamespaced['plural']['plural_forms']));
     }
     return $textDomain;
 }
示例#3
0
 /**
  * Merge another text domain with the current one.
  *
  * The plural rule of both text domains must be compatible for a successful
  * merge. We are only validating the number of plural forms though, as the
  * same rule could be made up with different expression.
  *
  * @param  TextDomain $textDomain
  * @return TextDomain
  * @throws Exception\RuntimeException
  */
 public function merge(TextDomain $textDomain)
 {
     if ($this->getPluralRule()->getNumPlurals() !== $textDomain->getPluralRule()->getNumPlurals()) {
         throw new Exception\RuntimeException('Plural rule of merging text domain is not compatible with the current one');
     }
     $this->exchangeArray(array_replace($this->getArrayCopy(), $textDomain->getArrayCopy()));
     return $this;
 }
示例#4
0
 public function testMergingIncompatibleTextDomains()
 {
     $this->setExpectedException('Zend\\I18n\\Exception\\RuntimeException', 'is not compatible');
     $domainA = new TextDomain();
     $domainB = new TextDomain();
     $domainB->setPluralRule(PluralRule::fromString('nplurals=3; plural=n'));
     $domainA->merge($domainB);
 }
示例#5
0
 public function testMergingTextDomainWithoutPluralRuleIntoTextDomainWithPluralRule()
 {
     $domainA = new TextDomain();
     $domainB = new TextDomain();
     $domainA->setPluralRule(PluralRule::fromString('nplurals=3; plural=n'));
     $domainA->merge($domainB);
     $this->assertEquals(3, $domainA->getPluralRule()->getNumPlurals());
     $this->assertFalse($domainB->hasPluralRule());
 }
示例#6
0
 /**
  * Support method for loadLanguageFile: retrieve parent data.
  *
  * @param TextDomain $data TextDomain to populate with parent information.
  *
  * @return TextDomain
  */
 protected function loadParentData($data)
 {
     if (!isset($data['@parent_ini'])) {
         return $data;
     }
     $parent = $this->loadLanguageFile($data['@parent_ini']);
     $data->merge($parent);
     return $data;
 }