public function testSet()
 {
     $col = new MessageCollection();
     $col->add($m = Message::create('foo'));
     $this->assertTrue($col->has('foo'));
     $this->assertSame($m, $col->get('foo'));
 }
    public function testCdataOutput()
    {
        $dumper = $this->getDumper();
        $catalogue = new MessageCatalogue();
        $catalogue->add(Message::create('foo')->setLocaleString('<bar>')->setDesc('<baz>'));
        $expected = <<<EOF
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:jms="urn:jms:translation" version="1.2">
  <file source-language="en" target-language="" datatype="plaintext" original="not.available">
    <header>
      <tool tool-id="JMSTranslationBundle" tool-name="JMSTranslationBundle" tool-version="1.1.0-DEV"/>
      <note>The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.</note>
    </header>
    <body>
      <trans-unit id="0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" resname="foo">
        <source><![CDATA[<baz>]]></source>
        <target state="new"><![CDATA[<bar>]]></target>
      </trans-unit>
    </body>
  </file>
</xliff>

EOF;
        $this->assertEquals($expected, $dumper->dump($catalogue, 'messages'));
    }
 public function testCreate()
 {
     $message = Message::create('id', 'foo');
     $this->assertInstanceOf('JMS\\TranslationBundle\\Model\\Message', $message);
     $this->assertEquals('id', $message->getId());
     $this->assertEquals('foo', $message->getDomain());
 }
 public function testGet()
 {
     $catalogue = new MessageCatalogue();
     $catalogue->add($message = Message::create('foo'));
     $this->assertTrue($catalogue->hasDomain('messages'));
     $this->assertSame($message, $catalogue->get('foo'));
 }
 /**
  * Converts Symfony's message catalogue to the catalogue of this
  * bundle.
  *
  * @param mixed $resource
  * @param string $locale
  * @param string $domain
  * @return MessageCatalogue
  */
 public function load($resource, $locale, $domain = 'messages')
 {
     $catalogue = new MessageCatalogue();
     $catalogue->setLocale($locale);
     foreach ($this->loader->load($resource, $locale, $domain)->all($domain) as $id => $message) {
         $catalogue->add(Message::create($id, $domain)->setLocaleString($message)->setNew(false));
     }
     return $catalogue;
 }
 public function testLoadWithSymfonyFormat()
 {
     $loader = new XliffLoader();
     $expected = new MessageCatalogue();
     $expected->setLocale('en');
     $expected->add(Message::create('foo1')->setDesc('foo1')->setLocaleString('bar')->setNew(false));
     $expected->add(Message::create('foo2')->setDesc('foo2')->setLocaleString('bar')->setNew(false));
     $expected->add(Message::create('foo3')->setDesc('foo3')->setLocaleString('bar')->setNew(false));
     $expected->add(Message::create('foo4')->setDesc('foo4')->setLocaleString('bar')->setNew(false));
     $this->assertEquals($expected, $loader->load(__DIR__ . '/Symfony/xliff/old_format.xml', 'en'));
 }
 public function testCompareWithMultipleDomains()
 {
     $current = new MessageCatalogue();
     $current->add(Message::create('foo')->setLocaleString('bar'));
     $current->add(Message::create('bar', 'routes')->setLocaleString('baz'));
     $new = new MessageCatalogue();
     $new->add(new Message('foo'));
     $new->add(new Message('bar'));
     $expected = new ChangeSet(array(new Message('bar')), array(Message::create('bar', 'routes')->setLocaleString('baz')));
     $comparator = new CatalogueComparator();
     $this->assertEquals($expected, $comparator->compare($current, $new));
 }
 public function load($resource, $locale, $domain = 'messages')
 {
     $previous = libxml_use_internal_errors(true);
     if (false === ($doc = simplexml_load_file($resource))) {
         libxml_use_internal_errors($previous);
         $libxmlError = libxml_get_last_error();
         throw new RuntimeException(sprintf('Could not load XML-file "%s": %s', $resource, $libxmlError->message));
     }
     libxml_use_internal_errors($previous);
     $doc->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:1.2');
     //        $doc->registerXPathNamespace('jms', 'urn:jms:translation');
     //        $hasReferenceFiles = in_array('urn:jms:translation', $doc->getNamespaces(true));
     $catalogue = new MessageCatalogue();
     $catalogue->setLocale($locale);
     foreach ($doc->xpath('//xliff:trans-unit') as $trans) {
         $id = ($resName = (string) $trans->attributes()->resname) ? $resName : (string) $trans->source;
         $m = Message::create($id, $domain)->setDesc((string) $trans->source)->setLocaleString((string) $trans->target);
         $catalogue->add($m);
         //            if ($hasReferenceFiles) {
         //                foreach ($trans->xpath('./jms:reference-file') as $file) {
         //                    $line = (string) $file->attributes()->line;
         //                    $column = (string) $file->attributes()->column;
         //                    $m->addSource(new FileSource(
         //                        (string) $file,
         //                        $line ? (integer) $line : null,
         //                        $column ? (integer) $column : null
         //                    ));
         //                }
         //            }
         if ($meaning = (string) $trans->attributes()->extradata) {
             if (0 === strpos($meaning, 'Meaning: ')) {
                 $meaning = substr($meaning, 9);
             }
             $m->setMeaning($meaning);
         }
         if (!($state = (string) $trans->target->attributes()->state) || 'new' !== $state) {
             $m->setNew(false);
         }
     }
     return $catalogue;
 }
 public function enterNode(\PHPParser_Node $node)
 {
     if ($node instanceof \PHPParser_Node_Stmt_Namespace) {
         $this->namespace = implode('\\', $node->name->parts);
         return;
     }
     if ($node instanceof \PHPParser_Node_Stmt_Class) {
         $name = '' === $this->namespace ? $node->name : $this->namespace . '\\' . $node->name;
         if (!class_exists($name)) {
             return;
         }
         $ref = new \ReflectionClass($name);
         if (!$ref->isSubclassOf('Symfony\\Component\\Security\\Core\\Exception\\AuthenticationException') && $ref->name !== 'Symfony\\Component\\Security\\Core\\Exception\\AuthenticationException') {
             return;
         }
         if (!$ref->hasMethod('getMessageKey')) {
             return;
         }
         $this->inAuthException = true;
         return;
     }
     if (!$this->inAuthException) {
         return;
     }
     if ($node instanceof \PHPParser_Node_Stmt_ClassMethod) {
         if ('getmessagekey' === strtolower($node->name)) {
             $this->inGetMessageKey = true;
         }
         return;
     }
     if (!$this->inGetMessageKey) {
         return;
     }
     if (!$node instanceof \PHPParser_Node_Stmt_Return) {
         return;
     }
     $ignore = false;
     $desc = $meaning = null;
     if ($docComment = $node->getDocComment()) {
         foreach ($this->docParser->parse($docComment->getText(), 'file ' . $this->file . ' near line ' . $node->getLine()) as $annot) {
             if ($annot instanceof Ignore) {
                 $ignore = true;
             } else {
                 if ($annot instanceof Desc) {
                     $desc = $annot->text;
                 } else {
                     if ($annot instanceof Meaning) {
                         $meaning = $annot->text;
                     }
                 }
             }
         }
     }
     if (!$node->expr instanceof \PHPParser_Node_Scalar_String) {
         if ($ignore) {
             return;
         }
         $message = sprintf('Could not extract id from return value, expected scalar string but got %s (in %s on line %d).', get_class($node->expr), $this->file, $node->expr->getLine());
         if ($this->logger) {
             $this->logger->err($message);
             return;
         }
         throw new RuntimeException($message);
     }
     $message = Message::create($node->expr->value, $this->domain)->setDesc($desc)->setMeaning($meaning)->addSource(new FileSource((string) $this->file, $node->expr->getLine()));
     $this->catalogue->add($message);
 }