Rompendo barreiras com tradutor multi idiomas
Tags: azure, csharp, azurefunctions, cognitiveservices
Published: 2019-11-16 19:28:49

Outro dia, esse tweet apareceu na minha linha do tempo do Twitter:

![Polemic tweet](https://thepracticaldev.s3.amazonaws.com/i/xadpcqupjglxba4xarth.png)

Meio extremo, mas eu entendi o ponto de vista dele, apesar de acreditar que as pessoas são livres para postar o que quiserem e no idioma que desejam. Como você pode ver, muitas pessoas responderam a esse tweet e ele se tornou um tópico interessante.

Às vezes, o que você deseja compartilhar é relevante para parte do seu público, outras vezes pode ser útil para várias culturas e, como o inglês é o idioma universal, acredito que devemos compartilhar o conteúdo em inglês.

"Mas eu não falo inglês, o que posso fazer?"

Acredite ou não, existe um site que pode traduzir o que você deseja para vários idiomas e é gratuito. Tudo o que você precisa fazer é acessar https://translate.google.com e selecionar os idiomas de origem e de destino, escrever o texto que deseja traduzir e pressionar a tecla Enter.

WOW!

> História engraçada: meu amigo Rodrigo Kono viajou para o Japão e passou duas horas no aeroporto tentando obter ajuda para ir ao hotel. Ele me enviou um áudio dizendo esse "problema" e lembrei-o do aplicativo tradutor do Google, que possui um recurso em que você pode usar a câmera do seu telefone para traduzir um texto em tempo real. Ele conseguiu ir para o hotel e dias depois, retornar ao Brasil e o dia foi salvo graças ao seu antigo colega de quarto aqui.

Mas e se você não é um fã do Google ou se deseja incluir recursos de tradução em seus aplicativos? Você pode consumir modelos pré-treinados de IA por meio de APIs REST e obter o mesmo resultado.

> Em 2016, enquanto eu morava na Nova Zelândia, conheci um cara que começou sua própria empresa depois que seu aplicativo foi apresentado no Tech Crunch. Basicamente, ele criou um aplicativo disruptivo de tradução de 1-N idiomas. Você pode ler o artigo completo aqui: https://techcrunch.com/2016/04/20/miss-d-is-a-dictionary-app-for-the-linguistically-curious/

## Codificando seu próprio mecanismo de tradução usando o Cognitive Services + Azure Functions + Azure Storage

A primeira coisa que precisamos fazer é acessar o Portal do Azure e criar um novo "Texto do Tradutor" na sua Assinatura do Azure:

![Criando um tradutor de serviço cognitivo](https://thepracticaldev.s3.amazonaws.com/i/2crp38w7ulqlzhcau3hj.png)

Em seguida, precisamos escolher a camada de preços e escolher um nome para o serviço:

![Especificando o nome e o grupo de recursos](https://thepracticaldev.s3.amazonaws.com/i/vcy7orzktlwrty9kbe0y.png)

Agora, vamos criar um projeto do Azure Functions usando o Visual Studio:

![Criando um novo projeto](https://thepracticaldev.s3.amazonaws.com/i/esb5werv9x1lxayscmej.png)

Depois disso, vamos especificar que nossa função será acionada sempre que um novo blob for carregado na nossa conta de armazenamento:

![Selecionando o tipo de gatilho para a Função Azure](https://thepracticaldev.s3.amazonaws.com/i/7h82841pslj1uqp2ikpm.png)

Em seguida, precisamos instalar um pacote nuget para simplificar a requisição http ao Serviço Cognitivo, que traduzirá o texto:

```
using System;
using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using CognitiveServices.Translator;
using CognitiveServices.Translator.Translate;
using Microsoft.Azure.Storage.Blob;
using Microsoft.Azure.Storage.Auth;

namespace MultiLanguageTranslator
{
    public class Function1
    {
        [FunctionName("Function1")]
        public static void Run([BlobTrigger("english/{name}", Connection = "StorageConnectionString")]Stream myBlob, string name, ILogger log)
        {
            log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");

            var translateClient = new TranslateClient(new CognitiveServices.Translator.Configuration.CognitiveServicesConfig
            {
                Name = Environment.GetEnvironmentVariable("CognitiveServicesName"),
                SubscriptionKey = Environment.GetEnvironmentVariable("CognitiveServicesKey"),
                SubscriptionKeyAlternate = Environment.GetEnvironmentVariable("CognitiveServicesKey"),
            });

            using (var sr = new StreamReader(myBlob))
            {
                var fullContent = sr.ReadToEnd();
                var desiredLanguages = new string[] { "de", "es", "fr", "pt",  "it", "nl" };

                var responses = translateClient.Translate(new RequestContent(fullContent), new RequestParameter
                {
                    From = "en",
                    To = desiredLanguages,
                    IncludeAlignment = true
                });

                var storageAccountName = Environment.GetEnvironmentVariable("StorageAccountName");
                var storageAccountKey = Environment.GetEnvironmentVariable("StorageAccountKey");
                var storageAccountEndpoint = Environment.GetEnvironmentVariable("StorageEndpoint");

                var storageCredentials = new StorageCredentials(accountName: storageAccountName, keyValue: storageAccountKey);
                var blobClient = new CloudBlobClient(new Uri(storageAccountEndpoint), storageCredentials);

                var container = blobClient.GetContainerReference("translations");
                container.CreateIfNotExists();

                foreach (var response in responses)
                {
                    foreach(var translation in response.Translations)
                    {
                        var blob = container.GetBlockBlobReference($"{translation.To}.txt");
                        blob.UploadText(translation.Text);
                    }
                }
            }
        }
    }
}


```

Em resumo, o Azure Functions obterá o conteúdo do texto original que será carregado na Conta de Armazenamento definida por meio da string de conexão StorageConnectionString. O conteúdo pode ser acessado através da variável `myBlob`.
Estamos lendo o conteúdo usando a classe StreamReader e, em seguida, criando um array de strings com os idiomas que queremos traduzir a partir do conteúdo original em inglês.

Em seguida, obtemos algumas variáveis de ambiente (definiremos no Portal do Azure quando criarmos a Azure Function) e finalmente, vamos acessar a conta de armazenamento mais uma vez para armazenar o texto traduzido.

## Hospedando o código criado

Primeiro, vamos criar a conta de armazenamento:

![Criando uma conta de armazenamento](https://thepracticaldev.s3.amazonaws.com/i/o398yk9oeaygtejljyrl.png)

![Criando uma conta de armazenamento parte 2](https://thepracticaldev.s3.amazonaws.com/i/2q2r82cblxz9sbzvkz66.png)

Em seguida, vamos criar a Azure Function e obter o perfil de publicação para simplificar nosso processo de publicação:

![Criando uma Azure Function](https://thepracticaldev.s3.amazonaws.com/i/5lafm4rrip49ebomgw5b.png)

![Criando uma Azure Function 2](https://thepracticaldev.s3.amazonaws.com/i/wna2uqyzs46f6eu8n4vu.png)

Depois de pronto, podemos obter o perfil de publicação na aba Visão geral:

![Obtendo o perfil de publicação](https://thepracticaldev.s3.amazonaws.com/i/btrz16hmix03xv51kdiw.png)

Agora, vamos usar nosso Visual Studio para publicar nosso código:

![Publicando o projeto](https://thepracticaldev.s3.amazonaws.com/i/h0wetsoamoxpro07d2uh.png)

Por fim, vamos criar as variáveis de ambiente clicando no link de configuração também fica na aba Visão geral:

![Criando variáveis de ambiente](https://thepracticaldev.s3.amazonaws.com/i/p6pkrawwsjtwpw5iwjjv.gif)

Vamos ver tudo em ação:

![Testando a nossa aplicação](https://thepracticaldev.s3.amazonaws.com/i/c2i2r3po51tepcoetju9.gif)

A lista completa de idiomas suportados pode ser encontrada aqui: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/language-support