Added automatic translation about the project.
This commit is contained in:
		@@ -0,0 +1,95 @@
 | 
			
		||||
<?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();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user