59 lines
2.5 KiB
PHP
59 lines
2.5 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' => 'required|string|max:10000',
|
|
'source_lang' => 'required|string|max:20',
|
|
'target_lang' => 'required|string|max:20',
|
|
'is_html' => 'boolean',
|
|
]);
|
|
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');
|
|
if ($response->successful() && is_string($translated) && $translated !== '') {
|
|
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'), '/');
|
|
}
|
|
}
|