Hoje em dia, nossas aplicações tem tomado proporções nunca antes imagináveis, e a web nos deu a possibilidade de fazer com que ele seja acessado por todo o mundo. É ai que muitos desenvolvedores enfrentam um problema...
Como fazer para que meu app seja traduzido de uma forma rápida e eficiente?
Para a nossa felicidade, bibliotecas como o React possuem alternativas extremamente fáceis de implementar essa funcionalidade, e hoje, vamos conhecer uma delas, o plugin i18next.
Implementando a internacionalização
Para começar, vamos as nossas dependências. Se você deseja iniciar um app do zero, vamos utilizar o comando abaixo e criar um novo app react:
yarn create react-app i18napp --template typescript
Se você já tem um projeto ou acabou de criar o seu, instale as dependências que vamos precisar para que o i18next funcione da forma correta:
yarn add react-i18next i18next i18next-http-backend i18next-browser-languagedetector
Pronto, agora já temos os pacotes que precisamos. Vamos por a mão no código!!!
Configurando o i18next
Para indicar ao nosso app o uso da internacionalização e ativar propriamente os hooks nele, devemos preparar um arquivo que ficará junto ao nosso index.js, ele se chamará i18n.js e conterá as seguintes linhas:
import i18n from 'i18next' import Backend from 'i18next-http-backend' import LanguageDetector from 'i18next-browser-languagedetector' import { initReactI18next } from 'react-i18next' i18n // Habilita o backend do i18next .use(Backend) // Habilita a detecção automática de linguagem .use(LanguageDetector) // Habilita o módulo de inicialização do hook .use(initReactI18next) .init({ // Linguagem padrão utilizada fallbackLng: 'en', debug: true, // Detecta e guarda um cookie em cache da linguagem fornecida detection: { order: ['queryString', 'cookie'], cache: ['cookie'] }, interpolation: { escapeValue: false } }) export default i18n;
Após isso, devemos importa-lo para nosso index.js, que ficará dessa forma:
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; import * as serviceWorker from './serviceWorker'; import './i18n'; ReactDOM.render( <React.StrictMode> <Suspense fallback={<div>Loading...</div>}> <App /> </Suspense> </React.StrictMode>, document.getElementById('root') ); // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. // Learn more about service workers: https://bit.ly/CRA-PWA serviceWorker.unregister();
Pronto, o react i18next está habilitado e pronto para uso. Agora o próximo passo é incorporar nosas traduções.
Incorporando os locales
Internacionalizações na web funcionam a base de json com seções de palavras. Nesse app, vamos incorporar a língua inglesa e portuguesa.
Para isso, em nossa pasta /public vamos adicionar a pasta /locales que terá duas subpastas, /en e /pt, ambas com um arquivo translation.json que conterá o objeto com as traduções. Veja um exemplo do arquivo em inglês e a estrutura da pasta produzida:
{ "title": "Welcome to an internationalized APP", "description": { "part1": "To get started, edit <1>src/App.js</1> and save to reload.", "part2": "Switch language between english and german using buttons above." } }
Estrutura da pasta locales
Feito isso, vamos por a mão na massa com nossa página inicial.
Personalizando o App.js
Agora vamos para nossa parte final, construir nossa página inicial. Para isso, vamos apagar o conteúdo original do App.js e deixar somente uma div.
Importando o hook de tradução
Para importar o hook do i18next utilizamos o seguinte código:
import { useTranslation } from "react-i18next"; function App() { const { t, i18n } = useTranslation();
O atributo t é usado para incorporar nossa tradução e o i18n para observar as mudanças no estado da localização.
Utilizando a tradução em tags
Para utilizar um atributo do nosso objeto, apenas chamamos a função t() que desestruturamos acima:
<div><h1>{t("title")}</h1></div>
Viu como é facil?
Vamos completar nosso app com o código abaixo adicionando dois botões que mudarão a linguagem e ver a mágica em tempo real...
import React from "react"; import "./App.css"; import { useTranslation } from "react-i18next"; function App() { const { t, i18n } = useTranslation(); const changeLanguage = (language) => { i18n.changeLanguage(language); }; return ( <div className="App"> <button onClick={() => changeLanguage("en")}>EN</button> <button onClick={() => changeLanguage("pt")}>PT</button> <hr /> <div><h1>{t("title")}</h1></div> <div>{t("description.part1")}</div> <div>{t("description.part2")}</div> </div> ); } export default App;
Observando a mágica
Se você inseriu o código da forma correta, a mágica abaixo deve acontecer com seu app. A tradução é feita em tempo de execução.
Gostou? O código está disponivel no meu github.
Obrigado pela leitura!!!
Top comments (1)
para que serve o i18next-http-backend?