docs: cerrar el bloqueante de traducción en la guía de autoservicio (#222) #226

Merged
rafa merged 1 commits from docs/crear-traduccion-cierre-222 into main 2026-08-31 11:51:07 +00:00
Showing only changes of commit d2f79ae953 - Show all commits
@@ -2,9 +2,9 @@
> **Para quién es este documento:** para Inma y Mixbot, a partir de la conversación del
> 2026-08-31 en Buzz: además del audio ([#222](https://gitea.feadulta.com/rafa/feadulta/issues/222),
> ver `docs/guia-tts-audio-autoservicio-inma-mixbot.md`), Rafa quiere traspasar también la
> traducción. A diferencia del audio, hoy **no hay un issue abierto pidiéndolo** — este
> documento adelanta el trabajo para cuando se dispare.
> ver `docs/guia-tts-audio-autoservicio-inma-mixbot.md`), Rafa confirmó que la traducción se
> traspasa también. El endpoint para enlazar traducciones (PR #225) se hizo bajo el paraguas
> del propio #222.
>
> **Motores autorizados por Rafa (2026-08-31):** un agente local con Haiku desde el propio
> Claude/Cowork de Inma (no la API de pago de Rafa — es otra cuenta, otro caso), o MiniMax
@@ -13,28 +13,43 @@
---
## 0. Antes de nada: esto también tiene un tope bloqueante
## 0. Crear y enlazar la traducción — ya resuelto
Igual que pasaba con el audio, **hoy no hay forma de decirle a WordPress "esta traducción
va en inglés y es la versión de este post en español"** desde fuera. Ese enlace (idioma +
grupo de traducción) lo gestiona Polylang con dos funciones PHP internas
(`pll_set_post_language`, `pll_save_post_translations`) que **no están expuestas por REST**
ni siquiera de lectura (el único endpoint que hay, `fea/v1/lang/{id}`, solo lee el idioma, no
permite fijarlo ni enlazar grupos).
Ya existe un endpoint que crea el post traducido **y** lo enlaza con Polylang (idioma +
grupo de traducción) en una sola llamada — no hace falta tocar nada de bajo nivel:
Podéis crear el post traducido por `POST /wp/v2/posts` sin problema (igual que cualquier
artículo), pero **quedaría suelto**: sin idioma asignado y sin enlace Polylang al original en
español, así que el selector de idioma del sitio no lo encontraría y no contaría como "la
traducción EN de este artículo".
```
POST https://www.feadulta.com/wp-json/fea/v1/crear-traduccion
Authorization: Basic <usuario:contraseña_de_aplicación>
Content-Type: multipart/form-data
**Esto necesita el mismo tipo de solución que el audio**: un endpoint `fea/v1/crear-traduccion`
(o registrar la taxonomía `language` de Polylang en REST con permisos de administrador) que
haga internamente lo mismo que ya hace `scripts/fea_translate_helper.php::create` en local:
crear el post, `pll_set_post_language($id, $lang)`, y `pll_save_post_translations($grupo)`
enlazándolo con el ES. No lo he encargado todavía — es una pieza más grande que la del audio
(toca la lógica central de multiidioma del sitio) y prefiero que Rafa decida el momento y el
alcance antes de que Codix la construya. Documento aquí el resto del proceso para que, en
cuanto ese hueco se cierre, solo falte la llamada final.
es_id=<ID del post ES>
lang=en|fr|it|pt
title=<título traducido>
content=<HTML traducido>
excerpt=<opcional>
status=draft|publish (default draft)
model=<opcional, solo trazabilidad — p.ej. "minimax" o "haiku-local">
```
Respuesta (`201` si crea, `200` si ya existía — **es idempotente**, repetir la llamada con el
mismo `es_id`/`lang` nunca duplica):
```json
{"es_id": 56786, "lang": "en", "translation_id": 56787, "created": true,
"url": "https://www.feadulta.com/en/?p=56787"}
```
Por detrás replica exactamente lo que hacía `scripts/fea_translate_helper.php::create` en
local: asigna el idioma antes de las categorías, mapea cada categoría del ES a su
equivalente traducida (o la deja en español si no existe traducción de esa categoría),
preserva el resto del grupo de traducciones si el ES ya tenía otros idiomas, y añade los
metas de trazabilidad (`traduccion_automatica`, `traduccion_origen`, `traduccion_modelo`,
`traduccion_fecha`).
Verificado por Claudix el 2026-08-31 con una prueba real de extremo a extremo en producción
(post ES desechable → traducción EN creada → confirmado con `pll_get_post_translations` que
el grupo quedó `{es: ..., en: ...}` — todo borrado después).
---
@@ -153,9 +168,8 @@ ritmo), parad y reintentad más tarde, no machaquéis la API.
## 7. Qué falta para que esto sea autoservicio de verdad
- **Bloqueante (§0):** endpoint o mecanismo para fijar idioma + enlazar grupo Polylang de
cada traducción — sin esto podéis generar el texto pero no "engancharlo" al sitio como
traducción real, igual que pasaba con el audio antes del #222.
- Decisión pendiente de Rafa (no la resuelvo yo aquí): si vuestro agente de traducción va a
tener acceso de shell/SSH al WordPress (como tenía Hermes) o va a ser puramente REST como
el resto de vuestro trabajo — cambia bastante el diseño del endpoint que haría falta.
Con el endpoint del §0 ya no queda ningún bloqueante de infraestructura conocido para crear
y enlazar traducciones por REST. Lo que sigue siendo trabajo vuestro, no de infraestructura:
generar el texto (motores del principio del documento), aplicar el QA del §4 antes de
llamar al endpoint, y decidir cuándo pasáis una traducción de `draft` a `publish` (mismo
criterio que la carta en español, ver `docs/guia-publicacion-carta-inma.md`).