Aprenda a implementar internacionalização (i18n) de forma integrada nas suas aplicações Next.js para alcançar um público global. Aborda roteamento, tradução de conteúdo e melhores práticas.
Internacionalização com Next.js: Construindo Aplicações Multilíngues para um Público Global
No mundo interconectado de hoje, construir aplicações que atendem a um público global já não é um luxo – é uma necessidade. O Next.js, uma poderosa framework de React, oferece recursos robustos para implementar a internacionalização (i18n), permitindo-lhe criar aplicações multilíngues que proporcionam uma experiência localizada a utilizadores em todo o mundo. Este guia abrangente irá orientá-lo através dos conceitos essenciais, técnicas e melhores práticas para construir aplicações Next.js internacionalizadas.
Entendendo Internacionalização e Localização
Antes de mergulhar nos detalhes do i18n do Next.js, vamos clarificar os termos chave:
- Internacionalização (i18n): O processo de projetar e desenvolver uma aplicação para que possa ser facilmente adaptada a várias línguas e regiões sem exigir alterações de engenharia. Isso envolve abstrair texto, formatação e outros elementos específicos da localidade.
- Localização (l10n): O processo de adaptar uma aplicação a uma língua e região específicas. Isso inclui traduzir texto, ajustar formatos de data e hora, símbolos de moeda e muito mais.
Essencialmente, o i18n prepara a sua aplicação para a localização. Ao separar elementos dependentes do idioma do código principal, torna-se mais fácil localizar a aplicação para diferentes mercados.
Por que Implementar Internacionalização no Next.js?
Implementar i18n na sua aplicação Next.js oferece inúmeros benefícios:
- Alcance Expandido: Alcance um público mais vasto ao fornecer conteúdo no seu idioma preferido.
- Experiência do Utilizador Melhorada: Ofereça uma experiência mais personalizada e envolvente para utilizadores em diferentes regiões.
- SEO Aprimorado: Melhore a otimização para motores de busca (SEO) ao fornecer conteúdo localizado que visa regiões geográficas específicas.
- Aumento das Conversões: Aumente as conversões apresentando informações na língua nativa do utilizador, promovendo confiança e compreensão.
- Presença de Marca Global: Estabeleça uma presença de marca global mais forte, demonstrando um compromisso com a inclusividade e atendendo a públicos diversos.
Recursos e Configuração de i18n no Next.js
O Next.js oferece suporte integrado para i18n através das suas funcionalidades de roteamento e gestão de conteúdo. A seguir, uma análise das funcionalidades importantes:
1. Configurando o i18n em next.config.js
A configuração central do i18n reside no ficheiro next.config.js
. Eis um exemplo:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // Um array de localidades suportadas (códigos de idioma)
defaultLocale: 'en', // A localidade padrão a ser usada
localeDetection: true, // Ativar/desativar a deteção automática de localidade com base nas configurações do navegador (opcional)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Explicação:
locales
: Um array contendo os códigos de idioma (ex.,'en'
para inglês,'es'
para espanhol,'fr'
para francês) dos idiomas suportados pela sua aplicação. Certifique-se de seguir os códigos de idioma ISO 639-1 para consistência.defaultLocale
: O idioma padrão que a sua aplicação usará. Este é o idioma exibido se nenhum outro idioma for especificado no URL ou detetado nas configurações do navegador do utilizador. Escolha um idioma que seja representativo do seu público-alvo principal.localeDetection
: Um valor booleano que controla se o Next.js deteta automaticamente o idioma preferido do utilizador com base nas suas configurações do navegador. Se definido comotrue
, o Next.js tentará redirecionar o utilizador para a versão do idioma apropriado do seu site.domains
(opcional): Um array que lhe permite associar localidades a domínios específicos. Isto é útil se tiver domínios separados para diferentes idiomas (ex.,example.com
para inglês,example.es
para espanhol).
2. Roteamento com Prefixos de Localidade
O Next.js adiciona automaticamente prefixos de localidade às rotas. Por exemplo, se tiver uma página em /about
e a localidade for 'es' (espanhol), o URL tornar-se-á /es/about
. Isto permite diferentes versões de idioma das páginas e permite que os motores de busca indexem o conteúdo para cada localidade. A framework trata do redirecionamento e do roteamento por si.
3. Utilizando o Hook useRouter
O hook useRouter
de next/router
fornece acesso à localidade atual e outras informações de roteamento.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Localidade atual: {locale}
Localidades disponíveis: {locales.join(', ')}
Localidade padrão: {defaultLocale}
);
}
export default MyComponent;
O objeto router
oferece as seguintes propriedades chave:
locale
: A localidade atualmente selecionada (ex., 'en', 'es', 'fr').locales
: Um array de todas as localidades suportadas definidas emnext.config.js
.defaultLocale
: A localidade padrão definida emnext.config.js
.asPath
: O caminho como exibido no navegador, incluindo o prefixo da localidade (ex.,/es/about
).pathname
: O caminho sem o prefixo da localidade (ex.,/about
).
Estratégias de Tradução de Conteúdo
Depois de configurar a sua aplicação Next.js para i18n, precisará de implementar estratégias para traduzir o seu conteúdo. Aqui estão várias abordagens populares:
1. Usando um Sistema de Gestão de Tradução (TMS) Dedicado
Para projetos de grande escala com muitos idiomas, um TMS é altamente recomendado. Opções populares incluem:
- Phrase: Um TMS baseado na nuvem com integrações para várias plataformas, incluindo Next.js. Oferece recursos colaborativos e fluxos de trabalho automatizados.
- Localize: Outro TMS baseado na nuvem que suporta uma vasta gama de formatos de ficheiro e fornece funcionalidades de gestão de tradução.
- Crowdin: Um poderoso TMS muito popular na comunidade de código aberto, que se integra bem com o Next.js, permitindo que as equipas traduzam conteúdo de forma eficiente.
Benefícios:
- Gestão de tradução centralizada.
- Recursos de colaboração para tradutores.
- Automação de fluxos de trabalho de tradução.
- Integração com o seu fluxo de trabalho de desenvolvimento.
2. Criando Ficheiros de Tradução JSON
Para projetos mais pequenos, usar ficheiros JSON para armazenar traduções é um método simples e eficaz.
Exemplo de Estrutura de Diretórios:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Exemplo en.json
:
{
"greeting": "Olá, mundo!",
"welcomeMessage": "Bem-vindo ao nosso site."
}
Exemplo es.json
:
{
"greeting": "Olá, mundo!",
"welcomeMessage": "Bem-vindo ao nosso site."
}
Exemplo MyComponent.js
:
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
function MyComponent() {
const { locale } = useRouter();
const t = locale === 'es' ? es : en;
return (
{t.greeting}
{t.welcomeMessage}
);
}
export default MyComponent;
Esta abordagem oferece flexibilidade e é direta para projetos mais pequenos. Geralmente, é fácil de atualizar e manter.
3. Usando uma Biblioteca de Tradução
Várias bibliotecas de JavaScript simplificam a tradução de conteúdo dentro dos seus componentes React.
next-i18next
: Uma biblioteca popular especificamente desenhada para o Next.js. Integra-se bem com a framework e oferece funcionalidades como renderização do lado do servidor (SSR) e tradução do lado do cliente.react-i18next
: Uma biblioteca de i18n de propósito geral para React. Pode usá-la nas suas aplicações Next.js, embora possa exigir mais configuração em comparação comnext-i18next
.
Exemplo com next-i18next
(Instalação: npm install next-i18next i18next react-i18next
):
Crie um ficheiro de configuração i18n (ex., i18n.js
no seu diretório raiz):
// i18n.js
import { createServerSideHelpers } from 'next-i18next'
import { i18n } from './next-i18next.config'
export function initI18next(req, res, namespaces = ['common']) {
const helpers = createServerSideHelpers(
req,
res,
i18n,
namespaces
)
return helpers
}
export { appWithTranslation } from 'next-i18next'
export { i18n }
Crie a sua configuração Next.js para next-i18next.
// next-i18next.config.js
const { i18n } = require('./next-i18next.config');
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'fr'],
},
// outra configuração
}
module.exports = nextConfig
Adicione a configuração e a importação da tradução ao seu _app.js
:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Crie uma pasta e preencha-a com as localidades para as suas traduções.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Exemplo en/common.json:
{
"greeting": "Olá, mundo!",
"welcomeMessage": "Bem-vindo ao nosso site."
}
Usando a tradução num componente:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Este exemplo usa o hook useTranslation
para obter traduções com base na localidade atual.
Lidando com Rotas Dinâmicas e Geração de Site Estático (SSG)
A internacionalização torna-se mais complexa ao lidar com rotas dinâmicas (ex., publicações de blog, páginas de produtos) e geração de site estático (SSG).
1. Rotas Dinâmicas (ex: /blog/[slug])
Para rotas dinâmicas, precisará de gerar os caminhos corretos para cada localidade durante o tempo de construção usando getStaticPaths
. Esta função retorna um array de caminhos que o Next.js deve pré-renderizar.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Obter dados das publicações do blog
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // ou 'blocking' se quiser mostrar um estado de carregamento
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Explicação:
getStaticPaths
: Esta função itera através das suas publicações de blog e gera um caminho para cada publicação e cada localidade. O objetoparams
contém os parâmetros da rota (ex., o slug da publicação do blog).locale
: Este parâmetro fornece a localidade atual, permitindo-lhe obter o conteúdo traduzido para a localidade específica.fallback
: Determina como o Next.js lida com caminhos não definidos emgetStaticPaths
.fallback: false
gera páginas 404 para caminhos indefinidos.fallback: 'blocking'
pré-renderiza páginas sob demanda.
2. Geração de Site Estático (SSG) com getStaticProps
Em getStaticProps
, pode obter conteúdo traduzido com base no parâmetro locale
.
export async function getStaticProps({ params, locale }) {
// Obter conteúdo com base na localidade e nos parâmetros
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
A função getPostBySlug
deve obter o conteúdo traduzido para o slug e localidade fornecidos, que pode ser recuperado dos seus ficheiros de tradução, base de dados ou um CMS.
3. Renderização do Lado do Servidor (SSR) com getServerSideProps
Para conteúdo que precisa de ser obtido no momento do pedido, use getServerSideProps
. Isto é útil se o conteúdo mudar frequentemente ou for personalizado para cada utilizador.
export async function getServerSideProps({ params, locale, req, res }) {
// Obter dados com base na localidade e nos parâmetros (ex., de uma base de dados)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Melhores Práticas para a Internacionalização com Next.js
Seguir estas melhores práticas ajudá-lo-á a construir aplicações multilíngues robustas, fáceis de manter e amigáveis para o utilizador:
- Planeie Cedo: Considere a internacionalização desde o início do seu projeto. É muito mais fácil implementá-la à partida do que adaptá-la mais tarde.
- Separe o Conteúdo do Código: Armazene todo o texto traduzível em ficheiros separados (ex., ficheiros JSON ou um TMS) e evite embutir texto diretamente nos seus componentes.
- Use um Sistema de Gestão de Tradução (TMS): Para projetos maiores, um TMS pode simplificar o processo de tradução e melhorar a colaboração.
- Teste exaustivamente: Teste a sua aplicação em todos os idiomas suportados para garantir traduções precisas, formatação correta e renderização adequada em diferentes navegadores e dispositivos. Teste em dispositivos reais, não apenas em emuladores.
- Considere Idiomas da Direita para a Esquerda (RTL): Se suportar idiomas como árabe ou hebraico, garanta que o seu design e layout acomodam a direção do texto da direita para a esquerda. O Next.js não lida com isto automaticamente, sendo necessárias soluções com CSS ou outras.
- Lide com a Formatação de Data e Hora: Use bibliotecas ou funções integradas para formatar datas e horas de acordo com a localidade do utilizador. Moment.js e date-fns são duas bibliotecas populares que são úteis.
- Gira a Formatação de Números e Moedas: Formate corretamente números e símbolos de moeda com base na localidade do utilizador.
- Otimize o SEO: Use meta tags específicas do idioma (
hreflang
) para ajudar os motores de busca a indexar o seu conteúdo corretamente. Inclua códigos de idioma nos seus URLs. - Priorize a Experiência do Utilizador: Forneça uma maneira clara e intuitiva para os utilizadores alternarem entre idiomas. Considere oferecer deteção automática de idioma com base nas configurações do navegador.
- Mantenha-se Atualizado: Mantenha a sua versão do Next.js e as bibliotecas de i18n atualizadas para beneficiar das últimas funcionalidades e correções de segurança.
- Considere a Acessibilidade (a11y): Garanta que o seu conteúdo traduzido é acessível a utilizadores com deficiência. Forneça texto alternativo para imagens e use atributos ARIA apropriados. Use leitores de ecrã para testar.
Considerações de SEO para Sites Internacionalizados
Otimizar o seu site internacionalizado para os motores de busca é essencial para gerar tráfego orgânico de todo o mundo. Aqui estão algumas das melhores práticas de SEO:
- Etiquetas
hreflang
: Implemente etiquetashreflang
no<head>
do seu HTML para informar os motores de busca sobre as variações de idioma e regionais do seu conteúdo. Isto é crucial para SEO. Por exemplo:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
e<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- URLs Específicos do Idioma: Use códigos de idioma nos seus URLs (ex.,
/en/about
,/es/acerca-de
). Isto indica claramente o idioma do conteúdo tanto para os utilizadores como para os motores de busca. - Conteúdo Localizado: Traduza o seu conteúdo de forma precisa e natural. As traduções automáticas devem ser revistas por um falante nativo.
- Meta Descrições e Títulos Localizados: Escreva meta descrições e títulos únicos e atraentes para cada idioma para melhorar as taxas de cliques nos resultados de pesquisa.
- Sitemaps XML: Crie e submeta sitemaps XML que incluam todas as variações de idioma das suas páginas.
- Linkagem Interna: Use links internos apropriados entre as versões de idioma do seu conteúdo.
- Pesquisa de Palavras-chave Específica do País: Realize pesquisa de palavras-chave em cada idioma para identificar os termos que os utilizadores estão a pesquisar em cada região.
Exemplo: Construindo um Blog Multilíngue Simples
Vamos criar um exemplo simplificado de um blog multilíngue usando o Next.js. Isto fornecerá uma ilustração mais concreta de como aplicar os conceitos discutidos acima.
1. Configuração do Projeto
Crie um novo projeto Next.js:
npx create-next-app my-multi-lang-blog
cd my-multi-lang-blog
2. Configure o i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Crie os Ficheiros de Tradução
Crie uma pasta locales
no diretório raiz e adicione os seguintes ficheiros JSON:
locales/en.json
:
{
"title": "Bem-vindo ao Meu Blog",
"postTitle": "Minha Primeira Publicação",
"postContent": "Este é o conteúdo da minha primeira publicação no blog."
}
locales/es.json
:
{
"title": "Bem-vindo ao meu Blog",
"postTitle": "Minha Primeira Publicação",
"postContent": "Este é o conteúdo da minha primeira publicação do blog."
}
locales/fr.json
:
{
"title": "Bem-vindo ao Meu Blog",
"postTitle": "Meu Primeiro Artigo",
"postContent": "Este é o conteúdo do meu primeiro artigo de blog."
}
4. Crie o Componente de Publicação do Blog (ex: components/BlogPost.js
)
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function BlogPost() {
const router = useRouter();
const { locale } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
{translations.postTitle}
{translations.postContent}
);
}
export default BlogPost;
5. Crie a Página de Índice (pages/index.js
)
import { useRouter } from 'next/router';
import BlogPost from '../components/BlogPost';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function HomePage() {
const router = useRouter();
const { locale, locales } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
);
}
export default HomePage;
Este exemplo simplificado mostra os princípios fundamentais da internacionalização com Next.js. Pode expandir esta estrutura básica para incluir funcionalidades mais complexas, como rotas dinâmicas e integração com sistemas de gestão de tradução. Considere melhorar os links acima com o componente Link
e adicionar o atributo locale
apropriado.
6. Execute a Aplicação
Execute a aplicação com:
npm run dev
Agora pode aceder ao seu blog em http://localhost:3000
(inglês), http://localhost:3000/es
(espanhol), e http://localhost:3000/fr
(francês). Deverá ver o título e o conteúdo da publicação do blog traduzidos com base na localidade selecionada.
Conclusão
O Next.js fornece um conjunto abrangente de funcionalidades para implementar a internacionalização nas suas aplicações web. Seguindo os princípios e técnicas delineados neste guia, pode criar aplicações multilíngues que oferecem experiências localizadas a utilizadores em todo o mundo. Lembre-se de planear a sua estratégia de i18n cedo, escolher o método de tradução certo para as suas necessidades e priorizar a experiência do utilizador. Com planeamento e execução cuidadosos, pode construir aplicações que ressoam com um público global e desbloqueiam novas oportunidades de crescimento. A aprendizagem contínua, mantendo-se a par dos últimos lançamentos e melhores práticas, garantirá que está a utilizar as suas ferramentas e tecnologias de forma eficaz.
À medida que a tecnologia avança, espere ver surgir funcionalidades de i18n mais avançadas. A capacidade de alcançar utilizadores de diferentes culturas e grupos linguísticos continuará a ser uma prioridade chave para os desenvolvedores de aplicações em todo o mundo. Portanto, dominar os fundamentos do i18n é uma habilidade valiosa que aumentará o seu valor no cenário de desenvolvimento global de hoje.