84 lines
3.3 KiB
PHP
84 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Throwable;
|
|
|
|
class TranslationApiController extends Controller
|
|
{
|
|
public function languages(): JsonResponse
|
|
{
|
|
try {
|
|
$response = Http::connectTimeout(2)->timeout(config('services.translation.timeout'))->get($this->url().'/languages');
|
|
if ($response->successful() && is_array($response->json())) {
|
|
return response()->json($response->json())->header('Cache-Control', 'no-store');
|
|
}
|
|
} catch (Throwable) {
|
|
}
|
|
|
|
return response()->json(['message' => 'Serviço de tradução temporariamente indisponível.'], 503);
|
|
}
|
|
|
|
public function translate(Request $request): JsonResponse
|
|
{
|
|
$data = $request->validate([
|
|
'text' => is_array($request->input('text'))
|
|
? 'required|array|min:1|max:8'
|
|
: 'required|string|max:10000',
|
|
'text.*' => 'required|string|max:10000',
|
|
'source_lang' => 'required|string|max:20',
|
|
'target_lang' => 'required|string|max:20',
|
|
'is_html' => 'boolean',
|
|
]);
|
|
|
|
$isBatch = is_array($data['text']);
|
|
if ($isBatch && mb_strlen(implode('', $data['text'])) > 10000) {
|
|
return response()->json(['message' => 'O lote de tradução excede o limite permitido.'], 422);
|
|
}
|
|
|
|
if ($data['source_lang'] === $data['target_lang']) {
|
|
return response()->json([
|
|
'original_text' => $data['text'],
|
|
'translated_text' => $data['text'],
|
|
'source_lang' => $data['source_lang'],
|
|
'target_lang' => $data['target_lang'],
|
|
])->header('Cache-Control', 'no-store');
|
|
}
|
|
|
|
$payload = ['q' => $data['text'], 'source' => $data['source_lang'], 'target' => $data['target_lang'], 'format' => ($data['is_html'] ?? false) ? 'html' : 'text'];
|
|
if (config('services.translation.api_key')) {
|
|
$payload['api_key'] = config('services.translation.api_key');
|
|
}
|
|
try {
|
|
$response = Http::connectTimeout(2)->timeout(config('services.translation.timeout'))->post($this->url().'/translate', $payload);
|
|
$translated = $response->json('translatedText');
|
|
$validTranslation = $isBatch
|
|
? is_array($translated)
|
|
&& count($translated) === count($data['text'])
|
|
&& ! array_filter($translated, fn ($text) => ! is_string($text) || $text === '')
|
|
: is_string($translated) && $translated !== '';
|
|
|
|
if ($response->successful() && $validTranslation) {
|
|
return response()->json([
|
|
'original_text' => $data['text'],
|
|
'translated_text' => $translated,
|
|
'source_lang' => $data['source_lang'],
|
|
'target_lang' => $data['target_lang'],
|
|
])->header('Cache-Control', 'no-store');
|
|
}
|
|
} catch (Throwable) {
|
|
}
|
|
|
|
return response()->json(['message' => 'Serviço de tradução temporariamente indisponível.'], 503)->header('Cache-Control', 'no-store');
|
|
}
|
|
|
|
private function url(): string
|
|
{
|
|
return rtrim((string) config('services.translation.url'), '/');
|
|
}
|
|
}
|