# Lazy loading traduções

Carregar todos os seus arquivos de tradução de uma vez é exagero e desnecessário.

Lazy loading (carregamento lento) ou carregamento assíncrono de arquivos de tradução é muito fácil de implementar usando o Webpack.

Suponde que temos um diretório de projeto com a seguinte estrutura:

nosso-projeto-legal
-dist
-src
--routes
--store
--setup
---i18n-setup.js
--lang
---en.js
---it.js

O diretório lang contém todos os arquivos de tradução. Vários arquivos de configuração são agrupados no diretório setup, por exemplo, configurações i18n, registro de componentes globais, inicialização de plugin e muito mais.

// i18n-setup.js
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import messages from '@/lang/en'
import axios from 'axios'

Vue.use(VueI18n)

export const i18n = new VueI18n({
  locale: 'en', // defenindo localidade
  fallbackLocale: 'en',
  messages // definindo mensagens de localização
})

const loadedLanguages = ['en'] // nosso idioma padrão que é pré-carregado

function setI18nLanguage(lang) {
  i18n.locale = lang
  axios.defaults.headers.common['Accept-Language'] = lang
  document.querySelector('html').setAttribute('lang', lang)
  return lang
}

export function loadLanguageAsync(lang) {
  // Se a localização for a mesma
  if (i18n.locale === lang) {
    return Promise.resolve(setI18nLanguage(lang))
  }

  // Se a localização já foi carregada
  if (loadedLanguages.includes(lang)) {
    return Promise.resolve(setI18nLanguage(lang))
  }

  // Se a localização ainda não foi carregada
  return import(
    /* webpackChunkName: "lang-[request]" */ `@/i18n/messages/${lang}.js`
  ).then(messages => {
    i18n.setLocaleMessage(lang, messages.default)
    loadedLanguages.push(lang)
    return setI18nLanguage(lang)
  })
}

Em resumo, estamos criando uma nova instância VueI18n como normalmente faríamos. Então estamos criando um array loadedLanguages que irá manter o controle de nossos idiomas carregados. A seguir está função setI18nLanguage que realmente mudará a localização na instância vueI18n, axios e onde for necessário.

A função loadLanguageAsync será usada para alterar o idioma. O carregamento de novos arquivos é feito pela função import que o Webpack fornece e nos permite carregar arquivos dinamicamente, e por usar promessas podemos facilmente esperar que o carregamento termine.

Você pode aprender mais sobre a função de importações dinâmicas na documentação do Webpack (opens new window).

É muito fácil usar loadLanguageAsync. Por exemplo, no hook beforeEach do vue-router.

router.beforeEach((to, from, next) => {
  const lang = to.params.lang
  loadLanguageAsync(lang).then(() => next())
})

Poderíamos melhorar isso verificando se lang é realmente suportado ou não e chamando reject para que possamos pegar isso no beforeEach parando a transição da rota de navegação.