10
respostas

[Projeto] Alternativa de API para tradução

Eu peguei a solução proposta para tradução em [Projeto] Alternativa de tradução à API do ChatGPT de uso da API MyMemory para quem está tendo problemas com a API do ChatGPT e do Libre Translate, e otimizei o código para uma melhor leitura e entendimento, fazendo uso da classe ConsumoApi e tendo que criar apenas duas classes.

package br.com.alura.screenmatch.service;

import br.com.alura.screenmatch.model.DadosTraducao;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.net.URLEncoder;

public class ConsultaMyMemory {
    public static String obterTraducao(String text) {
        ObjectMapper mapper = new ObjectMapper();

        ConsumoApi consumo = new ConsumoApi();

        String texto = URLEncoder.encode(text);
        String langpair = URLEncoder.encode("en|pt-br");

        String url = "https://api.mymemory.translated.net/get?q=" + texto + "&langpair=" + langpair;

        String json = consumo.obterDados(url);

        DadosTraducao traducao;
        try {
            traducao = mapper.readValue(json, DadosTraducao.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }

        return traducao.responseData().translatedText;
    }
}
package br.com.alura.screenmatch.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public record DadosTraducao(DadosResposta responseData) {
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class DadosResposta {
        public String translatedText;
    }
}

Depois de criar essas duas classe basta fazer essa alteração da sinopse na classe Serie

package br.com.alura.screenmatch.model;

...código omitido

public class Serie {

...código omitido

    public Serie(DadosSerie dadosSerie) {
    
    ...código omitido
    
        this.sinopse = ConsultaMyMemory.obterTraducao(dadosSerie.sinopse()).trim();
    }
        
        ...código omitido
        
}

Espero que ajude.

10 respostas

Oi, Rodrigo! Tudo bem?

Obrigada por compartilhar a alternativa com a nossa comunidade do fórum, ela é bem interessante e funcional, tenho certeza que ajudará muitos colegas! Continue explorando e aprimorando suas habilidades e caso tenha restado alguma dúvida em relação a qualquer conteúdo do curso ou atividade, não hesite em perguntar, estou disponível e ficarei super feliz em poder ajudar!

Um forte abraço e bons estudos!

Excelente saída, me poupou muito tempo, obrigado!

Muito bom, para mim também funcionou de forma mais fácil, valeu por compartilhar!!

Fico feliz que o código esteja ajudando, estive relendo ele e percebi que é possível fazer uso da classe já existente ConverterDados, o que faz com que o código fique um pouco mais sucinto.

Quem quiser pode fazer essas alterações.

Na classe ConsultaMyMemory retire a linha

ObjectMapper mapper = new ObjectMapper();

e as linhas

DadosTraducao traducao;
        try {
            traducao = mapper.readValue(json, DadosTraducao.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }

e as substitui por essas linhas para fazer uso da classe ConverterDados

ConverteDados conversor = new ConverteDados();
DadosTraducao traducao = conversor.obterDados(json, DadosTraducao.class);

Fazendo com que o código da classe ConsultaMyMemory fique assim:

package br.com.alura.screenmatch.service;

import br.com.alura.screenmatch.model.DadosTraducao;

import java.net.URLEncoder;

public class ConsultaMyMemory {
    public static String obterTraducao(String text) {
        ConverteDados conversor = new ConverteDados();

        ConsumoApi consumo = new ConsumoApi();

        String texto = URLEncoder.encode(text);
        final String langpair = URLEncoder.encode("en|pt-br");

        String url = "https://api.mymemory.translated.net/get?q=" + texto + "&langpair=" + langpair;

        String json = consumo.obterDados(url);
        
        DadosTraducao traducao = conversor.obterDados(json, DadosTraducao.class);

        return traducao.responseData().translatedText;
    }
}

Bons estudos a todos.

Muito obrigado por compartilhar, Rodrigo!

A minha do GPT estava dando que eu já atingi o limite, mas na verdade nunca foi utilizado hahaha.

Muito obrigado por compartilhar essa solucao! Ja nao estava a usar a API do GPT pois a mesma estava a dar erro por nao ter mais creditos par ao uso. Sensacional. Aqui esta a funcionar perfeitamente! Muito obrigado

Muito obrigada por compartilhar a solução Rodrigo. Pelo visto esse erro já vem ocorrendo desde o ano passado, pelo que vi sugeriram mudar o model e não adiantou. O outro erro diz que excedeu o limite de uso sendo que nunca usei...

valeu mesmo :)

Nossa cara, Muitíssimo obrigado Ajudou demais!

Uma sugestão para ficar ainda melhor.

Paras as séries que não são dos Estados Unidos, as sinopses não vem em ingles, mas sim em seu idioma de origem. O e API acaba nao traduzinho.

para resolver isso basta ir à classe ConsultaMyMemory e alterar a seguinte linha:

String langpair = URLEncoder.encode("en|pt-br");

Nessa linha esta configura para sempre traduzir do inglês para o português, e o que gera o problema citado acima.

Já na linha abaixo, apenas mudando "en" para "autodetect", a API vai automaticamente detectar o idioma do texto enviado e nos retornar a tradução, deixando a aplicação ainda mais redondinha.

String langpair = URLEncoder.encode("autodetect|pt-br");

Espero ter ajudado alguém. Valeu!

Boa sacada Mateus Perpetuo Da Silva, eu não tinha me aprofundado tanto na API.

Obrigado pela contribuição.