Uma central de ajuda multilíngue sem páginas vazias

Product

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:

text
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:

Categorias de ajuda em lumen.kookee.dev/de/help: Erste Schritte, em alemão, ao lado de Dashboards e Billing, 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 artigo de ajuda em inglês Build a retention chart aberto no endereço alemão, com Deutsch no seletor de idiomas

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.

O cabeçalho do portal em lumen.kookee.dev/de/help com o seletor de idiomas aberto, mostrando English e Deutsch

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