Implemented translation via Yandex service.
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace korElf\TranslateLaravel\Translate;
|
||||
|
||||
use korElf\TranslateLaravel\Contracts\Translate;
|
||||
use korElf\TranslateLaravel\DTO\Languages;
|
||||
use korElf\TranslateLaravel\Exceptions\TranslateException;
|
||||
use korElf\TranslateLaravel\Translate\Yandex\Connection;
|
||||
use Illuminate\Contracts\Foundation\Application;
|
||||
|
||||
final class YandexDriver implements Translate
|
||||
{
|
||||
public static function init(Application $app, array $config = []): self
|
||||
{
|
||||
$keyData = json_decode(file_get_contents($config['authorized_key_path']), true);
|
||||
$path = 'https://translate.api.cloud.yandex.net/translate/v2/';
|
||||
|
||||
return new self(
|
||||
$app->make(Connection::class, [
|
||||
'path' => $path,
|
||||
'folderId' => $config['folder_id'],
|
||||
'privateKey' => $keyData['private_key'],
|
||||
'keyId' => $keyData['id'],
|
||||
'serviceAccountId' => $keyData['service_account_id'],
|
||||
]),
|
||||
);
|
||||
}
|
||||
|
||||
public function __construct(
|
||||
private readonly Connection $connection
|
||||
) { }
|
||||
|
||||
public function translateText(string|array $text, string $targetLanguageCode, ?string $sourceLanguageCode = null): string|array
|
||||
{
|
||||
$format = 'PLAIN_TEXT';
|
||||
$result = $this->translate($text, $format, $targetLanguageCode, $sourceLanguageCode);
|
||||
|
||||
if (\is_string($text)) {
|
||||
return array_shift($result);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function translateHtml(string|array $text, string $targetLanguageCode, ?string $sourceLanguageCode = null): string|array
|
||||
{
|
||||
$format = 'HTML';
|
||||
$result = $this->translate($text, $format, $targetLanguageCode, $sourceLanguageCode);
|
||||
|
||||
if (\is_string($text)) {
|
||||
return array_shift($result);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function listLanguages(): Languages
|
||||
{
|
||||
$params = [];
|
||||
try {
|
||||
$result = $this->connection->post('languages', $params);
|
||||
if (! isset($result['languages'])) {
|
||||
$message = $result['message'] ?? 'Missing value languages in array';
|
||||
throw new TranslateException($message);
|
||||
}
|
||||
|
||||
$languages = new Languages();
|
||||
foreach ($result['languages'] as $language) {
|
||||
$languages->add($language['code'], $language['name'] ?? $language['code']);
|
||||
}
|
||||
return $languages;
|
||||
} catch (TranslateException $e) {
|
||||
throw $e;
|
||||
} catch (\Throwable $exception) {
|
||||
throw new TranslateException($exception->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private function translate(string|array $text, string $format, string $targetLanguageCode, ?string $sourceLanguageCode = null): array
|
||||
{
|
||||
if (\is_string($text)) {
|
||||
$text = [$text];
|
||||
}
|
||||
|
||||
$params = [
|
||||
'targetLanguageCode' => $targetLanguageCode,
|
||||
'format' => $format,
|
||||
'texts' => $text,
|
||||
'speller' => true,
|
||||
];
|
||||
if ($sourceLanguageCode) {
|
||||
$params['sourceLanguageCode'] = $sourceLanguageCode;
|
||||
}
|
||||
|
||||
try {
|
||||
$result = $this->connection->post('translate', $params);
|
||||
if (! isset($result['translations'])) {
|
||||
$message = $result['message'] ?? 'Missing value translations in array';
|
||||
throw new TranslateException($message);
|
||||
}
|
||||
|
||||
$translations = [];
|
||||
foreach ($result['translations'] as $translation) {
|
||||
$translations[] = $translation['text'];
|
||||
}
|
||||
return $translations;
|
||||
} catch (TranslateException $e) {
|
||||
throw $e;
|
||||
} catch (\Throwable $exception) {
|
||||
throw new TranslateException($exception->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user