Un centro de ayuda multilingüe sin páginas vacías

Product

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

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

Categorías de ayuda en lumen.kookee.dev/de/help: Erste Schritte, en alemán, junto a Dashboards y Billing, 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 artículo de ayuda en inglés Build a retention chart abierto en su dirección alemana, con Deutsch en el selector de idioma

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.

La cabecera del portal en lumen.kookee.dev/de/help con el selector de idioma abierto, que muestra English y Deutsch

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