Nota
O redirect por idioma quebra o link compartilhado
Detectar o idioma do navegador e redirecionar parece cortesia. Na prática, troca a página que alguém escolheu compartilhar, e quem mandou o link nunca fica sabendo.
Você manda um link da versão em inglês do seu site para alguém. O navegador dessa pessoa está em português, o site detecta e ajuda: abre a versão em português. A pessoa não viu a página que você escolheu mandar. E você nunca fica sabendo, porque para você o link sempre funcionou.
Esse é o modo de falha do redirect por Accept-Language, e ele é invisível por natureza: quem compartilha não vê o que quem recebe viu. Crawler sofre o mesmo problema, em escala. O robô de busca chega com um header qualquer e indexa a versão que o servidor escolheu, não a que a URL nomeia.
Neste site a regra é: o idioma sai do caminho, e só do caminho. Português na raiz, inglês sob /en. Nenhuma linha de código lê Accept-Language. Trocar de idioma é um gesto do visitante, num controle visível em toda página.
O custo existe e foi aceito: quem chega do exterior na raiz cai em português e paga um clique para trocar. Prefiro esse clique a um link que abre no lugar errado.
A parte que costuma faltar nessa conversa: a decisão virou verificação. Um teste varre o código e falha se aparecer leitura de Accept-Language ou um arquivo de middleware, os dois únicos lugares de onde um redirect desses sairia em Next. Decisão de arquitetura que não vira teste morre no primeiro refactor feito com pressa.