/** * @param $locale * @param $db_group * @param $translations * @param $replace */ protected function importTranslationFile($locale, $db_group, $translations, $replace) { $connectionName = $this->getConnectionName(); $ltm_translations = $this->getTranslationsTableName(); $dbTranslations = $this->translation->hydrateRaw(<<<SQL SELECT * FROM {$ltm_translations} WHERE locale = ? AND `group` = ? SQL , [$locale, $db_group], $connectionName); $timeStamp = 'now()'; $dbTransMap = []; $dbTranslations->each(function ($trans) use(&$dbTransMap, $connectionName) { $dbTransMap[$trans->key] = $trans; }); $values = []; $statusChangeOnly = []; foreach ($translations as $key => $value) { $value = (string) $value; if (array_key_exists($key, $dbTransMap)) { $translation = $dbTransMap[$key]; unset($dbTransMap[$key]); } else { $translation = new Translation(array('locale' => $locale, 'group' => $db_group, 'key' => $key)); $translation->setConnection($connectionName); } // Importing from the source, status is always saved. When it is changed by the user, then it is changed. //$newStatus = ($translation->value === $value || !$translation->exists) ? Translation::STATUS_SAVED : Translation::STATUS_CHANGED; // Only replace when empty, or explicitly told so if ($replace || !$translation->value) { $translation->value = $value; } $translation->is_deleted = 0; $translation->saved_value = $value; $newStatus = $translation->value === $translation->saved_value ? Translation::STATUS_SAVED : ($translation->status === Translation::STATUS_SAVED ? Translation::STATUS_SAVED_CACHED : Translation::STATUS_CHANGED); if ($newStatus !== (int) $translation->status) { $translation->status = $newStatus; } if (!$translation->exists) { $sql = '(' . self::dbValue($translation->status, Translation::STATUS_SAVED) . ',' . self::dbValue($translation->locale) . ',' . self::dbValue($translation->group) . ',' . self::dbValue($translation->key) . ',' . self::dbValue($translation->value) . ',' . self::dbValue($translation->created_at, $timeStamp) . ',' . self::dbValue($translation->updated_at, $timeStamp) . ',' . self::dbValue($translation->source) . ',' . self::dbValue($translation->saved_value) . ',' . self::dbValue($translation->is_deleted, 0) . ',' . self::dbValue($translation->was_used, 0) . ')'; $values[] = $sql; } else { if ($translation->isDirty()) { if ($translation->isDirty(['value', 'source', 'saved_value', 'was_used'])) { $translation->save(); } else { if (!array_key_exists($translation->status, $statusChangeOnly)) { $statusChangeOnly[$translation->status] = $translation->id; } else { $statusChangeOnly[$translation->status] .= ',' . $translation->id; } } } } $this->imported++; } // now batch update those with status changes only $updated_at = new Carbon(); foreach ($statusChangeOnly as $status => $translationIds) { $this->getConnection()->affectingStatement(<<<SQL UPDATE {$ltm_translations} SET status = ?, is_deleted = 0, updated_at = ? WHERE id IN ({$translationIds}) SQL , [$status, $updated_at]); } //$sql = "INSERT INTO `ltm_translations`(status, locale, `group`, `key`, value, created_at, updated_at, source, saved_value, is_deleted, was_used) VALUES "; // now process all the new translations that were not in the files if ($replace == 2) { // we delete all translations that were not in the files if ($dbTransMap) { $translationIds = ''; foreach ($dbTransMap as $translation) { $translationIds .= ',' . $translation->id; } $translationIds = trim_prefix($translationIds, ','); $this->getConnection()->unprepared(<<<SQL DELETE FROM {$ltm_translations} WHERE id IN ({$translationIds}) SQL ); } } else { // update their status foreach ($dbTransMap as $translation) { // mark it as saved cached or changed if ((int) $translation->status === Translation::STATUS_SAVED) { $translation->status = Translation::STATUS_SAVED_CACHED; $translation->save(); } } } if ($values) { $sql = "INS" . "ERT INTO `{$ltm_translations}`(status, locale, `group`, `key`, value, created_at, updated_at, source, saved_value, is_deleted, was_used) VALUES " . implode(",", $values); //$this->getConnection()->unprepared('LOCK TABLES `ltm_translations` WRITE'); try { $this->getConnection()->unprepared($sql); } catch (\Exception $e) { $tmp = 0; } //$this->getConnection()->unprepared('UNLOCK TABLES'); } }
/** * @param $locale * @param $db_group * @param $translations * @param $replace */ protected function importTranslationFile($locale, $db_group, $translations, $replace) { $dbTranslations = $this->translation->hydrateRaw(<<<SQL SELECT * FROM ltm_translations WHERE locale = ? AND `group` = ? SQL , [$locale, $db_group]); $dbTransMap = []; $dbTranslations->each(function ($trans) use(&$dbTransMap) { $dbTransMap[$trans->key] = $trans; }); foreach ($translations as $key => $value) { $value = (string) $value; if (array_key_exists($key, $dbTransMap)) { $translation = $dbTransMap[$key]; unset($dbTransMap[$key]); } else { $translation = new Translation(array('locale' => $locale, 'group' => $db_group, 'key' => $key)); } // Importing from the source, status is always saved. When it is changed by the user, then it is changed. //$newStatus = ($translation->value === $value || !$translation->exists) ? Translation::STATUS_SAVED : Translation::STATUS_CHANGED; // Only replace when empty, or explicitly told so if ($replace || !$translation->value) { $translation->value = $value; } $translation->is_deleted = 0; $translation->saved_value = $value; $newStatus = $translation->value === $translation->saved_value ? Translation::STATUS_SAVED : ($translation->status === Translation::STATUS_SAVED ? Translation::STATUS_SAVED_CACHED : Translation::STATUS_CHANGED); if ($newStatus !== (int) $translation->status) { $translation->status = $newStatus; } if (!$translation->exists || $translation->isDirty()) { $translation->save(); } $this->imported++; } // now process all the new translations that are not in the files foreach ($dbTransMap as $translation) { // mark it as saved cached or changed if ((int) $translation->status === Translation::STATUS_SAVED) { $translation->status = Translation::STATUS_SAVED_CACHED; $translation->save(); } } }