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'), '/'); } }