Atenção: Este conteúdo foi traduzido automaticamente. Enviar feedback

Portfólio multilíngue: alcançando um público global

Papel: Desenvolvedor Full-Stackdez. de 2025

Um portfólio que fala seis idiomas, onde a parte difícil foi decidir o que não traduzir.


A decisão que moldou tudo

Uma pessoa desenvolvedora no Brasil lendo sobre "data pipelines" espera ver data pipelines, não canalizações de dados. O termo em inglês é o termo da indústria. Traduzi-lo soa estranho na melhor das hipóteses, e condescendente na pior.

Esse único exemplo definiu a regra do sistema inteiro: o trabalho não é traduzir um portfólio para seis idiomas. É decidir, termo a termo, o que deve sobreviver sem tradução — e então tornar essa decisão reproduzível.

O que o sistema faz

O site roda em next-intl com localePrefix: 'always', então toda rota fica aninhada sob um segmento de locale. i18n/config.ts define seis:

export const locales = ['en', 'pt-BR', 'es', 'ja', 'fr', 'de'] as const;
Fonte em inglês
Escreva uma vez em inglês
DeepL ou Claude
Tradução ou transcriação
Regras de localização
Aplicar regras de termos técnicos
Arquivos de locale
Seis versões de locale

O conteúdo vive em arquivos com sufixo de locale. hello-world.mdx é a base em inglês; hello-world.pt-BR.mdx e hello-world.ja.mdx ficam ao lado. lib/content.ts procura o arquivo do locale pedido e cai para a base em inglês quando ele não existe.

Os metadados de ordenação sempre vêm do arquivo base. Data, pinned e lastUpdated são lidos da fonte em inglês independentemente do locale renderizado, então um post não pode ocupar uma posição diferente na lista em japonês e na lista em inglês.

As strings de interface caem por deep merge. i18n/request.ts carrega messages/en.json como base e mescla o catálogo do locale por cima, chave a chave. Uma chave ausente renderiza a string em inglês em vez de um erro MISSING_MESSAGE, e um catálogo pela metade é seguro de publicar.

O fallback é sinalizado, não silencioso

Uma versão anterior desta página afirmava que o fallback para o inglês acontecia silenciosamente. Esse era o objetivo errado, e não é o que o site faz.

Quando uma página cai para o inglês, getContentLocaleStatus() retorna 'fallback', e duas coisas acontecem: o elemento de conteúdo é marcado com lang="en", de modo que leitores de tela e buscadores saibam qual idioma estão realmente recebendo, e um aviso de tradução visível aparece acima do conteúdo.

Servir inglês discretamente sob uma URL /ja/ enganaria tanto a pessoa leitora quanto o crawler. Dizer isso custa uma linha de interface.

Dois pipelines, trabalhos diferentes

O DeepL cuida da tradução direta — rápida, consistente e propensa a traduzir demais o vocabulário técnico. Um agente Claude cuida da transcriação: adapta expressões idiomáticas, reordena frases para um fluxo natural e mantém os termos técnicos em inglês conforme as regras abaixo.

npm run translate      # DeepL: messages/*.json
npm run translate:mdx  # DeepL: MDX content
npm run i18n:mdx       # Claude: transcreation
npm run i18n:sync      # Claude: fill missing translations

Ambos escrevem arquivos com sufixo de locale ao lado da fonte em inglês. Nenhum dos dois é confiado às cegas — a saída é lida antes de publicar, verificando que as chaves do frontmatter continuam em inglês, que caminhos de imagem e URLs não mudaram, que blocos de código e tabelas sobreviveram intactos e que valores de className não foram traduzidos.

Regras de localização na prática

Sempre traduzir: navegação e rótulos de interface, conteúdo dos artigos, campos de formulário, chamadas para ação.

Sempre manter em inglês: nomes de produtos (Next.js, TypeScript, Claude), nomes de empresas (Nike, Meta) e o vocabulário técnico que cada público já usa em inglês — API, dashboard, data pipeline, template.

Por locale:

  • pt-BR — "dashboard" e não "painel", "template" e não "modelo", "e-commerce" e não "comércio eletrônico"
  • es — "dashboard" e não "panel de control", "marketers" e não "vendedores"
  • ja — nomes de produtos em alfabeto latino, não em katakana; katakana para empréstimos comuns
  • fr — "dashboard" e não "tableau de bord"; CTAs naturais ("Contactez-moi")
  • de — "du" informal, empréstimos do inglês para termos técnicos, substantivos com inicial maiúscula
Como 'Projects' aparece em cada idioma

Projects

ENTradução literal

canalizações de dados

PT-BRLocalizada (preservada)

data pipelines

O que eu diria a mim mesmo no começo

Localização é uma decisão de produto vestida de decisão técnica. O pipeline foi a parte fácil; as regras sobre o que deixar em paz foram o trabalho, e são a parte que precisa estar escrita, porque são a parte que uma ferramenta de tradução vai errar alegremente todas as vezes.

A medida de sucesso não é o site ter seis idiomas. É alguém em São Paulo ou em Tóquio encontrar o vocabulário que teria usado.

Uma nota sobre as traduções

As traduções aqui são geradas por máquina e depois revisadas segundo as regras acima. Tradução automática é um ponto de partida, não um produto acabado.

Se algo soar estranho no seu idioma, a correção é bem-vinda pelo formulário de contato. Falantes nativos percebem o que a automação deixa passar.

Resultados

  • Seis locales: inglês, português (Brasil), espanhol, japonês, francês e alemão
  • Dois pipelines: DeepL para tradução direta, um agente Claude para transcriação
  • URLs por locale com alternates hreflang para cada idioma
  • Traduções ausentes caem para o inglês, sinalizadas em vez de escondidas
  • As regras de localização mantêm em inglês os termos técnicos que cada público espera