/**
  * Short description of method read
  *
  * @access public
  * @author firstname and lastname of author, <*****@*****.**>
  * @throws tao_helpers_translation_TranslationException
  * @return mixed
  */
 public function read()
 {
     $file = $this->getFilePath();
     if (!file_exists($file)) {
         throw new tao_helpers_translation_TranslationException("The translation file '{$file}' does not exist.");
     }
     // Create the translation file.
     $tf = new tao_helpers_translation_POFile();
     $fc = implode('', file($file));
     $matched = preg_match_all('/((?:#[\\.:,\\|]{0,1}\\s+(?:.*?)\\n)*)' . '(msgctxt\\s+(?:"(?:[^"]|\\\\")*?"\\s*)+)?' . '(msgid\\s+(?:"(?:[^"]|\\\\")*?"\\s*)+)\\s+' . '(msgstr\\s+(?:"(?:[^"]|\\\\")*?(?<!\\\\)"\\s*)+)/', $fc, $matches);
     preg_match('/sourceLanguage: (.*?)\\n/s', $fc, $sourceLanguage);
     preg_match('/targetLanguage: (.*?)\\n/s', $fc, $targetLanguage);
     if (count($sourceLanguage)) {
         $tf->setSourceLanguage(substr($sourceLanguage[1], 0, 5));
     }
     if (count($targetLanguage)) {
         $tf->setTargetLanguage(substr($targetLanguage[1], 0, 5));
     }
     if ($matched) {
         for ($i = 0; $i < $matched; $i++) {
             $annotations = $matches[1][$i];
             $msgctxt = preg_replace('/\\s*msgctxt\\s*"(.*)"\\s*/s', '\\1', $matches[2][$i]);
             $msgid = preg_replace('/\\s*msgid\\s*"(.*)"\\s*/s', '\\1', $matches[3][$i]);
             $msgstr = preg_replace('/\\s*msgstr\\s*"(.*)"\\s*/s', '\\1', $matches[4][$i]);
             // Do not include meta data as a translation unit..
             if ($msgid !== '') {
                 // Sanitze the strings.
                 $msgid = tao_helpers_translation_POUtils::sanitize($msgid);
                 $msgstr = tao_helpers_translation_POUtils::sanitize($msgstr);
                 $msgctxt = tao_helpers_translation_POUtils::sanitize($msgctxt);
                 $tu = new tao_helpers_translation_POTranslationUnit();
                 // Set up source & target.
                 $tu->setSource($msgid);
                 if ($msgstr !== '') {
                     $tu->setTarget($msgstr);
                 }
                 if ($msgctxt) {
                     $tu->setContext($msgctxt);
                 }
                 // Deal with annotations
                 $annotations = tao_helpers_translation_POUtils::unserializeAnnotations($annotations);
                 foreach ($annotations as $name => $value) {
                     $tu->addAnnotation($name, $value);
                 }
                 $tf->addTranslationUnit($tu);
             }
         }
     }
     $this->setTranslationFile($tf);
 }
 /**
  * @param $child
  * @param $xmlNS
  * @param $about
  * @param $tus
  * @return array
  */
 protected function processUnit($child, $xmlNS, $about, $tus)
 {
     if ($child->hasAttributeNS($xmlNS, 'lang')) {
         $sourceLanguage = 'en-US';
         $targetLanguage = $child->getAttributeNodeNS($xmlNS, 'lang')->value;
         $source = $child->nodeValue;
         $target = '';
         //$child->nodeValue;
         $tu = new tao_helpers_translation_POTranslationUnit();
         $tu->setSource($source);
         $tu->setTarget($target);
         $tu->setSourceLanguage($sourceLanguage);
         $tu->setTargetLanguage($targetLanguage);
         $tu->setAnnotations(array($about));
         $tu->setContext($child->namespaceURI . $child->localName);
         $tus[] = $tu;
         return $tus;
     }
     return $tus;
 }
 /**
  * Extracts the translation units from a structures.xml file.
  * Translation Units can be retrieved after extraction by calling the getTranslationUnits
  * method.
  *
  * @access public
  * @author Jerome Bogaerts <*****@*****.**>
  * @throws tao_helpers_translation_TranslationException If an error occurs.
  */
 public function extract()
 {
     $translationUnits = array();
     foreach ($this->getPaths() as $file) {
         $xml = new \SimpleXMLElement($file, null, true);
         if ($xml instanceof SimpleXMLElement) {
             // look up for "name" attributes of structure elements.
             $nodes = $xml->xpath("//structure[@name]|//section[@name]");
             foreach ($nodes as $node) {
                 if (isset($node['name'])) {
                     $nodeName = (string) $node['name'];
                     $newTranslationUnit = new tao_helpers_translation_POTranslationUnit();
                     $newTranslationUnit->setSource($nodeName);
                     $newTranslationUnit->addFlag('tao-public');
                     $translationUnits[$nodeName] = $newTranslationUnit;
                 }
             }
             // look up for "name" attributes of action elements.
             $nodes = $xml->xpath("//action[@name]|//tree[@name]");
             foreach ($nodes as $node) {
                 if (isset($node['name'])) {
                     $nodeName = (string) $node['name'];
                     $newTranslationUnit = new tao_helpers_translation_POTranslationUnit();
                     $newTranslationUnit->setSource($nodeName);
                     $newTranslationUnit->addFlag('tao-public');
                     $translationUnits[$nodeName] = $newTranslationUnit;
                 }
             }
             // look up for "description" elements.
             $nodes = $xml->xpath("//description");
             foreach ($nodes as $node) {
                 if ((string) $node != '') {
                     $newTranslationUnit = new tao_helpers_translation_POTranslationUnit();
                     $newTranslationUnit->setSource((string) $node);
                     $newTranslationUnit->addFlag('tao-public');
                     $translationUnits[(string) $node] = $newTranslationUnit;
                 }
             }
             // look up for "action" elements inside a toolbar
             $nodes = $xml->xpath("//toolbar/toolbaraction");
             foreach ($nodes as $node) {
                 $nodeValue = (string) $node;
                 if (trim($nodeValue) != '' && !array_key_exists($nodeValue, $translationUnits)) {
                     $newTranslationUnit = new tao_helpers_translation_POTranslationUnit();
                     $newTranslationUnit->setSource($nodeValue);
                     $newTranslationUnit->addFlag('tao-public');
                     $translationUnits[$nodeValue] = $newTranslationUnit;
                 }
             }
             // look up for the "title" attr of an "action" element inside a toolbar
             $nodes = $xml->xpath("//toolbar/toolbaraction[@title]");
             foreach ($nodes as $node) {
                 if (isset($node['title'])) {
                     $nodeTitle = (string) $node['title'];
                     $newTranslationUnit = new tao_helpers_translation_POTranslationUnit();
                     $newTranslationUnit->setSource($nodeTitle);
                     $newTranslationUnit->addFlag('tao-public');
                     $translationUnits[$nodeTitle] = $newTranslationUnit;
                 }
             }
             // look up for the "entrypoint" elements
             $nodes = $xml->xpath("//entrypoint");
             foreach ($nodes as $node) {
                 if (isset($node['title'])) {
                     $nodeTitle = (string) $node['title'];
                     $newTranslationUnit = new tao_helpers_translation_POTranslationUnit();
                     $newTranslationUnit->setSource($nodeTitle);
                     $newTranslationUnit->addFlag('tao-public');
                     $translationUnits[$nodeTitle] = $newTranslationUnit;
                 }
                 if (isset($node['label'])) {
                     $nodeLabel = (string) $node['label'];
                     $newTranslationUnit = new tao_helpers_translation_POTranslationUnit();
                     $newTranslationUnit->setSource($nodeLabel);
                     $newTranslationUnit->addFlag('tao-public');
                     $translationUnits[$nodeTitle] = $newTranslationUnit;
                 }
             }
         }
     }
     $this->setTranslationUnits(array_values($translationUnits));
 }