;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Aprenda a falar em qualquer idioma com a ajuda destes aplicativos

Arte UOL
Imagem: Arte UOL

Laura Martins

Colaboração para Tilt, em São Paulo

20/10/2019 04h04Atualizada em 20/10/2019 15h04

Olá, Hello, Hallo. Aprender um novo idioma é, para a maioria das pessoas, um desafio e tanto. Muito além do inglês, a possibilidade de saber espanhol, mandarim, francês ou italiano pode ser crucial para uma viagem de férias ou até uma nova oportunidade de trabalho.

Para a nossa sorte, já existem diversos aplicativos com inúmeros métodos de estudo que oferecem desde as lições básicas até exercícios para ajudar na fluência.

Confira cinco aplicativos escolhidos por Tilt para você sair por aí falando o idioma que desejar!

Duolingo: Aplicativos para aprender idiomas - Reprodução - Reprodução
Imagem: Reprodução

Duolingo

O aplicativo ensina idiomas de forma lúdica, com exercícios de repetição que ajudam desde quem já tem certo conhecimento até quem quer começar a aprender do zero. Ele foi bastante útil para eu aumentar o meu vocabulário de alemão, por exemplo, e está disponível em outras línguas, como inglês e espanhol. Além disso, você pode colocar metas e tem algumas recompensas para te incentivar a treinar.

Cambly: Aplicativos para aprender idiomas - Reprodução - Reprodução
Imagem: Reprodução

Cambly

Apesar de o aplicativo ser gratuito para baixar, suas aulas são pagas. Isso porque o Cambly trabalha com professores de países nativos de língua inglesa que ajudam o aluno naquilo que ele mais desejar: conversação, gramática, ou preparação para obter os certificados de proficiência TOELF ou IELTS. O usuário pode escolher um professor que esteja online na hora que desejar, ou marcar um horário com o seu docente preferido. O pagamento é feito de acordo com o número de aulas semanais e o tempo desejado por dia.

  • Gratuito; disponível para iOS e Android. Oferece compras e s dentro do app.

Busuu: Aplicativos para aprender idiomas - Reprodução - Reprodução
Imagem: Reprodução

Busuu

Com mais de dez idiomas disponíveis na plataforma, como inglês, espanhol e até chinês ou russo, o Busuu oferece diversos exercícios de escrita e fala que são corrigidos por nativos na língua escolhida pelo usuário. Além disso, permite fazer um teste de proficiência antes de começar as aulas.

  • Gratuito; disponível para iOS e Android. Oferece compras e s dentro do app.

Memrise: Aplicativos para aprender idiomas - Reprodução - Reprodução
Imagem: Reprodução

Memrise

Esse aplicativo funciona de maneira um pouco diferente dos outros. Ele foca na memorização de palavras e frases comuns para que a pessoa aumente seu vocabulário e aprenda um novo idioma. Sua didática ensina por meio de jogos, misturando diversão com aprendizado, deixando o processo mais leve.

  • Gratuito; disponível para iOS e Android. Oferece compras e s dentro do app.

Babbel: Aplicativos para aprender idiomas - Reprodução - Reprodução
Imagem: Reprodução

Babbel

Esse é um dos mais populares aplicativos para quem quer alcançar proficiência em alguma língua. Disponível em 14 idiomas, o Babbel tem diversos exercícios desde o nível iniciante até o mais avançado - mas pode parecer um pouco lento para quem já possui certo conhecimento em algum idioma. Vale bastante a pena para quem quer aprender do zero!

  • Gratuito; disponível para iOS e Android. Oferece compras e s dentro do app.

Todo domingo, Tilt mostra os melhores apps de algum tema para você baixar e aproveitar no celular.

SIGA TILT NAS REDES SOCIAIS