private static function _createEmptyProject($languageCode, $languageName, $userId)
 {
     $website = Website::get();
     $projectCode = SemDomTransProjectModel::projectCode($languageCode);
     $projectName = SemDomTransProjectModel::projectName($languageCode, $languageName);
     $projectID = ProjectCommands::createProject($projectName, $projectCode, LfProjectModel::SEMDOMTRANS_APP, $userId, $website);
     $project = new SemDomTransProjectModel($projectID);
     $project->languageIsoCode = $languageCode;
     $project->isSourceLanguage = false;
     $project->semdomVersion = SemDomTransProjectModel::SEMDOM_VERSION;
     // by default all created projects have English as their source.  A future feature would allow creating projects off of other source languages
     $englishProject = SemDomTransProjectModel::getEnglishProject();
     $project->sourceLanguageProjectId->id = $englishProject->id->asString();
     return $project->write();
 }
 public function cleanPreviousProject($languageCode)
 {
     $p = new SemDomTransProjectModel();
     $p->readByCode($languageCode, self::TESTVERSION);
     if (!Id::isEmpty($p->id)) {
         $this->cleanProjectEnvironment($p);
     } else {
         // create the project and then clean the project environment
         $p = new SemDomTransProjectModel();
         $p->projectCode = SemDomTransProjectModel::projectCode($languageCode, self::TESTVERSION);
         $p->write();
         $this->cleanProjectEnvironment($p);
     }
     $p->remove();
 }
 /**
  * Returns encoded Semantic Domain Editor Dto:
  * 1) Loads all items of target project (langauge we are translating into)
  * 2) Loads all items of source project (language we are translating from)
  * 3) Sets values from source projects as sources on target items
  * @param string $projectId
  * @param string $userId
  * @param string $lastFetchTime
  * @param int $offset
  * @return array multitype:boolean number multitype: multitype:string  Ambigous <string;, multitype:, string, Ambigous <multitype:, multitype:multitype: unknown >, Ambigous <multitype:, \stdClass, multitype:multitype: unknown >, Ambigous <string, multitype:NULL string >>
  */
 public static function encode($projectId, $userId, $lastFetchTime = null, $offset = 0)
 {
     $data = array();
     // load target project
     $project = new SemDomTransProjectModel($projectId);
     // load source project - if source language is not specified, set it to english
     if ($project->sourceLanguageProjectId == null) {
         $sourceProject = new SemDomTransProjectModel();
         $sourceProject->projectCode = "semdom-en-{$project->semdomVersion}";
         $sourceProject->readByProperty("projectCode", $sourceProject->projectCode);
     } else {
         $sourceProject = new SemDomTransProjectModel($project->sourceLanguageProjectId->asString());
     }
     // load target project items
     $items = new SemDomTransItemListModel($project, $lastFetchTime);
     $items->read();
     $targetItems = $items->entries;
     $sourceItemsModel = new SemDomTransItemListModel($sourceProject);
     $sourceItemsModel->read();
     $sourceItems = $sourceItemsModel->entries;
     //print_r($sourceItems);
     $sourceItemsByKey = array();
     foreach ($sourceItems as $item) {
         $sourceItemsByKey[$item['key']] = $item;
     }
     // suplement the target language data with source language values
     $sourceLanguageIsIncomplete = false;
     // loop over all target items
     foreach ($targetItems as $i => $item) {
         // loop over all properties of target item
         foreach ($item as $outerProp => $outerValue) {
             // make sure that the outer value is an array and that the translation for it exists
             if (is_array($outerValue) && key_exists('translation', $outerValue)) {
                 // source item has translation that is non empty, than set it as source of arget item
                 if ($sourceItemsByKey[$item['key']][$outerProp]['translation'] != '') {
                     $targetItems[$i][$outerProp]['source'] = $sourceItemsByKey[$item['key']][$outerProp]['translation'];
                 } else {
                     $sourceLanguageIsIncomplete = true;
                 }
             }
             // handle special case of search keys
             if ($outerProp == 'searchKeys') {
                 // iterate over all search keys
                 foreach ($outerValue as $innerProp => $innerValue) {
                     // check if corresponding source item has search keys
                     if (array_key_exists($innerProp, $sourceItemsByKey[$item['key']][$outerProp])) {
                         // if source item has search keys, and given search key has translation set on it
                         // use that translation as source of target item search key
                         if ($sourceItemsByKey[$item['key']][$outerProp][$innerProp]['translation'] != '') {
                             $targetItems[$i][$outerProp][$innerProp]['source'] = $sourceItemsByKey[$item['key']][$outerProp][$innerProp]['translation'];
                         } else {
                             $sourceLanguageIsIncomplete = true;
                         }
                     }
                 }
             } else {
                 if ($outerProp == 'questions') {
                     // iterate over all questions
                     foreach ($outerValue as $innerProp => $innerValue) {
                         // check that 'questions' property exists on source item
                         if (array_key_exists($innerProp, $sourceItemsByKey[$item['key']][$outerProp])) {
                             // if source item has questions, and given question has translation set on it
                             // use that translation as source of target item question
                             if ($sourceItemsByKey[$item['key']][$outerProp][$innerProp]['question']['translation'] != '') {
                                 $targetItems[$i][$outerProp][$innerProp]['question']['source'] = $sourceItemsByKey[$item['key']][$outerProp][$innerProp]['question']['translation'];
                             } else {
                                 $sourceLanguageIsIncomplete = true;
                             }
                             // if source item has questions, and given question term has translation set on it
                             // use that translation as source of target item question term
                             if ($sourceItemsByKey[$item['key']][$outerProp][$innerProp]['terms']['translation'] != '') {
                                 $targetItems[$i][$outerProp][$innerProp]['terms']['source'] = $sourceItemsByKey[$item['key']][$outerProp][$innerProp]['terms']['translation'];
                             } else {
                                 $sourceLanguageIsIncomplete = true;
                             }
                         } else {
                             $sourceLanguageIsIncomplete = true;
                         }
                     }
                 }
             }
         }
     }
     $data['sourceLanguageIsIncomplete'] = $sourceLanguageIsIncomplete;
     // load comments
     $commentsModel = new LexCommentListModel($project, $lastFetchTime);
     $commentsModel->readAsModels();
     $encodedModels = LexDbeDtoCommentsEncoder::encode($commentsModel);
     $data['comments'] = $encodedModels["entries"];
     // load working sets
     $workingSets = new SemDomTransWorkingSetListModel($project, $lastFetchTime);
     $workingSets->read();
     $data["workingSets"] = $workingSets->entries;
     /*  if (!is_null($lastFetchTime)) {
             $deletedCommentsModel = new LexDeletedCommentListModel($project, $lastFetchTime);
             $deletedCommentsModel->read();
             $data['deletedCommentIds'] = array_map(function ($c) {return $c['id']; }, $deletedCommentsModel->entries);
         }
         */
     $data['entries'] = $targetItems;
     $data['timeOnServer'] = time();
     // future use for offline syncing
     $data["statuses"] = SemDomTransStatus::getSemdomStatuses();
     return $data;
 }
