Ir al contenido

Sistema de traducción

Qué es esto

ComStack cuenta con dos sistemas de traducción. Esta página cubre la traducción de páginas: la traducción automática de documentación y páginas personalizadas al momento de publicar. Para la traducción de agentes de voz en vivo (detección de idioma en tiempo real durante conversaciones), consulta la documentación del agente de voz.

Cómo funciona

Al publicar, cada página promocionada se traduce automáticamente a todos los idiomas configurados para tu proyecto. El proceso sigue estos pasos:

  1. Promocionar borradores a versión en vivo
  2. Traducir automáticamente cada página promocionada a todos los idiomas configurados (en paralelo)
  3. Promocionar los borradores traducidos a versión en vivo
  4. Compilar y desplegar el sitio

Tanto la herramienta MCP publish-confirm como el endpoint de publicación de la API REST ejecutan el mismo proceso; no hay diferencia en el comportamiento de traducción entre ambos.

Cuándo usarlo

El sistema de traducción se ejecuta automáticamente en cada publicación. Configúralo definiendo los idiomas (locales) en los módulos de tu proyecto:

  • Páginas de conocimiento: modules.knowledge_base.locales
  • Páginas personalizadas: modules.custom_pages.locales

Configuración de idioma

Páginas de conocimiento vs. páginas personalizadas

MóduloCampo de configuraciónCuándo se traduce
Páginas de conocimiento (docs markdown)project.knowledge_base.localesAl publicar
Páginas personalizadasproject.custom_pages.localesAl publicar

Los idiomas de las páginas personalizadas siempre deben ser un superconjunto de los idiomas de las páginas de conocimiento.

Invariantes de configuración

Se aplican tres restricciones al escribir en default_locale o en los idiomas de los módulos:

ReglaRestricción
default_locale_in_custom_localesdefault_locale ∈ modules.custom_pages.locales (si el módulo está activo)
default_locale_in_knowledge_localesdefault_locale ∈ modules.knowledge_base.locales (si el módulo está activo)
knowledge_subset_of_custommodules.knowledge_base.locales ⊆ modules.custom_pages.locales (si ambos están activos)

Cualquier infracción devuelve un 400 con { error: "Locale config drift", violations: [...] }.

Añadir un idioma

PUT /api/projects/:projectId/modules/knowledge_base (o /custom_pages) con un array de locales que incluya nuevos códigos dispara una expansión automática:

  • Por cada nuevo idioma × cada página en el idioma original: se genera un borrador traducido
  • Los borradores permanecen en estado de borrador; ejecuta publish + publish-confirm para promocionarlos
  • Idempotente: los pares donde ya existe una variante (en vivo o borrador) para (canonical_slug, locale) se omiten

Un endpoint de vista previa (POST /api/projects/:projectId/modules/knowledge_base/locales/preview) devuelve el manifiesto esperado sin escribir nada.

Slugs traducidos y canonical_slug

Cada idioma obtiene su propia ruta URL nativa. Una página en inglés en /docs/getting-started podría traducirse a /es/docs/empezando.

El campo canonical_slug agrupa todas las variantes de idioma de la misma página:

CampoPropósito
canonical_slugClave de agrupación estable entre idiomas; se define al promocionar y no se sobrescribe
metadata.slugRuta URL específica del idioma (diferente por idioma)
source_doc_idApunta al documento original desde el cual se generó la traducción

canonical_slug se establece una vez y se preserva. Esto asegura que:

  • Una variante traducida mantenga el canonical de su idioma original
  • Una página renombrada permanezca en el mismo grupo hreflang que sus traducciones existentes
  • El paso de promoción reemplace documentos previos tanto por (metadata.slug, language) como por (canonical_slug, language), permitiendo que páginas re-traducidas con un slug cambiado reemplacen la variante antigua limpiamente

Excepción: slug === "index" nunca se traduce; el slug de la página de inicio permanece como "index" en todos los idiomas.

Qué se traduce por tipo de página

Páginas de conocimiento (markdown)

CampoComportamiento de traducción
metadata.titleTraducido
metadata.descriptionTraducido
metadata.slugTraducido — ruta URL en idioma nativo
contentMarkdown traducido
metadata.sidebar.*Copiado sin cambios (estructural)

Páginas personalizadas

Las páginas personalizadas tienen un patrón distinto porque el cuerpo original nunca debe modificarse:

CampoComportamiento de traducción
title, descriptionTraducido
body_sourceCopiado byte a byte — el código del autor nunca se modifica
translatable_stringsEl mapa { key: defaultText } se traduce valor por valor; las claves se preservan
canonical_slugCopiado idénticamente — las páginas personalizadas no tienen slugs por idioma
media_variants, og_imageCopiado idénticamente

Campo translate: false

Las plantillas de documentos pueden declarar campos individuales con translate: false. Estos campos se copian literalmente del idioma original a todos los idiomas de destino en lugar de traducirse. Aplica a title, description, slug y content cuando se declara.

Reparación de traducciones faltantes

Usa repair-translations (herramienta MCP, rol de manager) para rellenar traducciones faltantes bajo demanda:

  • Por cada página en el idioma original, genera cualquier variante de idioma activo que aún no exista
  • Promociona y despliega
  • Idempotente: los pares con una variante existente se omiten

Opciones:

  • dry_run: true — previsualiza el manifiesto sin escribir nada
  • doc_id — limita a una sola página original
  • locale — limita a un solo idioma de destino

repair-translations incluye una protección contra desviaciones: si el canonical_slug de una variante traducida no coincide con el de su original, se marca en drift_skipped[] y se omite. La desviación no se corrige con esta herramienta; se requiere una corrección de datos de canonical_slug específica.

Errores comunes

ErrorCausaSolución
400: Locale config driftUna escritura de idioma viola una de las tres invariantesVerifica qué invariante falla; ajusta default_locale o los arrays de idiomas
400: missing_source_indexSe añade un idioma pero no existe una página slug=index en el idioma por defectoPublica primero una página index en el idioma por defecto
Borradores de traducción no visiblesLa expansión genera borradores; requieren una publicación para estar en vivoEjecuta publish + publish-confirm tras añadir el idioma
Entradas hreflang duplicadasDos documentos originales comparten el mismo canonical_slugAsegúrate de que cada página tenga un canonical_slug único

Relacionado

Última actualización: