blogue 18ways
Uma forma nativa de IA de fazer i18n em Next.js, sem comprometer o SEO.
A internacionalização (muitas vezes abreviada para i18n), a localização (l10n) e o suporte multilingue descrevem todos a mesma ideia: adaptar o seu produto para que as pessoas o possam usar na sua própria língua.
Todas as empresas acabam por perceber que precisam de suportar vários idiomas. Nessa altura, a equipa de produto recosta-se, como um mecânico, puxa ar pelos dentes e diz: “Quantas páginas estamos a falar? Isso são pelo menos quatro sprints.”

A forma subjacente como implementamos i18n não mudou em 20 anos. A maioria das “boas práticas” de i18n foram definidas muito antes das arquiteturas web modernas, e tudo o que veio depois limitou-se a ser colocado por cima delas.
A i18n é a única parte do desenvolvimento web moderno que ainda envolve exportar ficheiros e enviá-los a alguém. É considerado uma configuração moderna se, em vez de os enviar por e-mail, os carregar através de uma API.
Num mundo de pipelines de CI e deploys medidos em minutos em vez de dias, provavelmente devemos dar-nos por felizes por não termos de enviar fax para nada.
O desenvolvimento web moderno avançou incrivelmente depressa.
Temos:
Ainda assim, os fluxos de trabalho de internacionalização continuam a parecer pertencer a outra era.
Mesmo aplicações relativamente pequenas acabam rapidamente a lidar com:
Os programadores não começam por querer construir sistemas assim. Entram neles às apalpadelas, à medida que os obstáculos comuns da i18n põem em apuros programadores que não estão familiarizados com a forma como línguas diferentes estruturam frases de maneiras completamente diferentes… e aceitam relutantemente o estado das coisas definido há 20 anos.
Com o tempo, a internacionalização torna-se uma das partes mais complexas da stack.
Considere uma IU simples:
<h1>Hello world!</h1>
<p>
<a href="#/">Click here</a> to view your <b>{serverResponse.productDescription}</b>
</p>Isto é fácil de entender. É simples.
Em determinado momento, decidimos internacionalizá-lo. Por isso, extraímos o texto para um ficheiro de tradução:
{
"mainPage": {
"greeting": "Hello world",
"cta": "<0>Click here</0> to view your <1>{{description}}</1>"
}
}E fazemos referência a isso no nosso código:
<h1>{t('mainPage.greeting')}</h1>
<p>
<Trans key="mainPage.cta">
<a href="#/">Click here</a> to view your <b>{{ description: serverResponse.productDescription }}</b>
</Trans>
</p>Mas, espera: agora temos texto em inglês tanto no nosso código como no ficheiro de tradução? Sim. Diferentes bibliotecas de i18n dão-lhe uma demão diferente, mas tentar traduzir texto que está parcialmente formatado, extraindo-o para um ficheiro JSON legível por humanos, é uma batalha perdida.
A IU moderna é estruturada, mas os sistemas de tradução são construídos sobre a base de strings simples.
Assim que entram em cena markup, variáveis e conteúdo dinâmico, a abstração começa a deixar escapar coisas.
As coisas ficam ainda mais difíceis quando o conteúdo não é estático.
Vejamos este exemplo novamente:
<b>{serverResponse.productDescription}</b>Essa string vem de uma API. Como é que a transformamos numa chave de tradução?
Spoiler: não. Agora o seu backend também precisa de suportar internacionalização.
O seu backend tem agora de gerir:
Os tradutores, de repente, também precisam de acesso a sistemas de backend.
E o problema só cresce quando entra em cena conteúdo gerado pelo utilizador.
Avaliações. Comentários. Listagens no marketplace. Fóruns.
As pipelines tradicionais de i18n partem do princípio de que os programadores controlam todo o texto. Cada vez mais, isso simplesmente não é verdade.
O facto de empresas como a Amazon terem começado a experimentar avaliações de utilizadores traduzidas em 2026 diz muito sobre a lentidão com que o ecossistema de i18n evoluiu.
Até determinar que idioma um utilizador pretende é surpreendentemente complicado.
Os browsers enviam preferências de idioma através do cabeçalho Accept-Language:
Accept-Language: en-GB,en;q=0.9,fr;q=0.8Isto diz ao servidor:
Na prática, implementar isto corretamente implica:
en, en-GB, en-US)Muitas frameworks deixam a maior parte desta lógica a cargo dos programadores.
Até a deteção básica de localidade muitas vezes acaba por se tornar código de aplicação personalizado.
A infraestrutura de tradução é apenas metade do problema.
Os utilizadores ainda precisam de uma forma de mudar de idioma.
A maioria das bibliotecas de i18n fornece a camada de tradução, mas deixa o resto do problema para o programador:
hreflang para SEOEstes detalhes parecem pequenos, mas rapidamente se tornam numa quantidade significativa de infraestruturas da aplicação, especialmente se não estiver familiarizado com todas as complexidades da i18n. A maioria das empresas e dos programadores não está.
Perante toda esta complexidade, algumas equipas recorrem a ferramentas automáticas de tradução de websites. Estas plataformas prometem traduzir o seu site automaticamente com um esforço mínimo.
Várias empresas estão a construir versões cada vez mais sofisticadas desta ideia. Infelizmente, introduzem um conjunto diferente de problemas:
O resultado é muitas vezes um site que, tecnicamente, suporta vários idiomas, mas oferece uma experiência visivelmente pior e é uma caixa negra para os programadores trabalharem.
Começámos com algo maravilhosamente simples:
<h1>Hello world!</h1>
<p>
<a href="#/">Click here</a> to view your <b>{serverResponse.productDescription}</b>
</p>E acabámos com chaves de tradução, dicionários JSON, pipelines fragmentados, camadas de localização de backend e frontend separadas, e ferramentas de tradução externas.
As aplicações web modernas são sistemas incrivelmente sofisticados. Ainda assim, as ferramentas de i18n pressupõem fluxos de trabalho concebidos para outra era, como um Ferrari com uma manivela para pôr o motor a trabalhar.
E se a internacionalização se parecesse mais com isto?
<h1><T>Hello world!</T></h1>
<p>
<T>
<a href="#/">Click here</a> to view your <b>{serverResponse.productDescription}</b>
</T>
</p>Sem chaves de tradução.
Sem dicionários JSON.
Sem pipelines manuais.
Apenas texto.
Esta ideia é a base por trás do 18ways.
O 18ways trata a tradução como uma preocupação de runtime optimizada. Extrair chaves de tradução e gerir ficheiros de tradução é um problema para máquinas, não para humanos.
Os programadores limitam-se a marcar o texto que querem traduzir.
Nos bastidores, o 18ways:
Tudo continua compatível com SSR e seguro para SEO.
Os sistemas tradicionais de i18n perdem o contexto.
Um tradutor poderá ver algo assim:
homeMas o que é que isso quer dizer?
Em alemão, estes significados exigem palavras completamente diferentes:
Haus — uma casaStartseite — a página inicialStart - uma etiqueta de navegaçãozum Anfang — regressar ao inícioSe tivesse de traduzir “home” para alemão, o que preferiria ver? Uma string isolada ou a página onde ela aparece realmente?

Os sistemas de tradução que só veem cadeias isoladas têm dificuldade em lidar com estas distinções.
A 18ways analisa as traduções no contexto da UI real.
Os nossos agentes de backend analisam as traduções à medida que aparecem em páginas reais e otimizam para:
Para quem está familiarizado com substantivos compostos alemães, não se preocupem, a deteção de overflow também está incluída.
Tudo o que ajuda a IA a produzir melhores traduções também ajuda os tradutores humanos.
O 18ways fornece aos tradutores o mesmo ambiente consciente do contexto que os nossos agentes de IA usam.
Em vez de editar ficheiros JSON, os tradutores revisam o texto diretamente na UI onde ele aparece.
Isto melhora drasticamente a precisão da tradução e a eficiência do fluxo de trabalho.
A internacionalização não precisa de outra camada de chaves de tradução, ficheiros de strings e cola de pipeline.
As aplicações modernas já têm a estrutura, o contexto e a informação de execução de que precisamos para fazer isto melhor.
A próxima geração de i18n deve ser construída para aplicações renderizadas no servidor, conteúdo dinâmico, fluxos de trabalho nativos de IA e tradutores humanos a trabalhar lado a lado.
Essa é a direção que a 18ways está a seguir.