From d2f79ae953b0275e21a4c4f640cfefc54b2f8d48 Mon Sep 17 00:00:00 2001 From: rafa Date: Mon, 31 Aug 2026 07:50:52 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20cerrar=20el=20bloqueante=20de=20traducc?= =?UTF-8?q?i=C3=B3n=20=E2=80=94=20endpoint=20crear-traduccion=20ya=20despl?= =?UTF-8?q?egado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Actualiza la guía de autoservicio de traducción con la llamada real a fea/v1/crear-traduccion (#225, ya en producción), verificada de extremo a extremo por Claudix contra prod con un post desechable. --- ...uia-traduccion-autoservicio-inma-mixbot.md | 70 +++++++++++-------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/docs/guia-traduccion-autoservicio-inma-mixbot.md b/docs/guia-traduccion-autoservicio-inma-mixbot.md index 32254c1..5668036 100644 --- a/docs/guia-traduccion-autoservicio-inma-mixbot.md +++ b/docs/guia-traduccion-autoservicio-inma-mixbot.md @@ -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 +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= +lang=en|fr|it|pt +title= +content= +excerpt= +status=draft|publish (default draft) +model= +``` + +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`).