docs(mcp): enlace traducible por idioma en set_record_translations

Path absoluto con prefijo (/en/...); CocoEnlace regenera las filas al
cambiar el enlace base. Actualizados tool description, ACAI_ENDPOINTS y
docs 04/09/11b.
This commit is contained in:
Jordan Diaz
2026-07-16 20:56:03 +00:00
parent d46c204ed0
commit 76a63ce4e4
5 changed files with 7 additions and 7 deletions

View File

@@ -162,9 +162,9 @@ En sitios multiidioma las traducciones NO viven en la fila del registro: se guar
- Para leer un registro ya traducido, pasa `lang: "<prefix>"` a `get_record` o `list_table_records`. - Para leer un registro ya traducido, pasa `lang: "<prefix>"` a `get_record` o `list_table_records`.
- El campo `identificador` de `textos_generales` (los literales del filtro Twig `| translate`) se traduce por su campo `texto`. - El campo `identificador` de `textos_generales` (los literales del filtro Twig `| translate`) se traduce por su campo `texto`.
### Regla dura: nunca traduzcas `enlace` ### El `enlace` traducido lo define el usuario
El campo `enlace` NUNCA se traduce a mano — lo mantiene el motor CocoEnlace. La action PHP rechaza cualquier intento de traducir `enlace`. No lo incluyas en `set_record_translations`. El `enlace` traducido es editable con `set_record_translations` (formato: path absoluto con prefijo de idioma, p.ej. `/en/contact/` para la página base `/contacto/`). Solo hazlo si el usuario lo pide; ten en cuenta que al cambiar el `enlace` base, CocoEnlace regenera automáticamente las filas de enlace por idioma (formato `/<prefix><enlaceBase>`) y puede pisar la personalización.
## Patrón canónico — Detalle de registro ## Patrón canónico — Detalle de registro

View File

@@ -161,7 +161,7 @@ Las webs multiidioma guardan las traducciones en la tabla central `cms_traduccio
|------|--------|-------| |------|--------|-------|
| `list_web_languages` | Lista los idiomas activos del sitio (`settings.dat.php [idiomas]`) | Devuelve `prefix`/`urlPrefix`/`isDefault`. `prefix="www"` = idioma base (URLs sin prefijo); otro prefix (p.ej. `en`) = idioma bajo `/en/...` | | `list_web_languages` | Lista los idiomas activos del sitio (`settings.dat.php [idiomas]`) | Devuelve `prefix`/`urlPrefix`/`isDefault`. `prefix="www"` = idioma base (URLs sin prefijo); otro prefix (p.ej. `en`) = idioma bajo `/en/...` |
| `get_record_translations` | Lee traducciones de uno o varios registros | Por `tableName` (sin `cms_`) + `recordNums`. Opcional `fields` y `prefix`. Devuelve `{recordNum:{prefix:{fieldName:valor}}}` ya decodificado | | `get_record_translations` | Lee traducciones de uno o varios registros | Por `tableName` (sin `cms_`) + `recordNums`. Opcional `fields` y `prefix`. Devuelve `{recordNum:{prefix:{fieldName:valor}}}` ya decodificado |
| `set_record_translations` | Escribe traducciones de un registro + idioma | `tableName`+`recordNum`+`prefix`+`fields`. `''` borra la traducción. **`enlace` prohibido** (lo mantiene CocoEnlace) | | `set_record_translations` | Escribe traducciones de un registro + idioma | `tableName`+`recordNum`+`prefix`+`fields`. `''` borra la traducción. `enlace`: path absoluto con prefijo (`/en/...`); CocoEnlace lo regenera si cambia el enlace base |
Además, las tools de lectura `list_table_records` y `get_record` aceptan el parámetro opcional `lang` (prefix, p.ej. `'en'`): devuelven los valores ya traducidos de los campos traducibles (el motor CocoDB aplica la traducción en lectura). Además, las tools de lectura `list_table_records` y `get_record` aceptan el parámetro opcional `lang` (prefix, p.ej. `'en'`): devuelven los valores ya traducidos de los campos traducibles (el motor CocoDB aplica la traducción en lectura).

View File

@@ -92,7 +92,7 @@ Resumen ejecutable de reglas críticas, tipos de campo, filtros y formatos de da
| Regla | Detalle | | Regla | Detalle |
|-------|---------| |-------|---------|
| Prefix `www` = idioma base | URLs sin prefijo. Otro prefix (p.ej. `en`) sirve bajo `/en/...` — lista con `list_web_languages` | | Prefix `www` = idioma base | URLs sin prefijo. Otro prefix (p.ej. `en`) sirve bajo `/en/...` — lista con `list_web_languages` |
| Nunca traducir `enlace` | Lo mantiene CocoEnlace; la action PHP lo rechaza | | Traducir `enlace` con cuidado | Es editable por idioma (path absoluto, p.ej. `/en/contact/`); si cambia el enlace base, CocoEnlace lo regenera |
| Valor `''` borra la traducción | `set_record_translations` con `''` elimina la fila y cae al idioma base | | Valor `''` borra la traducción | `set_record_translations` con `''` elimina la fila y cae al idioma base |
| Base64 transparente | El valor se guarda Base64 en `cms_traducciones`; tú siempre pasas/recibes texto plano | | Base64 transparente | El valor se guarda Base64 en `cms_traducciones`; tú siempre pasas/recibes texto plano |
| `multitext` = JSON completo | Se traduce el JSON serializado entero en una sola fila, no item por item | | `multitext` = JSON completo | Se traduce el JSON serializado entero en una sola fila, no item por item |

View File

@@ -384,7 +384,7 @@ Notas: `prefix === "www"` es el idioma base (URLs sin prefijo, `urlPrefix === ""
} }
``` ```
**Respuesta**: `{ success: true, updated: number, deleted: number }` **Respuesta**: `{ success: true, updated: number, deleted: number }`
**Errores**: `{ error: { message: string, code: string } }` — p.ej. si se intenta traducir `enlace` (prohibido: lo mantiene CocoEnlace). **Errores**: `{ error: { message: string, code: string } }` — p.ej. campos de sistema (`num`, `builder`, `controlador`). `enlace` SÍ es traducible: debe ser un path absoluto (se normaliza la barra inicial); al cambiar el enlace base, CocoEnlace regenera las traducciones.
Notas: Notas:
- Solo campos traducibles: `textfield`, `textbox`, `wysiwyg`, `codigo`, `multitext` (el multitext se traduce como el JSON serializado completo en una fila). - Solo campos traducibles: `textfield`, `textbox`, `wysiwyg`, `codigo`, `multitext` (el multitext se traduce como el JSON serializado completo en una fila).

