Un proyecto de Kookee podía tener su centro de ayuda en inglés y en alemán, y aun así su portal mostraba todas las páginas en inglés. Los artículos en alemán estaban ahí, y la API los habría devuelto. El portal nunca los pedía.
El selector de idioma de la cabecera del portal lo empeoraba. Era el selector de la interfaz del propio Kookee, con los seis idiomas a los que están traducidos sus botones. Al elegir Deutsch, los menús pasaban al alemán y todos los artículos seguían en inglés. Un proyecto escrito en italiano recibía un selector sin italiano.
Me topé con esto mientras pasaba el banner de anuncios del portal a @kookee/react, y lo corregí en la misma versión: Kookee 1.29.0.
Cada idioma tiene su propia dirección
Quien envía la página en alemán a un colega necesita una dirección en alemán que enviarle. Puse el idioma en la ruta y dejé sin él al idioma predeterminado. En el portal de demostración de Lumen, que está en inglés y en alemán, queda así:
lumen.kookee.dev/help/getting-started/invite-your-team inglés, el predeterminado
lumen.kookee.dev/de/help/erste-schritte/dein-team-einladen alemán
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
El idioma predeterminado no lleva segmento porque todos los enlaces al portal que existían antes se referían a él: enlaces en correos, en publicaciones antiguas, en las respuestas del MCP de Kookee y en los payloads de los webhooks. Siguen funcionando y siguen significando lo mismo, y Kookee los sigue generando así.
Las redirecciones mantienen una sola dirección por página. /en/ en un proyecto cuyo idioma predeterminado es el inglés lleva a la dirección sin segmento. Lo mismo pasa con un idioma que el proyecto no tiene o que eliminó después: un enlace /fr/ compartido antes de quitar el francés lleva a la página en inglés en lugar de a un 404. Y un slug en inglés bajo /de/, la dirección que obtienes al escribir /de delante de un enlace en inglés, lleva al slug propio del artículo en alemán.
Si falta una traducción, se muestra el idioma predeterminado
El centro de ayuda de Lumen tiene 12 artículos en inglés. Tres de ellos, los de Getting started, también existen en alemán. Un lector alemán abre lumen.kookee.dev/de/help.
El portal podría ocultar los otros nueve. Entonces el centro de ayuda en alemán parece terminado: tres artículos, todos en alemán. El lector que necesita el artículo de facturación no se entera de que existe y escribe a soporte por algo que tenía respuesta en inglés desde el principio.
Podría mostrarlos con una nota de «aún sin traducir». Lo pensé y lo descarté: el lector ya ve que el artículo está en inglés.
O podría mostrar el artículo en inglés en la dirección alemana, sin nota, como ya hacían la API de Kookee y el widget del sitio. Eso es lo que hace ahora el portal. Las tarjetas de categoría de /de/help muestran Erste Schritte, la versión alemana de Getting started, junto a Dashboards, Billing y Guides, que solo existen en inglés:

Un artículo que solo existe en inglés, abierto desde ahí, conserva su dirección /de/: el selector sigue diciendo Deutsch, y el siguiente enlace que abra el lector se queda bajo /de/.

El propio artículo lleva lang="en", así que un lector de pantalla lo lee con voz inglesa en lugar de pronunciar palabras inglesas con las reglas del alemán. Para el árabe y el hebreo también fija la dirección de derecha a izquierda.
El resto del portal sigue la misma regla. Las listas del blog, del registro de cambios y de las páginas muestran el idioma del lector donde hay traducción y el idioma predeterminado donde no la hay. Las categorías de ayuda se emparejan entre idiomas, así que un artículo sin traducir se abre dentro de la versión alemana de su categoría. La búsqueda mira primero en el idioma de la página y después en el predeterminado.
Por qué kookee.dev, en cambio, oculta las publicaciones sin traducir
Mi propio blog hace lo contrario. kookee.dev/de/blog muestra solo las publicaciones que existen en alemán, y un enlace en alemán a una publicación que solo está en inglés redirige a la página en inglés.
La diferencia está en los buscadores. kookee.dev está indexado, y un artículo en inglés servido en una dirección alemana es una segunda URL con el mismo texto. Prefiero darle a Google una sola dirección por texto. Los portales envían X-Robots-Tag: noindex, así que los buscadores dejan fuera sus páginas, y para los lectores es mejor ver el artículo en el idioma predeterminado.
El selector de idioma muestra solo tus idiomas
Ahora el selector muestra los idiomas del proyecto, cada uno con su propio nombre: Deutsch, Italiano, 日本語. Al elegir uno, vas a la misma página en ese idioma: a la traducción del artículo si existe, o al mismo artículo bajo el nuevo segmento si no existe.

Un proyecto con un solo idioma no muestra ningún selector. Los idiomas de un proyecto se eligen en Configuración → Proyecto, en Idiomas soportados, y el selector aparece en la cabecera, en el menú móvil y en el pie de página en cuanto hay dos.
Quité por completo de los portales el selector de interfaz de Kookee. Un portal pertenece al proyecto, y un lector que ve ahí seis idiomas esperará encontrar los artículos en seis. Los botones y los menús siguen la última elección del lector o su navegador, y si no, el inglés. Elegir un idioma de contenido que la interfaz de Kookee también tiene (inglés, ruso, español, francés, portugués o alemán) cambia también los botones. Elegir italiano los deja como estaban.
No hay redirección según el idioma del navegador. Un lector con el navegador en alemán llega a lumen.kookee.dev/help y ve la página en inglés, con el selector en la cabecera.
Qué más cambió en el portal
El widget del sitio en el portal muestra la ayuda y responde en el idioma de la página. Antes seguía el idioma de la interfaz, así que podía mostrar ayuda en alemán junto a una página en inglés.
El banner de anuncios muestra los anuncios en el idioma de la página.
La página de inicio del portal cuenta un artículo y sus traducciones una sola vez. Antes contaba cada idioma por separado.
Denunciar esta página en una página traducida ahora asocia el aviso al artículo. Antes lo asociaba al proyecto.
Sin cambios: etiquetas del blog y hreflang
El recuento de una etiqueta en el blog del portal sigue sumando todos los idiomas. Los portales no tienen enlaces hreflang ni sitemaps, porque los buscadores no los indexan.
Usar el portal público explica las direcciones, el selector y las redirecciones del portal, y Contenido multilingüe e idioma de respaldo, el mismo comportamiento a través del SDK, para un centro de ayuda en tu propio sitio.
Sigue leyendo
Tu widget de soporte debe leer el idioma de la página, no el del navegador — cómo elige idioma el widget del sitio en tu propia web y por qué se fía de la página antes que del navegador.
Cómo crear un centro de ayuda para tu SaaS — estructura, categorías y búsqueda, antes de traducir nada.
Muestra el widget en el idioma de tus visitantes — las opciones de idioma del widget, de
data-localeasetLocale().
