Um projeto no Kookee podia ter a central de ajuda em inglês e alemão, e o portal hospedado mostrava todas as páginas em inglês mesmo assim. Os artigos em alemão existiam, e a API os teria devolvido. O portal é que nunca os pedia.
O seletor de idiomas no cabeçalho do portal piorava a situação. Era o seletor da própria interface do Kookee, com os seis idiomas em que os botões do Kookee existem. Escolher Deutsch traduzia os menus e deixava todos os artigos em inglês. Um projeto escrito em italiano ganhava um seletor sem italiano.
Percebi isso enquanto levava o banner de anúncios do portal para o @kookee/react, e corrigi na mesma versão, o Kookee 1.29.0.
Cada idioma ganha seu próprio endereço
Quem manda a página em alemão para um colega precisa de um endereço em alemão para mandar. Coloquei o idioma no caminho da URL e deixei o idioma padrão sem segmento. No portal de demonstração do Lumen, que tem inglês e alemão, fica assim:
lumen.kookee.dev/help/getting-started/invite-your-team inglês, o padrão
lumen.kookee.dev/de/help/erste-schritte/dein-team-einladen alemão
lumen.kookee.dev/en/help/getting-started/invite-your-team → /help/getting-started/invite-your-team
lumen.kookee.dev/fr/help/getting-started/invite-your-team → /help/getting-started/invite-your-team
lumen.kookee.dev/de/help/getting-started/invite-your-team → /de/help/erste-schritte/dein-team-einladen
O idioma padrão não tem segmento porque todo link de portal que existia antes se referia ao idioma padrão: links em e-mails, em posts antigos, nas respostas do MCP do Kookee e nos payloads de webhooks. Eles continuam funcionando e significando a mesma coisa, e o Kookee continua montando os links desse jeito.
Os redirecionamentos mantêm um endereço por página. /en/ num projeto cujo idioma padrão é o inglês leva ao endereço sem segmento. O mesmo acontece com um idioma que o projeto não tem, ou que removeu depois: um link /fr/ compartilhado antes da remoção do francês cai na página em inglês, e não num 404. E um slug em inglês sob /de/, o endereço que você obtém ao digitar /de na frente de um link em inglês, leva ao slug próprio do artigo em alemão.
Onde falta tradução, aparece o idioma padrão
A central de ajuda do Lumen tem 12 artigos em inglês. Três deles, os de Getting started, também existem em alemão. Um leitor alemão abre lumen.kookee.dev/de/help.
O portal poderia esconder os outros nove. A central de ajuda em alemão pareceria completa: três artigos, todos em alemão. O leitor que precisa do artigo sobre cobrança nem fica sabendo que ele existe, e escreve ao suporte sobre uma dúvida que estava respondida em inglês desde o começo.
Poderia mostrá-los com um aviso de “ainda não traduzido”. Pensei nisso e desisti: o leitor vê que o artigo está em inglês.
Ou poderia mostrar o artigo em inglês no endereço alemão, sem aviso, como a API do Kookee e o widget do site já faziam. É o que o portal faz agora. Os cards de categoria em /de/help mostram Erste Schritte, a versão alemã de Getting started, ao lado de Dashboards, Billing e Guides, que existem só em inglês:

Um artigo que só existe em inglês, aberto a partir dali, mantém o endereço /de/: o seletor continua mostrando Deutsch, e o próximo link que o leitor segue continua sob /de/.

O próprio artigo leva lang="en", então o leitor de tela o lê com uma voz em inglês, em vez de pronunciar palavras inglesas pelas regras do alemão. Para árabe e hebraico, o artigo também recebe a direção da direita para a esquerda.
A mesma regra vale para o resto do portal. As listas do blog, do registro de alterações e das páginas mostram o idioma do leitor onde há tradução e o idioma padrão onde não há. As categorias de ajuda são associadas entre os idiomas, então um artigo sem tradução abre dentro da versão alemã da sua categoria. A busca procura primeiro no idioma da página, depois no idioma padrão.
Por que o kookee.dev, ao contrário, esconde posts sem tradução
Meu próprio blog faz o oposto. kookee.dev/de/blog lista só os posts que existem em alemão, e um link alemão para um post que só existe em inglês redireciona para a página em inglês.
A diferença são os buscadores. O kookee.dev é indexado, e um artigo em inglês servido num endereço alemão é uma segunda URL com o mesmo texto. Prefiro dar ao Google um endereço por texto. Os portais enviam X-Robots-Tag: noindex, então os buscadores deixam as páginas do portal de fora, e para quem lê vale mais ver o artigo no idioma padrão.
O seletor de idiomas lista só os seus idiomas
Agora o seletor lista os idiomas do projeto, cada um com o próprio nome: Deutsch, Italiano, 日本語. Escolher um leva à mesma página nesse idioma: à tradução do artigo, se houver, ou ao mesmo artigo sob o novo segmento, se não houver.

Um projeto com um só idioma não mostra seletor nenhum. Os idiomas de um projeto ficam em Configurações → Projeto, em Idiomas suportados, e o seletor aparece no cabeçalho, no menu do celular e no rodapé assim que há dois.
Tirei dos portais o seletor da interface do Kookee por completo. O portal pertence ao projeto, e o leitor que vê seis idiomas ali vai esperar os artigos nos seis. Botões e menus continuam seguindo a última escolha do leitor ou o navegador dele e, na falta das duas, o inglês. Escolher um idioma de conteúdo que a interface do Kookee também tem (inglês, russo, espanhol, francês, português ou alemão) muda também o idioma dos botões. Escolher italiano os deixa como estavam.
Não há redirecionamento pelo idioma do navegador. Um leitor com o navegador em alemão chega em lumen.kookee.dev/help e vê inglês, com o seletor no cabeçalho.
O que mais mudou no portal
O widget do site no portal lê a ajuda e responde no idioma da página. Antes ele seguia o idioma da interface, então podia mostrar ajuda em alemão ao lado de uma página em inglês.
O banner de anúncios mostra os anúncios no idioma da página.
A página inicial do portal conta um artigo e as traduções dele uma vez só. Antes contava cada idioma separadamente.
Denunciar esta página numa página traduzida agora registra a denúncia no artigo. Antes ela ia para o projeto.
O que não mudou: tags do blog e hreflang
A contagem de uma tag no blog do portal continua somando todos os idiomas. Os portais não ganham links hreflang nem sitemaps, já que os buscadores não os indexam.
Como usar o portal público explica os endereços, o seletor e os redirecionamentos do portal, e Conteúdo multilíngue e idioma de fallback mostra a mesma regra pelo SDK, para uma central de ajuda no seu próprio site.
Continue lendo
Seu widget de suporte deve seguir o idioma da página, não o do navegador — como o widget do site escolhe o idioma no seu próprio site, e por que confia na página e não no navegador.
Como montar uma central de ajuda para o seu SaaS — estrutura, categorias e busca, antes de traduzir qualquer parte.
Mostre o widget no idioma dos seus visitantes — as opções de idioma do widget, de
data-localeasetLocale().
