Localizar plantillas de temas de categoría

Siguiendo con mi solicitud original, aquí va un esbozo de implementación concreto; estaré encantado de ayudar con una PR si la dirección parece razonable.

Problema: Las plantillas de temas de categoría (categories.topic_template) no son localizables. El modelo CategoryLocalization y la preocupación Localizable solo cubren name y description, y el pipeline de Localización de Contenido con IA omite las plantillas en consecuencia. El compositor siempre inserta la plantilla de la lengua base, independientemente de la lengua del usuario.

Caso de uso: Operamos una comunidad bilingüe (DE/EN) en producción con Discourse AI Content Localization y traducción automática. La traducción de publicaciones/temas funciona muy bien, pero las plantillas de categoría para contenido estructurado — formularios de informes de errores con listas de verificación, flujos de confirmación de asistencia mediante BBCode [event] — no pueden duplicarse por idioma, porque el BBCode funcional debe existir exactamente una vez. La única solución alternativa es una única plantilla con etiquetas bilingües incómodas (“Versión de la app / App version:”), lo que perjudica la legibilidad para todos.

Propuesta:

  1. Añadir una columna de texto topic_template nula a category_localizations
  2. Compositor: si existe una localización para la lengua actual del usuario, usar su plantilla; en caso contrario, recurrir a category.topic_template
  3. Exponer/persistir el campo por idioma en la interfaz de administración de categorías (junto al nombre/descripción localizados)
  4. Incluir topic_template en el pipeline de Localización de Contenido con IA al traducir categorías (como description)

La migración es trivial (add_column :category_localizations, :topic_template, :text); el trabajo principal es la lógica de selección del compositor y la interfaz de administración.

Alternativas consideradas:

  • Plantilla única bilingüe (solución actual) — falla con bloques de BBCode funcionales
  • Componente de tema que inyecta texto por idioma — frágil, sin validación en el servidor, rompe los compositores de la API