0
respostas

Dependência não funciona mais, basicamente foi descontinuada.

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

  1. Instalar o python (ou pode deixar a versão que vem com o WSL, aqui foi a 3.12)
  2. Instalar o pip com sudo apt-get install python-pip
  3. Como estou rodando em um subsistema, eu prefiro criar um ambiente virtual:
     apt-get update
      apt-get install python3-virtualenv
      python3 -m venv .venv
  1. Ativar o ambiente virtural com source .venv/bin/activate
  2. No ambiente virtual, instalar a lib do libretranslate com pip install libretranslate
  3. 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
  4. 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("\"", "\\\"");
    }
}
  1. 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")
        );
    }