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) {
if (is_array($value)) {
if ($value) {
$this->errors[] = "translation value is an array: {$db_group}.{$key} locale {$locale}";
}
continue;
}
$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);
$tmp = 0;
}
// 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->is_auto_added = 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');
}
}