1
resposta

Não seria melhor atualizar o curso para remover a tradução ??

Perdi 1 hora tentando resolver esse erro. Descobri com a dúvida da colega Nelcilene que a lib não existe mais no repositório.
Não seria mais prudente remover esse conteúdo do curso ???
Isso desanima o estudante e leva o pessoal mais despreparado a pensar que o problema é com eles.
Francamente Alura !

1 resposta

Bom dia, Glauco! Tudo bem?

Sinto muito que não tenha tido uma experiência agradável no nosso curso.

Durante a época de produção do curso a API de tradução utilizada tinha uma versão gratuita e foi por isso que escolhemos ela na época, porém, hoje em dia ela não está mais disponível. Ainda dar para usar de forma gratuita instando uma imagem dele no Docker, mas acabaria complicando de mais uma ferramenta de uso simples do curso.

Então, como alternativa, trago o DeepL, ele tem uma proposta de implementação diferente dá usado no curso, já que não estamos utilizando uma classe Java, mas sim uma requisição direta a uma API.

Além disso, é preciso cadastrar um cartão ao usar o serviço. Não será feito nenhuma cobrança caso você não ultrapasse 500 mil caracteres/mês. Por segurança recomendo que crie um cartão virtual no seu banco para utilizar ele nesse processo.

Após criar a conta e cadastrar o cartão você precisa clicar na opção "API keys & limits" e depois em "Create key" para criar sua API_KEY:

Captura de tela que informa os campos que devem ser acessado na plataforma do DeepL para criar sua propria API_KEY

Com isso feito você precisa fazer algumas modificações no código:

  1. No pom.xml você deve tirar a dependência da API que usávamos anteriormente e adicionar a Gson para trabalharmos com o Json. Suas dependências devem ser apenas essas:

        <dependencies>
            <dependency>
                <groupId>com.opencsv</groupId>
                <artifactId>opencsv</artifactId>
                <version>5.9</version>
            </dependency>
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.10.1</version>
            </dependency>
        </dependencies>
    
  2. Crie um novo arquivo na pasta "service" para tratar e fazer a requisição de tradução para a API:

    public class TradutorDeepLService {
    
        private static final String API_URL = "https://api-free.deepl.com/v2/translate";
        private static final HttpClient client = HttpClient.newHttpClient();
    
        private final String apiKey = "COLOQUE SUA API KEY AQUI";
    
        public TradutorDeepLService() {
            if (apiKey.isBlank()) {
                throw new RuntimeException("DEEPL_API_KEY não configurada");
            }
        }
    
        public String traduzir(String texto) {
            try {
                String body =
                        "text=" + URLEncoder.encode(texto, StandardCharsets.UTF_8) +
                                "&source_lang=EN" +
                                "&target_lang=PT-BR";
    
                HttpRequest request = HttpRequest.newBuilder()
                        .uri(URI.create(API_URL))
                        .header("Content-Type", "application/x-www-form-urlencoded")
                        .header("Authorization", "DeepL-Auth-Key " + apiKey)
                        .POST(HttpRequest.BodyPublishers.ofString(body))
                        .build();
    
                HttpResponse<String> response =
                        client.send(request, HttpResponse.BodyHandlers.ofString());
    
                if (response.statusCode() != 200) {
                    throw new RuntimeException(
                            "Erro DeepL HTTP " + response.statusCode() + " - " + response.body()
                    );
                }
    
                JsonObject json =
                        JsonParser.parseString(response.body()).getAsJsonObject();
    
                return json
                        .getAsJsonArray("translations")
                        .get(0)
                        .getAsJsonObject()
                        .get("text")
                        .getAsString();
    
            } catch (Exception e) {
                throw new RuntimeException("Erro ao traduzir com DeepL", e);
            }
        }
    }
    
  3. Mude a classe que você está usando de tradução em "TraduzProdutoSerive":

    public class TraduzProdutoService {
    
        private final TradutorDeepLService tradutor = new TradutorDeepLService();
    
        public void traduzir(Produto produto) {
            produto.setName(tradutor.traduzir(produto.getName()));
            produto.setCategory(tradutor.traduzir(produto.getCategory()));
            produto.setDescription(tradutor.traduzir(produto.getDescription()));
        }
    }
    
  4. Por fim, na main, crie uma instância da classe de tradução e chame o método:

            // código omitido
    
            TraduzProdutoService traducaoService = new TraduzProdutoService();
            System.out.println("=".repeat(140));
    
            for (Produto produto: produtos){
                traducaoService.traduzir(produto);
                System.out.println(produto);
            }
        }
    }
    

Espero ter ajudado e caso tenha mais alguma dúvida ou problema fico à disposição!

<div style="display: inline-block; padding: 4px 4px; background: #06B9A1; color: white; font-size: 1em; font-style: italic; border: 1px dashed #FFF">Caso este post tenha lhe ajudado, por favor, <strong>marcar como solucionado <span style="color: white;">✓</span></strong>.</div>