feat(mcp): tools de idiomas y traducciones

- Nueva categoria tools/languages: list_web_languages,
  get_record_translations y set_record_translations (registros, config,
  textos_generales y vars de modulo via builder_custom).
- Param lang opcional en list_table_records y get_record
  (options.translates de CocoDB).
- Docs actualizados (03/04/06/09/11b + ACAI_ENDPOINTS) con el modelo de
  cms_traducciones y los workflows de traduccion.
This commit is contained in:
Jordan Diaz
2026-07-16 20:09:47 +00:00
parent d475845c27
commit d46c204ed0
13 changed files with 382 additions and 3 deletions

View File

@@ -323,6 +323,75 @@ action=uploadModify
**Usado por**: `delete_record_upload`
**Headers**: `X-Acai-Token`, `X-Requested-With: XMLHttpRequest`
## Categoría: Idiomas y traducciones (multiidioma)
Las traducciones viven en la tabla central `cms_traducciones`, indexada por `(prefix, tableName sin cms_, fieldName, recordNum)`. `fieldValue` se guarda en Base64, pero la codificación/decodificación la hace el PHP: el cliente siempre trabaja con texto plano.
### 1. Listar idiomas activos
**Endpoint**: `/cms/lib/viewer_functions.php?action_ws=getLanguages`
**Método**: POST via `AcaiHttpClient.postViewerAction`
**Usado por**: `list_web_languages`
**Body**: `{}`
**Respuesta**:
```javascript
{
success: true,
languages: [
{ name: string, label: string, prefix: string, urlPrefix: string, isDefault: boolean }
],
defaultLanguage: string
}
```
Notas: `prefix === "www"` es el idioma base (URLs sin prefijo, `urlPrefix === ""`, `isDefault === true`). Otros prefixes (p.ej. `"en"`) sirven bajo `/<urlPrefix>/...`.
### 2. Leer traducciones de registros
**Endpoint**: `/cms/lib/viewer_functions.php?action_ws=getTranslations`
**Método**: POST via `AcaiHttpClient.postViewerAction`
**Usado por**: `get_record_translations`
**Body**:
```javascript
{
tableName: string, // sin prefijo cms_
recordNums: number[], // PKs a leer
fields?: string[], // opcional: solo estos campos
prefix?: string // opcional: solo este idioma
}
```
**Respuesta** (valores ya decodificados de Base64):
```javascript
{
success: true,
tableName: string,
translations: {
"<recordNum>": {
"<prefix>": { "<fieldName>": "<valor>" }
}
}
}
```
### 3. Escribir traducciones de un registro
**Endpoint**: `/cms/lib/viewer_functions.php?action_ws=setTranslations`
**Método**: POST via `AcaiHttpClient.postViewerAction`
**Usado por**: `set_record_translations`
**Body**:
```javascript
{
tableName: string, // sin prefijo cms_
recordNum: number, // PK a traducir
prefix: string, // idioma destino (nunca 'www')
fields: { "<fieldName>": "<valor>" } // '' borra la traducción
}
```
**Respuesta**: `{ success: true, updated: number, deleted: number }`
**Errores**: `{ error: { message: string, code: string } }` — p.ej. si se intenta traducir `enlace` (prohibido: lo mantiene CocoEnlace).
Notas:
- Solo campos traducibles: `textfield`, `textbox`, `wysiwyg`, `codigo`, `multitext` (el multitext se traduce como el JSON serializado completo en una fila).
- Un `fieldValue` vacío (`''`) borra la traducción y el runtime cae al idioma base.
- Vars de módulo: usar `tableName: 'builder_custom'` + el `recordNum`/`fieldName` que da `varsMeta` de `get_module_config_vars`.
- Lectura traducida en línea: las tools `list_table_records`/`get_record` pasan `options.translates = <prefix>` al `cmsApi` get (equivalente al header `X-ACAI-ACCEPT-LANGUAGE` en cms_api v3).
## Patrones Comunes
### getApiClient Calls