Files
fdesk/app/common/utils/translation/jobs/TranslationJob.php
T

66 lines
2.0 KiB
PHP
Raw Normal View History

2025-07-04 13:45:50 +08:00
<?php
2025-09-05 16:26:34 +08:00
namespace app\common\utils\translation\jobs;
2025-07-04 13:45:50 +08:00
use support\Log;
2025-09-05 16:26:34 +08:00
use app\common\utils\translation\service\TranslatorClient;
2025-07-04 13:45:50 +08:00
class TranslationJob
{
protected $config = [];
protected array $payload;
public function __construct(array $payload)
{
2025-09-05 16:26:34 +08:00
$this->config = getConfig('/common/utils/translation/config/trans.php');
// $this->config = getConfig('/queue/translation/config/trans.php');
2025-07-04 13:45:50 +08:00
$this->payload = $payload;
}
public function handle(): void
{
$cfgAll = $this->config['entities'];
$pt = $this->payload;
$type = $pt['entityType'];
$id = $pt['entityId'];
$locale = $pt['locale'];
$sourceLocale = $pt['sourceLocale'];
$sourceFields = $pt['sourceFields'];
$clientFields = $pt['clientFields'];
if (! isset($cfgAll[$type])) {
Log::warning("TranslationJob: 未配置实体 {$type}");
return;
}
$cfg = $cfgAll[$type];
$modelClass = $cfg['translation_model'];
$foreignKey = $cfg['foreign_key'];
// 决定采用前端提供、源语种还是第三方翻译
if (! empty($clientFields)) {
$fields = $clientFields;
} elseif ($locale === $sourceLocale) {
$fields = $sourceFields;
} else {
$translator = new TranslatorClient();
$fields = [];
foreach ($sourceFields as $key => $text) {
$fields[$key] = $translator->translate($text, $sourceLocale, $locale);
}
}
// 写库
try {
$modelClass::updateOrCreate(
[
$foreignKey => $id,
'locale' => $locale,
],
array_merge($fields, ['locale' => $locale])
);
} catch (\Throwable $e) {
Log::error("TranslationJob 保存失败: {$type}#{$id} locale={$locale}: ".$e->getMessage());
}
}
}