$changeDatabase = false;
// process xml into a php data structure, organized by language
$xml = simplexml_load_file($xmlFilePath);
$lang = $argv[2];
$version = $argv[3];
$projectCode = "semdom-{$lang}-{$semdomVersion}";
$projectName = "Semdom {$lang} Project";
$appName = LfProjectModel::SEMDOMTRANS_APP;
$website = new Website($domain, Website::LANGUAGEFORGE);
// if a previous project for that language and semantic domain version exists, DO NOT IMPORT
$previousProject = new SemDomTransProjectModel();
$previousProject->readByProperties(array("languageIsoCode" => $lang, "semdomVersion" => $semdomVersion));
if ($previousProject->id->asString() == "") {
    $sourceProject = new SemDomTransProjectModel();
    $sourceProject->readByCode("en");
    $projectID = ProjectCommands::createProject($projectName, $projectCode, $appName, $userId, $website);
    $projectModel = new SemDomTransProjectModel($projectID);
    $newXmlFilePath = $projectModel->getAssetsFolderPath() . '/' . basename($xmlFilePath);
    FileUtilities::createAllFolders($projectModel->getAssetsFolderPath());
    print "copying {$xmlFilePath} to  {$newXmlFilePath}\n";
    copy($xmlFilePath, $newXmlFilePath);
    $projectModel->xmlFilePath = $newXmlFilePath;
    $projectModel->languageIsoCode = $lang;
    $projectModel->semdomVersion = $semdomVersion;
    $projectModel->sourceLanguageProjectId = $sourceProject->id->asString();
    $projectModel->write();
    $importer = new SemDomXMLImporter($xmlFilePath, $projectModel, false, $isEnglish);
    $importer->run();
} else {
    echo "Project exists already" . "\n";
}
 public static function getEnglishProject($semdomVersion = self::SEMDOM_VERSION)
 {
     $englishProject = new SemDomTransProjectModel();
     $englishProject->readByCode('en', $semdomVersion);
     if ($englishProject->id->asString() != '') {
         return $englishProject;
     } else {
         throw new \Exception('The semantic domain English project is assumed to already exist at this point...but it does not!');
     }
 }
<?php

require_once '../scriptsConfig.php';
use Api\Library\Languageforge\Semdomtrans;
use Api\Library\Languageforge\Semdomtrans\SemDomXMLExporter;
use Api\Model\Languageforge\Semdomtrans\SemDomTransProjectModel;
$lang = $argv[1];
$version = SemDomTransProjectModel::SEMDOM_VERSION;
$testMode = false;
$projectModel = new SemDomTransProjectModel();
$projectModel->readByProperties(array("languageIsoCode" => $lang, "semdomVersion" => $version));
$xml = simplexml_load_file($projectModel->xmlFilePath);
$exporter = new SemDomXMLExporter($projectModel, $testMode, $argv[2] == "1", $argv[3] == "1");
$exporter->run();
 /**
  * Creates a semdomtrans project and prefills it (using Google Translate data if appropriate flag is set)
  * @param string $languageCode
  * @param string $languageName
  * @param bool $useGoogleTranslateData
  * @param string $userId
  * @param Website $website
  * @param int $semdomVersion
  * @return string
  */
 public static function createProject($languageCode, $languageName, $useGoogleTranslateData, $userId, $website, $semdomVersion = SemDomTransProjectModel::SEMDOM_VERSION)
 {
     $projectCode = SemDomTransProjectModel::projectCode($languageCode, $semdomVersion);
     $projectName = SemDomTransProjectModel::projectName($languageCode, $languageName, $semdomVersion);
     $projectID = ProjectCommands::createProject($projectName, $projectCode, LfProjectModel::SEMDOMTRANS_APP, $userId, $website);
     $project = new SemDomTransProjectModel($projectID);
     $project->languageIsoCode = $languageCode;
     $project->isSourceLanguage = false;
     $project->semdomVersion = $semdomVersion;
     $project->languageName = $languageName;
     // by default all created projects have English as their source.  A future feature would allow creating projects off of other source languages
     $englishProject = SemDomTransProjectModel::getEnglishProject($semdomVersion);
     $project->sourceLanguageProjectId->id = $englishProject->id->asString();
     // prefill project with semdom items
     $project->preFillFromSourceLanguage($useGoogleTranslateData);
     return $project->write();
 }