Files
translate-laravel/src/Translate/YandexDriver.php
T
kor-elf 55b04f0eab Add DTOs, exceptions, and jobs for translation service.
Introduced new Data Transfer Objects (DTOs), exceptions, and jobs to enhance the translation service functionality. Updated namespaces for consistency and added rate limiting to the translation provider. Expanded the README with detailed usage instructions.
2024-10-11 00:22:46 +05:00

113 lines
3.8 KiB
PHP

<?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());
}
}
}