66 lines
2.0 KiB
PHP
66 lines
2.0 KiB
PHP
<?php
|
|
namespace app\common\utils\translation\jobs;
|
|
|
|
use support\Log;
|
|
use app\common\utils\translation\service\TranslatorClient;
|
|
|
|
class TranslationJob
|
|
{
|
|
protected $config = [];
|
|
protected array $payload;
|
|
|
|
public function __construct(array $payload)
|
|
{
|
|
$this->config = getConfig('/common/utils/translation/config/trans.php');
|
|
// $this->config = getConfig('/queue/translation/config/trans.php');
|
|
$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());
|
|
}
|
|
}
|
|
}
|