A dependência tenta acessar a API de tradução disponível no https://libretranslate.com/ , entretanto, a API se encontra indisponível para acesso público e requer uma chave, a qual atualmente é paga.
Uma alternativa é rodar serviço de tradução localmente usando o python, segue o passo a passo:
Aqui eu uso windows com subsistema Linux (Ubuntu) usando o WSL e deu certo
- Instalar o python (ou pode deixar a versão que vem com o WSL, aqui foi a 3.12)
- Instalar o pip com
sudo apt-get install python-pip - Como estou rodando em um subsistema, eu prefiro criar um ambiente virtual:
apt-get update
apt-get install python3-virtualenv
python3 -m venv .venv
- Ativar o ambiente virtural com
source .venv/bin/activate - No ambiente virtual, instalar a lib do libretranslate com
pip install libretranslate - Rodar o libretranslate com
libretranslate --load-only en,pt-br(note que eu passei como argumento as linguas que iremos usar)- Este passo faz com que uma instância do serviço de tradução fique rodando na sua máquina no endereço: http://127.0.0.1:5000
- Criar uma classe TranslateClient:
package br.com.alura.client;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class TranslateClient {
private static final String BASE_URL = "http://localhost:5000/translate";
private final HttpClient client;
public TranslateClient() {
this.client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
}
public String translate(String text, String source, String target) {
try {
String json = """
{
"q": "%s",
"source": "%s",
"target": "%s",
"format": "text"
}
""".formatted(
escape(text),
source,
target
);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL))
.timeout(Duration.ofSeconds(20))
.header("Content-Type", "application/json")
.header("User-Agent", "Java HttpClient")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200) {
throw new RuntimeException("Erro HTTP: " + response.statusCode());
}
return extractTranslatedText(response.body());
} catch (Exception e) {
throw new RuntimeException("Falha ao traduzir texto", e);
}
}
private String extractTranslatedText(String body) {
// resposta padrão:
// { "translatedText": "texto traduzido" }
int start = body.indexOf(":") + 2;
int end = body.lastIndexOf("\"");
return body.substring(start, end);
}
private String escape(String text) {
return text
.replace("\\", "\\\\")
.replace("\"", "\\\"");
}
}
- Na classe service ao inves de chamar a dependencia, chamar o nosso novo client:
private final TranslateClient translator = new TranslateClient();
public void traduzir(Produto produto){
produto.setName(
translator.translate(produto.getName(), "en", "pt-br")
);
produto.setDescription(
translator.translate(produto.getDescription(), "en", "pt-br")
);
produto.setCategory(
translator.translate(produto.getCategory(), "en", "pt-br")
);
}