상속: extends Pimcore\Model\AbstractModel, implements Pimcore\Model\Translation\TranslationInterface
예제 #1
0
 public function exportAction()
 {
     $this->checkPermission("translations");
     $admin = $this->getParam("admin");
     // clear translation cache
     Translation\AbstractTranslation::clearDependentCache();
     if ($admin) {
         $list = new Translation\Admin\Listing();
     } else {
         $list = new Translation\Website\Listing();
     }
     $list->setOrder("asc");
     $list->setOrderKey("key");
     $condition = $this->getGridFilterCondition();
     if ($condition) {
         $list->setCondition($condition);
     }
     $list->load();
     $translations = array();
     $translationObjects = $list->getTranslations();
     // fill with one dummy translation if the store is empty
     if (empty($translationObjects)) {
         if ($admin) {
             $t = new Translation\Admin();
             $languages = Tool\Admin::getLanguages();
         } else {
             $t = new Translation\Website();
             $languages = Tool::getValidLanguages();
         }
         foreach ($languages as $language) {
             $t->addTranslation($language, "");
         }
         $translationObjects[] = $t;
     }
     foreach ($translationObjects as $t) {
         $translations[] = array_merge(array("key" => $t->getKey(), "creationDate" => $t->getCreationDate(), "modificationDate" => $t->getModificationDate()), $t->getTranslations());
     }
     //header column
     $columns = array_keys($translations[0]);
     if ($admin) {
         $languages = Tool\Admin::getLanguages();
     } else {
         $languages = Tool::getValidLanguages();
     }
     //add language columns which have no translations yet
     foreach ($languages as $l) {
         if (!in_array($l, $columns)) {
             $columns[] = $l;
         }
     }
     $headerRow = array();
     foreach ($columns as $key => $value) {
         $headerRow[] = '"' . $value . '"';
     }
     $csv = implode(";", $headerRow) . "\r\n";
     foreach ($translations as $t) {
         $tempRow = array();
         foreach ($columns as $key) {
             $value = $t[$key];
             //clean value of evil stuff such as " and linebreaks
             if (is_string($value)) {
                 $value = Tool\Text::removeLineBreaks($value);
                 $value = str_replace('"', '"', $value);
                 $tempRow[$key] = '"' . $value . '"';
             } else {
                 $tempRow[$key] = $value;
             }
         }
         $csv .= implode(";", $tempRow) . "\r\n";
     }
     $suffix = $admin ? "admin" : "website";
     header('Content-type: text/csv; charset=UTF-8');
     header("Content-Disposition: attachment; filename=\"export_ " . $suffix . "_translations.csv\"");
     ini_set('display_errors', false);
     //to prevent warning messages in csv
     echo $csv;
     die;
 }
