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')); }