96 lines
4.5 KiB
PHP
96 lines
4.5 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
namespace App\Services\Translate\Project;
|
|
|
|
use App\Dto\Service\ProjectTranslationServiceHash\Fields;
|
|
use App\Dto\Service\ProjectTranslationServiceHash\TranslateFields;
|
|
use App\Enums\Morph;
|
|
use App\Repositories\ProjectRepository;
|
|
use App\Repositories\ProjectTranslationServiceRepository;
|
|
use App\ServiceResults\ServiceResultError;
|
|
use App\ServiceResults\ServiceResultSuccess;
|
|
use App\Services\ProjectTranslationService\NoTranslateAttributeHandler;
|
|
use App\Services\ProjectTranslationServiceHash\HashTrackerCommand;
|
|
use App\Services\Service;
|
|
use App\Services\Translate\Completed\Project\ProjectContentService as ProjectContentServiceCompleted;
|
|
use Illuminate\Support\Facades\DB;
|
|
use KorElf\TranslateLaravel\DTO\AfterTranslateDto;
|
|
use KorElf\TranslateLaravel\Facades\Translate;
|
|
|
|
final class ProjectContentService extends Service
|
|
{
|
|
public function __construct(
|
|
private readonly ProjectRepository $projectRepository,
|
|
private readonly ProjectTranslationServiceRepository $projectTranslationServiceRepository,
|
|
private readonly HashTrackerCommand $hashTrackerCommand,
|
|
private readonly NoTranslateAttributeHandler $noTranslateAttributeHandler,
|
|
) {}
|
|
|
|
public function translate(int $projectId, array $contentIds, array $exceptLanguages): ServiceResultSuccess | ServiceResultError
|
|
{
|
|
try {
|
|
$project = $this->projectRepository->getProjectById($projectId);
|
|
if ($project === null) {
|
|
return $this->errNotFound(__('Project not found'));
|
|
}
|
|
|
|
$contents = $project->contents()
|
|
->whereIn('id', $contentIds)
|
|
->cursor();
|
|
|
|
$sourceLanguagesCode = [];
|
|
foreach ($contents as $content) {
|
|
if (!isset($sourceLanguagesCode[$content->language_id])) {
|
|
$sourceLanguagesCode[$content->language_id] = $this->projectTranslationServiceRepository->getLanguageCodeByLanguageId($content->language_id) ?? 'null';
|
|
}
|
|
$translateIntoLanguage = $this->projectTranslationServiceRepository
|
|
->getLanguagesBySourceLanguage($content->language_id, $exceptLanguages)
|
|
->all()->pluck('code', 'language_id')->toArray();
|
|
|
|
if (empty($translateIntoLanguage)) {
|
|
continue;
|
|
}
|
|
|
|
$fields = (new Fields())
|
|
->add('title', $content->title ?? '')
|
|
->add('description', $content->description ?? '');
|
|
$translations = DB::transaction(function () use ($content, $translateIntoLanguage, $fields) {
|
|
return $this->hashTrackerCommand->execute(Morph::ProjectContent, $content->id, \array_keys($translateIntoLanguage), $fields);
|
|
});
|
|
/** @var TranslateFields $translations */
|
|
unset($fields);
|
|
|
|
foreach ($translations->getFields() as $languageId => $fields) {
|
|
$params = new \KorElf\TranslateLaravel\DTO\RunTranslateDto();
|
|
$sourceLanguageCode = null;
|
|
if (isset($sourceLanguagesCode[$content->language_id]) && $sourceLanguagesCode[$content->language_id] !== 'null') {
|
|
$sourceLanguageCode = $sourceLanguagesCode[$content->language_id];
|
|
}
|
|
foreach ($fields as $field) {
|
|
$text = $this->noTranslateAttributeHandler->handleAddAttribute((string) $content->{$field} ?? '');
|
|
$params->addParamHtml($field, $text, $translateIntoLanguage[$languageId], $sourceLanguageCode);
|
|
}
|
|
|
|
$afterTranslateDto = new AfterTranslateDto(ProjectContentServiceCompleted::class, [
|
|
'projectId' => $projectId,
|
|
'languageId' => $languageId,
|
|
'hashes' => $translations->getHashesByLanguage($languageId),
|
|
'exceptLanguages' => $exceptLanguages,
|
|
]);
|
|
Translate::runJob($params, $afterTranslateDto);
|
|
unset($params, $afterTranslateDto);
|
|
}
|
|
|
|
unset($translations, $translateIntoLanguage);
|
|
}
|
|
unset($contents, $documentation);
|
|
|
|
} catch (\Throwable $e) {
|
|
\report($e);
|
|
return $this->errService($e->getMessage());
|
|
}
|
|
|
|
return $this->ok();
|
|
}
|
|
}
|