예제 #1
0
파일: Language.php 프로젝트: biggtfish/cms
 /**
  * Parse import data.
  * Import translations and language if needed.
  *
  * @param DIBehaviour $di   Dependency injection.
  * @param array       $data Data to parse.
  *
  * @throws Exception
  * @return Language
  */
 public static function parseImportData($di, $data)
 {
     if (empty($data['language']) || empty($data['locale']) || empty($data['locale'])) {
         throw new Exception($di->getI18n()->_('Language translations package must contains fields (not empty): name, language, locale...'));
     }
     /**
      * Get related language.
      */
     $language = Language::findFirst(["language = '{$data['language']}' AND locale = '{$data['locale']}'"]);
     if (!$language) {
         $language = new Language();
         $language->assign($data);
         if (!$language->save()) {
             throw new Exception(implode(', ', $language->getMessages()));
         }
     }
     /**
      * Import into database.
      */
     $table = LanguageTranslation::getTableName();
     $sql = "INSERT IGNORE INTO `{$table}` (language_id, scope, original, translated) VALUES ";
     $sqlValues = [];
     $counter = 0;
     $totals = [];
     foreach ($data['content'] as $scope => $translations) {
         $totals[$scope] = 0;
         foreach ($translations as $original => $translated) {
             $sqlValues[] = PHP_EOL . sprintf('(%d, "%s", "%s", "%s")', $language->getId(), mysql_real_escape_string($scope), mysql_real_escape_string($original), mysql_real_escape_string($translated));
             $counter++;
             $totals[$scope]++;
             if ($counter == self::LANGUAGE_IMPORT_BATCH_SIZE) {
                 $counter = 0;
                 $sqlValues = '';
                 $di->getModelsManager()->execute($sql . implode(',', $sqlValues));
             }
         }
     }
     if (!empty($sqlValues)) {
         $di->getDb()->execute($sql . implode(',', $sqlValues));
     }
     return [$language, $totals];
 }
예제 #2
0
 /**
  * Synchronize language action.
  *
  * @param int $id Language identity.
  *
  * @return void|ResponseInterface
  *
  * @Get("/synchronize/{id:[0-9]+}", name="admin-languages-synchronize")
  */
 public function synchronizeAction($id)
 {
     $item = Language::findFirst($id);
     if (!$item) {
         $this->flashSession->error($this->i18n->_('Language not found!'));
         return $this->response->redirect(['for' => "admin-languages"]);
     }
     $defaultLanguage = Language::findFirstByLanguage(Config::CONFIG_DEFAULT_LANGUAGE);
     $table = LanguageTranslation::getTableName();
     $defaultLanguageId = $defaultLanguage->getId();
     $result = $this->db->query("\n            INSERT INTO `{$table}` (language_id, original, translated, scope)\n            SELECT {$id}, original, translated, scope FROM `{$table}`\n            WHERE language_id = {$defaultLanguageId} AND original NOT IN\n              (SELECT original FROM `{$table}` WHERE language_id = {$id});\n            ");
     $this->flashSession->success($this->i18n->_('Synchronization finished! Added translations: %count%', ['count' => $result->numRows()]));
     return $this->response->redirect(['for' => "admin-languages-manage", 'id' => $id]);
 }