View File

@@ -17,7 +17,7 @@ Four usage scenarios:
Rules: Rules:
- An EMPTY STRING ('') as a value DELETES that translation (falls back to base language at runtime). - An EMPTY STRING ('') as a value DELETES that translation (falls back to base language at runtime).
- The 'enlace' field is NEVER translated by hand — the CocoEnlace engine maintains it; the PHP rejects it. - 'enlace' IS translatable: absolute path with the language prefix (e.g. '/en/contact/'). Note: when the base 'enlace' changes, CocoEnlace regenerates per-language rows and may overwrite it.
- multitext fields are translated as the full serialized JSON string in a single row (translate the whole JSON value, not individual items). - multitext fields are translated as the full serialized JSON string in a single row (translate the whole JSON value, not individual items).
- prefix is the language code from list_web_languages (e.g. 'en'); do NOT write to prefix 'www' (base language is edited via normal record fields, not translations). - prefix is the language code from list_web_languages (e.g. 'en'); do NOT write to prefix 'www' (base language is edited via normal record fields, not translations).
@@ -30,7 +30,7 @@ Params:
tableName: z.string().describe("Table name without 'cms_' prefix (e.g. 'apartados', 'builder_custom', 'textos_generales')"), tableName: z.string().describe("Table name without 'cms_' prefix (e.g. 'apartados', 'builder_custom', 'textos_generales')"),
recordNum: z.number().describe("Record 'num' primary key to translate"), recordNum: z.number().describe("Record 'num' primary key to translate"),
prefix: z.string().describe("Target language prefix from list_web_languages (e.g. 'en'). Never 'www' (base language)."), prefix: z.string().describe("Target language prefix from list_web_languages (e.g. 'en'). Never 'www' (base language)."),
fields: z.record(z.string()).describe("Map { fieldName: translatedValue }. Empty string '' deletes the translation. 'enlace' is forbidden."), fields: z.record(z.string()).describe("Map { fieldName: translatedValue }. Empty string '' deletes the translation. 'enlace' must be an absolute path (e.g. '/en/contact/')."),
}), }),
{ readOnlyHint: false, destructiveHint: false }, { readOnlyHint: false, destructiveHint: false },
withAuth(async ({ tableName, recordNum, prefix, fields }, extra) => { withAuth(async ({ tableName, recordNum, prefix, fields }, extra) => {