95 lines
4.2 KiB
PHP
95 lines
4.2 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
namespace App\Services\Translate\Project;
|
|
|
|
use App\Dto\Service\ProjectTranslationServiceTextHash\Codes;
|
|
use App\Dto\Service\ProjectTranslationServiceTextHash\TranslateCodes;
|
|
use App\Repositories\ProjectRepository;
|
|
use App\Repositories\ProjectTranslationServiceRepository;
|
|
use App\ServiceResults\ServiceResultError;
|
|
use App\ServiceResults\ServiceResultSuccess;
|
|
use App\Services\ProjectTranslation\TranslationText;
|
|
use App\Services\ProjectTranslation\TranslationTextCommand;
|
|
use App\Services\ProjectTranslationServiceTextHash\HashTrackerCommand;
|
|
use App\Services\Translate\Completed\Project\TranslationTextService as TranslationTextServiceCompleted;
|
|
use App\Services\Service;
|
|
use Illuminate\Support\Facades\DB;
|
|
use KorElf\TranslateLaravel\DTO\AfterTranslateDto;
|
|
use KorElf\TranslateLaravel\Facades\Translate;
|
|
|
|
final class TranslationTextService extends Service
|
|
{
|
|
public function __construct(
|
|
private readonly ProjectRepository $projectRepository,
|
|
private readonly TranslationTextCommand $translationTextCommand,
|
|
private readonly ProjectTranslationServiceRepository $projectTranslationServiceRepository,
|
|
private readonly HashTrackerCommand $hashTrackerCommand,
|
|
) { }
|
|
|
|
public function translate(int $projectId, int $languageId, array $translateTextCode, array $exceptLanguages): ServiceResultSuccess | ServiceResultError
|
|
{
|
|
try {
|
|
$project = $this->projectRepository->getProjectById($projectId);
|
|
if ($project === null) {
|
|
return $this->errNotFound(__('Project not found'));
|
|
}
|
|
$language = $project->languages()->firstWhere('id', $languageId);
|
|
if ($language === null) {
|
|
return $this->errNotFound(__('Language not found'));
|
|
}
|
|
|
|
$translateIntoLanguage = $this->projectTranslationServiceRepository
|
|
->getLanguagesBySourceLanguage($languageId, $exceptLanguages)
|
|
->all()->pluck('code', 'language_id')->toArray();
|
|
|
|
if (empty($translateIntoLanguage)) {
|
|
return $this->ok();
|
|
}
|
|
|
|
$translationText = $this->translationTextCommand->execute($project, $language, $translateTextCode);
|
|
$codes = $this->getCodes($translationText, $translateTextCode);
|
|
$translations = DB::transaction(function () use ($translateIntoLanguage, $codes) {
|
|
return $this->hashTrackerCommand->execute(\array_keys($translateIntoLanguage), $codes);
|
|
});
|
|
/** @var TranslateCodes $translations */
|
|
unset($codes);
|
|
|
|
$sourceLanguageCode = $this->projectTranslationServiceRepository->getLanguageCodeByLanguageId($language->id);
|
|
foreach ($translations->getCodes() as $currentLanguageId => $codes) {
|
|
$params = new \KorElf\TranslateLaravel\DTO\RunTranslateDto();
|
|
foreach ($codes as $code) {
|
|
$text = $translationText->translate($code);
|
|
$params->addParamHtml($code, $text, $translateIntoLanguage[$currentLanguageId], $sourceLanguageCode);
|
|
}
|
|
|
|
$afterTranslateDto = new AfterTranslateDto(TranslationTextServiceCompleted::class, [
|
|
'projectId' => $projectId,
|
|
'languageId' => $currentLanguageId,
|
|
'hashes' => $translations->getHashesByLanguage($currentLanguageId),
|
|
'exceptLanguages' => $exceptLanguages,
|
|
]);
|
|
Translate::runJob($params, $afterTranslateDto);
|
|
unset($params, $afterTranslateDto);
|
|
}
|
|
|
|
unset($translations, $translateIntoLanguage, $project, $language, $translationText, $sourceLanguageCode);
|
|
|
|
} catch (\Throwable $e) {
|
|
\report($e);
|
|
return $this->errService($e->getMessage());
|
|
}
|
|
|
|
return $this->ok();
|
|
}
|
|
|
|
private function getCodes(TranslationText $translationText, array $translateTextCode): Codes
|
|
{
|
|
$codes = new Codes();
|
|
foreach ($translateTextCode as $code) {
|
|
$codes->add($code, $translationText->translate($code));
|
|
}
|
|
|
|
return $codes;
|
|
}
|
|
}
|