Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

02.07.24-AGUARDO RESPOSTA A NOVA DÚVIDA.COMO OBTER TRADUÇÃO DA API DE CONSELHO(adviceslip)?

Criei um código para mostrar mensagens através de pequenos conselhos usando a api publica (adviceslip) mas queria também mostrar o texto da mensagem traduzido para português. Busquei uma api para tal e encontrei a (freedicitionary) mas embora o código não tenha apresentado erros na construção com essa api, ela não retorna a tradução da mensagem como eu queria, mostrando apenas a url da api mas só depois de dar um segundo enter. Peço uma orientação por gentileza. Agradeço muito.

package br.com.alura.Conselho;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Scanner;

public class Principal {
    public static void main(String[] args) throws IOException, InterruptedException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Dê um enter para ver o conselho de hoje para você. ");
        String advice = scanner.nextLine();
        System.out.println("Conselho de hoje: ");
        String endereco = "https://api.adviceslip.com/advice" + advice;

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder().uri(URI.create(endereco)).build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        String json = response.body();
        System.out.println(json);

        Gson gson = new GsonBuilder().create();
        ConselhoTraduzido traducao = gson.fromJson(json, ConselhoTraduzido.class);
        System.out.println(traducao);

        var conselho = scanner.nextLine();
        String significado = "https://Free-Dictionary.proxy-production.allthingsdev.co/api/v2/" + conselho;
        System.out.println(significado);

        }
    }
package br.com.alura.Conselho;

public record ConselhoTraduzido(String conselho) {

    }

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

5 respostas

Bom dia, Ana Maria! Tudo bem com você?

Uma opção para tradução é utilizar a API MyMemory, ela é gratuita e possui a seguinte chamada:

https://api.mymemory.translated.net/get?q=TEXTO&langpair=IDIOMAFONTE|IDIOMAASERTRADUZIDO

Quanto a limites, o uso gratuito e anônimo é limitado a 5.000 caracteres/dia. Com essa API, nosso código ficará da seguinte forma:

import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Scanner;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;

public class App {

    public static void main(String[] args) throws Exception {

        Scanner scanner = new Scanner(System.in);
        System.out.println("Dê um enter para ver o conselho de hoje para você.");
        String advice = scanner.nextLine();
        scanner.close(); // Fechar o scanner após a leitura

        String conselhoSemTraducao = obterConselhoSemTraducao(advice);
        System.out.println("Conselho de hoje: " + conselhoSemTraducao);

        String conselhoTraduzido = traduzirConselho(conselhoSemTraducao);
        System.out.println("Conselho traduzido: " + conselhoTraduzido);
    }

    // Função para obter o conselho sem tradução da API
    private static String obterConselhoSemTraducao(String advice) throws Exception {
        String endereco = "https://api.adviceslip.com/advice" + advice;

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(endereco))
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        String resposta = response.body();

        Gson gson = new GsonBuilder().create();
        JsonObject jsonObject = gson.fromJson(resposta, JsonObject.class);
        return jsonObject.getAsJsonObject("slip").get("advice").getAsString();
    }

    // Função para traduzir o conselho usando a API MyMemory
    private static String traduzirConselho(String conselho) throws Exception {
        final String langpair = URLEncoder.encode("en|pt-br", "UTF-8");
        String url = "https://api.mymemory.translated.net/get?q=" + URLEncoder.encode(conselho, "UTF-8") + "&langpair=" + langpair;

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        String jsonTranslate = response.body();

        Gson gson = new GsonBuilder().create();
        JsonObject jsonObject = gson.fromJson(jsonTranslate, JsonObject.class);
        return jsonObject.getAsJsonObject("responseData").get("translatedText").getAsString();
    }
}

Separei em funções para ficar mais claro o objetivo de cada trecho. Veja o resultado no GIF abaixo:

GIF que mostra a frase sendo traduzida

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá Rafael, grata pelo apoio. Mas deu erro ao compilar. Pelo que entendi, a mensagem informa que a operação de tradução não é suportado pelas configurações da IDE. Eu fiz a atualização da ide para o 23 e logo em seguida disponibilizou a ide de 24, mas não fiz o download. Não sei se isso tem a haver. O módulo gson é o que foi orientado a ser baixado no vídeo da aula e a jdk foi atualizada para a 22. Gostaria de uma explicação detalhada, na medida do possivel, para entender o que pode ter dado errado. Você ou quem puder me orientar. Muito grata.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Oii Ana! Tudo bem com você?

Você está correta, a mensagem de erro está indicando que a versão do jdk configurada no projeto não possui suporte para executar o código com a tradução. Para corrigir o erro apresentado, será necessário indicar a versão 22 nas configurações do IntelliJ, para isso basta seguir os passos apresentados abaixo:

  • Abra os seu projeto no IntelliJ

  • No canto superior direito, clique com o botão direito na pasta "APICONSELHO". No menu de contexto que será aberto, clique em "Open Module Settings"

  • Na janela que será aberta, clique na aba "Sources"

  • No campo "Language level" clique na seta para baixo e escolha a versão: "22 - Unnamed variables and patterns"

  • Clique no botão "Applay" e "OK"

  • Execute novamente o seu projeto clicando com o botão direito no arquivo "App" e escolhendo a opção "Run 'App.main()'

  • No GIF abaixo apresento a execução dos passos listados acima:

    GIF contendo a execução dos passos listados anterior a este GIF

Fico à disposição. Abraços e bons estudos!

Oi Rafael, Infelizmente a opção que você indicou não aparece no menu. Saberia dizer como posso obter o arquivo? Agradeço de novo.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Oii Ana,

O nível de linguagem 22 é suportado e apresentado apenas nas versões mais recentes do Intellij. Peço que atualize o seu Intellij para a versão 24, você pode realizar o download clicando neste link.

Após realizar a atualização para a versão 24 seguindo os mesmos passos quando você atualizou para a versão 23, basta seguir os passos que apresentei na resposta anterior para configurar o nível de linguagem para 22.

Abraços e bons estudos!