Skip to content

Internacionalizacao e dominios

AldemirLucas edited this page Oct 16, 2026 · 1 revision

Internacionalização e domínios

O website é servido em três idiomas, cada um com seu domínio:

Locale Domínio Marca
pt (padrão) basedosdados.org Base dos Dados
en data-basis.org Data Basis
es basedelosdatos.org Base de los Datos

Configuração do Next

next-i18next.config.js define os locales e o domínio de cada um (i18n.domains), com localeDetection: false. Ou seja, o idioma vem do domínio ou do prefixo da URL, nunca do navegador.

i18n: {
  defaultLocale: 'pt',
  locales: ['pt', 'en', 'es'],
  localeDetection: false,
  domains: [
    { domain: 'basedosdados.org',   defaultLocale: 'pt' },
    { domain: 'data-basis.org',     defaultLocale: 'en' },
    { domain: 'basedelosdatos.org', defaultLocale: 'es' },
  ],
}

Traduções

  • Os arquivos ficam em next/public/locales/<locale>/<namespace>.json, com um namespace por área: common, menu, home, dataset, prices, user, chatbot etc.
  • Cada página declara os namespaces de que precisa em getStaticProps/getServerSideProps:
    ...(await serverSideTranslations(locale, ['home', 'common', 'menu', 'dataset']))
  • Nos componentes, use const { t } = useTranslation('namespace').
  • Todo texto novo precisa existir em pt, en e es. Uma chave ausente aparece crua na tela, como home.title.
  • Para usar um namespace novo, crie o JSON nos três idiomas e inclua o namespace no serverSideTranslations das páginas que o usam.

O conteúdo editorial não usa os JSONs:

  • Blog: next/blog/{pt,en,es}/. Veja o CONTRIBUTING.
  • Docs, FAQ, termos, guias: next/content/, com arquivos por idioma.

Como os domínios chegam ao Next

Em staging e produção existe uma única imagem e um único Deployment para os três domínios. A separação é feita pelo ingress (charts/basedosdados-website/templates/ingress.yaml):

  • basedosdados.org: um Ingress encaminha tudo para o serviço, sem reescrever a URL.
  • data-basis.org e basedelosdatos.org: cada um tem dois Ingresses.
    • O Ingress direct encaminha sem mudanças /_next/*, /favicon_default.ico, /api/* e /<locale>/*.
    • O Ingress rewrite reescreve qualquer outro caminho para /<locale>/$1. Exemplo: data-basis.org/dataset/abc chega ao Next como /en/dataset/abc.

Os hosts de cada ambiente (staging.data-basis.org, development.basedelosdatos.org etc.) são definidos nos workflows de deploy. Veja CI/CD e deploy.

Detectando o domínio no código

utils.js expõe:

  • getDomain() retorna NEXT_PUBLIC_DOMAIN, se estiver definida. Caso contrário, no navegador, retorna window.location.hostname sem www.; no servidor, sem a variável, retorna "".
  • isBasedosdadosDomain() retorna true só quando getDomain() === "basedosdados.org". É usada para mostrar conteúdo exclusivo do Brasil, como consultoria.

NEXT_PUBLIC_DOMAIN é definida no docker-compose.yaml, um valor por serviço, mas não nas imagens de CI. Em staging e produção, getDomain() depende do hostname do navegador.

Em staging e development o hostname é staging.basedosdados.org / development.basedosdados.org, então isBasedosdadosDomain() retorna false nesses ambientes.

Outros usos do domínio:

  • Login com Google (pages/user/login.js): envia redirect_origin=window.location.origin ao backend, para que o OAuth volte ao mesmo domínio. O backend mantém uma lista de domínios permitidos.
  • Discord (getDiscordUrl(locale)): há um servidor por idioma.
  • SQL gerado (utils.js): o alias da tabela muda conforme o idioma (dados / data / datos).

Troca de idioma

components/atoms/LanguageSelector.js chama router.push(pathname, asPath, { locale }). Como cada locale tem um domínio, o Next leva a pessoa ao domínio correspondente, mantendo o caminho.

Rotas com nome diferente por idioma

O produto Pro se chama BD Pro em pt/es e DB Pro em en. Em next.config.js:

Tipo De Para Condição
rewrite /dbpro /bdpro sempre (a página é pages/bdpro.js)
redirect (302) /bdpro /dbpro host data-basis.org (com ou sem www)
redirect (302) /en/bdpro /en/dbpro sempre

Para criar outra rota com nome traduzido, siga o mesmo padrão: um arquivo em pages/, um rewrite para o nome alternativo e um redirect no domínio que deve usar o nome alternativo.

Localmente

  • npm run dev em localhost: o idioma padrão é pt. Use /en/... e /es/... para os outros idiomas.
  • Docker Compose: um serviço por domínio, com NEXT_PUBLIC_DOMAIN definida (portas NEXT_PORT, 3001 e 3002).
  • Para ver conteúdo exclusivo de basedosdados.org com npm, defina NEXT_PUBLIC_DOMAIN="basedosdados.org". Veja Setup local.

Clone this wiki locally