/** * 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]; }
/** * 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]); }