Volver a la wiki

Wiki Editor y Auto-traduccion

Wiki Editor y Auto-traduccion

Editor markdown integrado en workspace.crearack.com que permite editar articulos de la wiki directamente desde el navegador, con traduccion automatica al ingles para alimentar el Help Widget de CreaRack Pro.

Arquitectura general

Editor (workspace)          Cloudflare Pages Functions          GitHub API
     |                              |                              |
     |  POST /api/wiki/content      |                              |
     |  (content_b64)               |                              |
     |----------------------------->|  PUT contents/wiki/file.md   |
     |                              |----------------------------->|
     |                              |           commit ES          |
     |                              |<-----------------------------|
     |   200 OK (commit sha)        |                              |
     |<-----------------------------|                              |
     |                              |                              |
     |  POST /api/wiki/translate    |                              |
     |----------------------------->|  GET wiki/file.md (ES)       |
     |                              |----------------------------->|
     |                              |<-----------------------------|
     |                              |                              |
     |                              |  Gemini 2.5 Flash            |
     |                              |  (traduce title+desc+body)   |
     |                              |                              |
     |                              |  PUT wiki-en/file.md (EN)    |
     |                              |----------------------------->|
     |                              |  PUT wiki-en/titles.json     |
     |                              |----------------------------->|
     |   200 OK                     |                              |
     |<-----------------------------|                              |

Flujo completo paso a paso

1. Acceder al editor

Cada articulo de la wiki tiene un boton Editar en la esquina superior derecha. Al pulsarlo, navega a:

/wiki/edit?file=crearack--conceptos--que-es-crearack.md&return=/wiki/crearack/conceptos/que-es-crearack

El parametro file usa el formato de nombre de archivo plano (con -- como separador), no el slug (con /). La pagina [...slug].astro se encarga de la conversion automaticamente.

2. Cargar el contenido

El editor llama a GET /api/wiki/content?file=<nombre>.md que:

3. Editar

El editor presenta dos paneles side-by-side:

Funcionalidades:

4. Guardar (commit en GitHub)

Al pulsar Guardar, el editor:

  1. Codifica el contenido en base64 (necesario para evitar que Cloudflare WAF bloquee markdown como XSS)
  2. Envia POST /api/wiki/content con { file, content_b64, sha }
  3. La CF Pages Function decodifica y commitea en GitHub via API
  4. Refetch del SHA para permitir ediciones sucesivas

5. Auto-traduccion (commit EN en GitHub)

Inmediatamente despues de guardar, el editor dispara (fire-and-forget):

POST /api/wiki/translate { file: "nombre-del-archivo.md" }

La CF Pages Function translate.ts:

  1. Lee el archivo ES recien commiteado desde GitHub API
  2. Traduce frontmatter quirurgicamente — solo title y description via Gemini, category_label via mapa estatico. NO envia el YAML completo a Gemini (esto causaba alucinaciones)
  3. Traduce el body completo con Gemini 2.5 Flash
  4. Commitea la version EN en src/content/wiki-en/
  5. Actualiza wiki-en/titles.json (mapa ES→EN de titulos)

El editor muestra el estado: “Guardado — traduciendo EN…” → “Guardado + traducido EN” o “Guardado (traduccion fallida)”.

6. Servir en Help Widget

El Help Widget de CreaRack Pro (/api/help/*) lee automaticamente las versiones EN:

No requiere ningun paso adicional — al estar en GitHub, el Help Widget lo lee en la siguiente peticion.

Archivos del sistema

Workspace (CreaRackSL-workspace)

ArchivoFuncion
src/pages/wiki/edit.astroPagina del editor (UI + logica JS)
src/pages/wiki/[...slug].astroBoton “Editar” en cada articulo
functions/api/wiki/content.tsGET (leer) + POST (guardar) via GitHub API
functions/api/wiki/translate.tsTraduccion individual ES→EN via Gemini
functions/api/biblioteca/wiki-titles.tsServir titles.json (mapa titulos ES→EN)
src/content/wiki/Articulos en espanol (fuente de verdad)
src/content/wiki-en/Articulos traducidos al ingles
src/content/wiki-en/titles.jsonMapa de titulos ES→EN

CreaRack Pro

ArchivoFuncion
core/api_help.pyProxy /api/help/* — transforma ES→EN para el widget
static/js/alpine-components.jsComponente Alpine helpWidget
templates/base.htmlHTML del panel Help (en todas las paginas)

Script legacy

ArchivoFuncion
scripts/translate-wiki.mjsBatch translation (manual). Tiene bug de alucinacion en frontmatter — usar el endpoint translate.ts en su lugar

Variables de entorno requeridas (CF Pages)

VariableProposito
GH_PATGitHub Personal Access Token con Contents: Read and write
GOOGLE_AI_API_KEYAPI key de Google AI para Gemini (traduccion)

Gotchas y consideraciones

Formato del parametro file

Los articulos wiki usan dos formatos:

La API siempre espera el formato filename. La conversion se hace en [...slug].astro (al generar el enlace Editar) y en edit.astro (al normalizar el parametro recibido).

Cloudflare WAF y base64

Cloudflare WAF inspecciona el body de las peticiones POST y bloquea contenido que parezca XSS/injection (markdown con headers #, HTML, code blocks). La solucion es enviar el contenido codificado en base64:

// Browser (edit.astro)
content_b64: btoa(unescape(encodeURIComponent(textareaEl.value)))

// Server (content.ts) — pasa directo a GitHub API que tambien espera base64
const base64 = content_b64;

Traduccion quirurgica del frontmatter

El script legacy (translate-wiki.mjs) enviaba el frontmatter YAML completo a Gemini, que alucinaba contenido inventado (ej: “Installation Guide” en vez de traducir). El endpoint translate.ts resuelve esto traduciendo solo los campos title y description como strings individuales, y usando un mapa estatico para category_label.

GH_PAT permisos

El token necesita Contents: Read and write (fine-grained) o scope repo (classic) para poder commitear via GitHub API. Solo con Read, las escrituras devuelven 403.

Doble commit

Cada edicion genera dos commits en GitHub:

  1. wiki: update <nombre> — version ES
  2. wiki-en: auto-translate <nombre> — version EN + titles.json

Esto es normal y esperado.

Véase también

Subir