Repository navigation
Internacionalizacao e dominios
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 |
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' },
],
}- Os arquivos ficam em
next/public/locales/<locale>/<namespace>.json, com um namespace por área:common,menu,home,dataset,prices,user,chatbotetc. - 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,enees. Uma chave ausente aparece crua na tela, comohome.title. - Para usar um namespace novo, crie o JSON nos três idiomas e inclua o namespace no
serverSideTranslationsdas 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.
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.orgebasedelosdatos.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/abcchega ao Next como/en/dataset/abc.
- O Ingress direct encaminha sem mudanças
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.
utils.js expõe:
-
getDomain()retornaNEXT_PUBLIC_DOMAIN, se estiver definida. Caso contrário, no navegador, retornawindow.location.hostnamesemwww.; no servidor, sem a variável, retorna"". -
isBasedosdadosDomain()retornatruesó quandogetDomain() === "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ãoisBasedosdadosDomain()retornafalsenesses ambientes.
Outros usos do domínio:
-
Login com Google (
pages/user/login.js): enviaredirect_origin=window.location.originao 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).
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.
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.
-
npm run devemlocalhost: o idioma padrão épt. Use/en/...e/es/...para os outros idiomas. - Docker Compose: um serviço por domínio, com
NEXT_PUBLIC_DOMAINdefinida (portasNEXT_PORT,3001e3002). - Para ver conteúdo exclusivo de
basedosdados.orgcom npm, definaNEXT_PUBLIC_DOMAIN="basedosdados.org". Veja Setup local.