Implemented translation via Yandex service.

This commit is contained in:
2024-09-16 22:22:24 +05:00
parent 82dc0b9f99
commit 0d13d602a7
12 changed files with 491 additions and 1 deletions
+113
View File
@@ -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());
}
}
}