예제 #2
0
 /**
  * Imports translations from a csv file
  * The CSV file has to have the same format as an Pimcore translation-export-file
  *
  * @static
  * @param $file - path to the csv file
  * @param bool $replaceExistingTranslations
  * @throws \Exception
  */
 public static function importTranslationsFromFile($file, $replaceExistingTranslations = true, $languages = null)
 {
     $delta = [];
     if (is_readable($file)) {
         if (!$languages || empty($languages) || !is_array($languages)) {
             $languages = Tool::getValidLanguages();
         }
         //read import data
         $tmpData = file_get_contents($file);
         //replace magic excel bytes
         $tmpData = str_replace("", "", $tmpData);
         //convert to utf-8 if needed
         $tmpData = Tool\Text::convertToUTF8($tmpData);
         //store data for further usage
         $importFile = PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_translations";
         File::put($importFile, $tmpData);
         $importFileOriginal = PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_translations_original";
         File::put($importFileOriginal, $tmpData);
         // determine csv type
         $dialect = Tool\Admin::determineCsvDialect(PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_translations_original");
         //read data
         if (($handle = fopen(PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_translations", "r")) !== false) {
             while (($rowData = fgetcsv($handle, 0, $dialect->delimiter, $dialect->quotechar, $dialect->escapechar)) !== false) {
                 $data[] = $rowData;
             }
             fclose($handle);
         }
         //process translations
         if (is_array($data) and count($data) > 1) {
             $keys = $data[0];
             // remove wrong quotes in some export/import constellations
             $keys = array_map(function ($value) {
                 return trim($value, '""');
             }, $keys);
             $data = array_slice($data, 1);
             foreach ($data as $row) {
                 $keyValueArray = [];
                 for ($counter = 0; $counter < count($row); $counter++) {
                     $rd = str_replace("&quot;", '"', $row[$counter]);
                     $keyValueArray[$keys[$counter]] = $rd;
                 }
                 $textKey = $keyValueArray["key"];
                 if ($textKey) {
                     $t = static::getByKey($textKey, true);
                     $dirty = false;
                     foreach ($keyValueArray as $key => $value) {
                         if (in_array($key, $languages)) {
                             $currentTranslation = $t->getTranslation($key);
                             if ($replaceExistingTranslations) {
                                 $t->addTranslation($key, $value);
                                 if ($currentTranslation != $value) {
                                     $dirty = true;
                                 }
                             } else {
                                 if (!$t->getTranslation($key)) {
                                     $t->addTranslation($key, $value);
                                     if ($currentTranslation != $value) {
                                         $dirty = true;
                                     }
                                 } elseif ($t->getTranslation($key) != $value && $value) {
                                     $delta[] = ["lg" => $key, "key" => $textKey, "text" => $t->getTranslation($key), "csv" => $value];
                                 }
                             }
                         }
                     }
                     if ($dirty) {
                         if ($keyValueArray['creationDate']) {
                             $t->setCreationDate($keyValueArray['creationDate']);
                         }
                         $t->setModificationDate(time());
                         //ignore modificationDate from file
                         $t->save();
                     }
                 }
             }
             Model\Translation\AbstractTranslation::clearDependentCache();
         } else {
             throw new \Exception("less than 2 rows of data - nothing to import");
         }
     } else {
         throw new \Exception("{$file} is not readable");
     }
     return $delta;
 }
예제 #3
0
 public function exportAction()
 {
     $this->checkPermission("translations");
     $admin = $this->getParam("admin");
     if ($admin) {
         $class = "\\Pimcore\\Model\\Translation\\Admin";
     } else {
         $class = "\\Pimcore\\Model\\Translation\\Website";
     }
     $tableName = call_user_func($class . "\\Dao::getTableName");
     // clear translation cache
     Translation\AbstractTranslation::clearDependentCache();
     if ($admin) {
         $list = new Translation\Admin\Listing();
     } else {
         $list = new Translation\Website\Listing();
     }
     $joins = [];
     $list->setOrder("asc");
     $list->setOrderKey($tableName . ".key", false);
     $condition = $this->getGridFilterCondition($tableName);
     if ($condition) {
         $list->setCondition($condition);
     }
     $filters = $this->getGridFilterCondition($tableName, true);
     if ($filters) {
         $joins = array_merge($joins, $filters["joins"]);
     }
     $this->extendTranslationQuery($joins, $list, $tableName, $filters);
     $list->load();
     $translations = [];
     $translationObjects = $list->getTranslations();
     // fill with one dummy translation if the store is empty
     if (empty($translationObjects)) {
         if ($admin) {
             $t = new Translation\Admin();
             $languages = Tool\Admin::getLanguages();
         } else {
             $t = new Translation\Website();
             $languages = $this->getUser()->getAllowedLanguagesForViewingWebsiteTranslations();
         }
         foreach ($languages as $language) {
             $t->addTranslation($language, "");
         }
         $translationObjects[] = $t;
     }
     foreach ($translationObjects as $t) {
         $translations[] = array_merge(["key" => $t->getKey(), "creationDate" => $t->getCreationDate(), "modificationDate" => $t->getModificationDate()], $t->getTranslations());
     }
     //header column
     $columns = array_keys($translations[0]);
     if ($admin) {
         $languages = Tool\Admin::getLanguages();
     } else {
         $languages = $this->getUser()->getAllowedLanguagesForViewingWebsiteTranslations();
     }
     //add language columns which have no translations yet
     foreach ($languages as $l) {
         if (!in_array($l, $columns)) {
             $columns[] = $l;
         }
     }
     //remove invalid languages
     foreach ($columns as $key => $column) {
         if (strtolower(trim($column)) != 'key' && !in_array($column, $languages)) {
             unset($columns[$key]);
         }
     }
     $columns = array_values($columns);
     $headerRow = [];
     foreach ($columns as $key => $value) {
         $headerRow[] = '"' . $value . '"';
     }
     $csv = implode(";", $headerRow) . "\r\n";
     foreach ($translations as $t) {
         $tempRow = [];
         foreach ($columns as $key) {
             $value = $t[$key];
             //clean value of evil stuff such as " and linebreaks
             if (is_string($value)) {
                 $value = Tool\Text::removeLineBreaks($value);
                 $value = str_replace('"', '&quot;', $value);
                 $tempRow[$key] = '"' . $value . '"';
             } else {
                 $tempRow[$key] = $value;
             }
         }
         $csv .= implode(";", $tempRow) . "\r\n";
     }
     $suffix = $admin ? "admin" : "website";
     header('Content-Encoding: UTF-8');
     header('Content-type: text/csv; charset=UTF-8');
     header("Content-Disposition: attachment; filename=\"export_ " . $suffix . "_translations.csv\"");
     ini_set('display_errors', false);
     //to prevent warning messages in csv
     echo "";
     echo $csv;
     die;
 }