Exemplo n.º 1
0
 private function toXLIFF($lang, $extension, &$xliff)
 {
     $default = array('about' => array(), 'dictionary' => $this->_tm->defaultDictionary($extension), 'transliterations' => array());
     $warnings = array_shift($default['dictionary']);
     $translation = $this->_tm->get($lang, $extension);
     if (empty($translation)) {
         $translation = array('about' => array('name' => $lang), 'dictionary' => array(), 'transliterations' => array());
         // Try to find language name in other translations for selected language
         $others = $this->_tm->listExtensions($lang);
         foreach ($others as $t_ext) {
             $t_trans = $this->_tm->get($lang, $t_ext);
             if (!empty($t_trans['about']['name'])) {
                 $translation['about']['name'] = $t_trans['about']['name'];
                 break;
             }
         }
     }
     $file = new XMLElement('file');
     $file->setAttribute('original', basename(TranslationManager::filePath($lang, $extension)));
     $file->setAttribute('source-language', 'en');
     $file->setAttribute('target-language', $lang);
     $file->setAttribute('datatype', 'x-symphony');
     $file->setAttribute('xml:space', 'preserve');
     if ($extension) {
         $file->setAttribute('product-name', $extension);
     }
     if (is_array($temp = $this->_Parent->ExtensionManager->about($extension))) {
         $file->setAttribute('product-version', $temp['version']);
     }
     // TODO: Make sure that date is specified in valid format (http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html#date)?
     if ($translation['about']['release-date']) {
         $file->setAttribute('date', $translation['about']['release-date']);
     }
     if ($translation['about']['name']) {
         $file->setAttribute('category', $translation['about']['name']);
     }
     $header = new XMLElement('header');
     $tool = new XMLElement('tool');
     $tool->setAttribute('tool-id', 'tm');
     $tool->setAttribute('tool-name', 'Symphony - Translation Manager');
     $tool->setAttribute('tool-version', '1.0');
     $header->appendChild($tool);
     if (is_array($translation['about']['author'])) {
         $group = new XMLElement('phase-group');
         $appended = 0;
         if (is_string($translation['about']['author']['name'])) {
             $temp = $translation['about']['author'];
             $translation['about']['author'][$temp['name']] = $temp;
         }
         foreach ($translation['about']['author'] as $name => $author) {
             if (!$author['name']) {
                 continue;
             }
             $phase = new XMLElement('phase');
             $phase->setAttribute('phase-name', $author['name']);
             $phase->setAttribute('phase-process', 'translation');
             $phase->setAttribute('tool-id', 'tm');
             if ($author['release-date']) {
                 $phase->setAttribute('date', $author['release-date']);
             }
             if ($author['name']) {
                 $phase->setAttribute('contact-name', $author['name']);
             }
             if ($author['email']) {
                 $phase->setAttribute('contact-email', $author['email']);
             }
             if ($author['website']) {
                 $phase->setAttribute('company-name', $author['website']);
             }
             $group->appendChild($phase);
             $appended++;
         }
         if ($appended) {
             $header->appendChild($group);
         }
     }
     $body = new XMLElement('body');
     $group = new XMLElement('group');
     $group->setAttribute('resname', 'dictionary');
     $sklDictionary = array();
     $translated = array_intersect_key(array_filter($translation['dictionary'], 'trim'), $default['dictionary']);
     foreach ($translated as $k => $v) {
         $sklDictionary[$k] = md5($k);
         $unit = new XMLElement('trans-unit');
         $unit->setAttribute('id', $sklDictionary[$k]);
         $unit->appendChild(new XMLElement('source', General::sanitize($k)));
         $unit->appendChild(new XMLElement('target', General::sanitize($v), array('state' => 'translated')));
         $group->appendChild($unit);
     }
     $missing = array_diff_key($default['dictionary'], $translated);
     foreach ($missing as $k => $v) {
         $sklDictionary[$k] = md5($k);
         $unit = new XMLElement('trans-unit');
         $unit->setAttribute('id', $sklDictionary[$k]);
         $unit->appendChild(new XMLElement('source', General::sanitize($k)));
         $unit->appendChild(new XMLElement('target', '', array('state' => 'new')));
         $group->appendChild($unit);
     }
     $obsolete = array_diff_key($translation['dictionary'], $default['dictionary']);
     foreach ($obsolete as $k => $v) {
         $sklDictionary[$k] = md5($k);
         $unit = new XMLElement('trans-unit');
         $unit->setAttribute('id', $sklDictionary[$k]);
         $unit->appendChild(new XMLElement('source', General::sanitize($k)));
         $unit->appendChild(new XMLElement('target', General::sanitize($v), array('state' => 'x-obsolete')));
         $group->appendChild($unit);
     }
     $body->appendChild($group);
     $group = new XMLElement('group');
     $group->setAttribute('resname', 'transliterations');
     $sklTransliterations = array();
     if (is_array($translation['transliterations']) && !empty($translation['transliterations'])) {
         foreach ($translation['transliterations'] as $k => $v) {
             $sklTransliterations[$k] = md5($k);
             $unit = new XMLElement('trans-unit');
             $unit->setAttribute('id', $sklTransliterations[$k]);
             $unit->appendChild(new XMLElement('source', General::sanitize($k)));
             $unit->appendChild(new XMLElement('target', General::sanitize($v), array('state' => 'translated')));
             $group->appendChild($unit);
         }
     } else {
         if ($extension == 'symphony' || empty($extension)) {
             foreach (TranslationManager::defaultTransliterations() as $k => $v) {
                 $sklTransliterations[$k] = md5($k);
                 $unit = new XMLElement('trans-unit');
                 $unit->setAttribute('id', $sklTransliterations[$k]);
                 $unit->appendChild(new XMLElement('source', General::sanitize($k)));
                 $unit->appendChild(new XMLElement('target', General::sanitize($v), array('state' => 'new')));
                 $group->appendChild($unit);
             }
         }
     }
     $body->appendChild($group);
     // Generate skeleton
     $skl = new XMLElement('skl');
     $translation['dictionary'] = $sklDictionary;
     $translation['transliterations'] = $sklTransliterations;
     $skl->appendChild(new XMLElement('internal-file', '<![CDATA[' . TranslationManager::toPHP($translation) . ']]>', array('form' => 'application/x-php')));
     $header->appendChild($skl);
     $file->appendChild($header);
     $file->appendChild($body);
     $xliff->appendChild($file);
 }
 public function set($lang, $data, $name)
 {
     if (strlen($lang) < 1 || !is_array($data) || empty($name)) {
         return false;
     }
     $isSymphony = $name == 'symphony';
     $data['about']['extension'] = $name;
     $this->__updateAuthors($data['about']);
     if (!is_array($data['dictionary'])) {
         $data['dictionary'] = array();
     }
     if (!is_array($data['transliterations']) || $isSymphony && empty($data['transliterations'])) {
         $data['transliterations'] = $isSymphony ? TranslationManager::defaultTransliterations() : array();
     }
     $file = TranslationManager::filePath($lang, $name);
     if (!$isSymphony && !is_dir(dirname($file))) {
         if (!General::realiseDirectory(dirname($file), $this->_Parent->Configuration->get('write_mode', 'directory'))) {
             return false;
         }
     }
     return General::writeFile($file, TranslationManager::toPHP($data), $this->_Parent->Configuration->get('write_mode', 'file'));
 }