Traducción
Directiva @strTranslate para traducir el valor de un campo usando la API de cualquier proveedor.
Descripción
Añade la directiva @strTranslate a cualquier campo de tipo String, para traducirlo al idioma deseado.
Por ejemplo, esta consulta traduce los campos title y excerpt de la entrada del inglés al francés (usando el proveedor de API por defecto):
{
posts {
enTitle: title
frTitle: title @strTranslate(from: "en", to: "fr")
enExcerpt: excerpt
frExcerpt: excerpt @strTranslate(from: "en", to: "fr")
}
}...produciendo:
{
"data": {
"posts": [
{
"enTitle": "Welcome to a single post full of blocks!",
"frTitle": "Bienvenue dans un poste unique plein de blocs !",
"enExcerpt": "When I look back on my past and think how much time I wasted on nothing, how much time has been lost in futilities, errors, laziness, incapacity to live; how little I appreciated it, how many times I sinned against my heart and soul-then my heart bleeds. Life is a gift, life is happiness, every…",
"frExcerpt": "Quand je repense à mon passé et que je pense au temps que j'ai perdu pour rien, au temps perdu en futilités, en erreurs, en paresse, en incapacité de vivre ; combien je l'ai peu apprécié, combien de fois j'ai péché contre mon cœur et mon âme, alors mon cœur saigne. La vie est un cadeau, la vie est un bonheur, chaque…"
},
{
"enTitle": "Explaining the privacy policy",
"frTitle": "Expliquer la politique de confidentialité",
"enExcerpt": "Our privacy policy is at https://gato-graphql-pro.lndo.site/privacy/, and we are based in Carimano.",
"frExcerpt": "Notre politique de confidentialité se trouve sur https://gato-graphql-pro.lndo.site/privacy/, et nous sommes basés à Carimano."
},
{
"enTitle": "HTTP caching improves performance",
"frTitle": "La mise en cache HTTP améliore les performances",
"enExcerpt": "Categories Block Latest Posts Block Did you know? We are not rich by what we possess but by what we can do without. Patience is the strength of the weak, impatience is the weakness of the strong.",
"frExcerpt": "Catégories Bloquer les derniers messages Bloquer Le saviez-vous ? Nous ne sommes pas riches de ce que nous possédons mais de ce dont nous pouvons nous passer. La patience est la force du faible, l'impatience est la faiblesse du fort."
}
]
}
}Schema Configuration
La directiva @strTranslate requiere pasar tres argumentos:
provider: el proveedor a usar para la traducciónfrom: el código del idioma del textoto: el código del idioma al que traducir
Podemos definir un valor por defecto para estas propiedades en la pestaña "Schema Configuration => Translation" en la página de Ajustes. Estos valores se usarán siempre que cualquiera de esos argumentos no se proporcione en la consulta:
{
posts {
title @strTranslate
}
}Además, al definir valores por defecto, el argumento correspondiente en el esquema GraphQL se convierte en no obligatorio.
Por defecto, el valor from por defecto es el idioma usado en WordPress.
Por Ajustes
Introduce los campos provider/from/to en el input correspondiente en la página de Ajustes, y haz clic en "Save Changes (All)":

En wp-config.php
Añade constantes en wp-config.php:
GATOGRAPHQL_TRANSLATION_DEFAULT_PROVIDERGATOGRAPHQL_TRANSLATION_DEFAULT_FROM_LANG_CODEGATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE
Por ejemplo:
define( 'GATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE', 'fr' );Por variable de entorno
Define las variables de entorno:
TRANSLATION_DEFAULT_PROVIDERTRANSLATION_DEFAULT_FROM_LANG_CODETRANSLATION_DEFAULT_TO_LANG_CODE
Traducción multi-idioma Sync/Async
La directiva @strTranslate enviará una petición por idioma a traducir. Al traducir a múltiples idiomas, puedes decidir si enviar las peticiones de forma asíncrona (es decir, en paralelo) o síncrona (es decir, secuencialmente).
Peticiones Síncronas vs Asíncronas:
- Síncrono: Cada petición de traducción espera a que la anterior se complete antes de empezar. Más lento pero más seguro con los límites de tasa.
- Asíncrono: Todas las peticiones de traducción se envían simultáneamente. Más rápido pero puede alcanzar los límites de tasa si se envían demasiadas peticiones a la vez.

Timeouts de petición y conexión
Traducir un documento largo mediante un proveedor de terceros puede ser lento, y un upstream colgado de otro modo mantendría un worker de PHP hasta que PHP mismo matase la petición.
Tu servidor web aplica un tiempo máximo de ejecución para cada petición PHP mediante la directiva max_execution_time (establecida en php.ini, o mediante el panel de control de tu hosting — cPanel típicamente la expone en "Select PHP Version" → "Options", y los hosts gestionados como SiteGround / Kinsta Engine la muestran en sus ajustes de PHP).
El plugin expone dos opciones en la página de Ajustes, en Plugin Configuration > Translation:
- Request timeout: el tiempo máximo (en segundos) a esperar para la respuesta completa del proveedor de traducción
- Connection timeout: el tiempo máximo (en segundos) a esperar al establecer la conexión con el proveedor de traducción

Estos valores deben mantenerse por debajo del max_execution_time de tu servidor para que una traducción detenida falle limpiamente con un mensaje de error controlado en lugar de disparar el timeout genérico del servidor (HTTP 502 / 504, o una página en blanco "Maximum execution time of N seconds exceeded"). Si tus traducciones regularmente alcanzan el timeout, aumenta ambos estos valores y el max_execution_time de tu servidor en conjunto.
Depurando peticiones de la API
Para depurar las peticiones enviadas a los proveedores de traducción (como ChatGPT, Claude o Google Translate) y sus respuestas, puedes habilitar el nivel de severidad 🔵 Info en los Ajustes de Logs.
Al hacerlo, los logs contendrán todas las interacciones con los proveedores de traducción, almacenadas bajo las entradas api-requests.

Qué se registra
Para los proveedores de IA, la entrada api-requests contiene información detallada sobre:
- El prompt enviado al proveedor de traducción
- La respuesta completa recibida
- Cualquier error o problema durante la comunicación
- El modelo usado
- El número de tokens usados

Por ejemplo, el siguiente JSON "Additional context" muestra los detalles de una petición enviada a ChatGPT, y su respuesta:
{
"request": {
"model": "gpt-4o-mini",
"messages": [
{
"role": "system",
"content": "You are a language translator."
},
{
"role": "user",
"content": "I'm working on internationalizing my application.\n\nI've created a JSON with sentences in English. Please translate the sentences to Spanish from .\n\nIf a sentence contains HTML, do not translate inside the HTML tags. Keep emojis exactly as they are, do not translate them.\n\nThis is the JSON:\n\n[\"Welcome to a single post full of blocks!\",\"Repeating the privacy policy\",\"Explaining the privacy policy\",\"HTTP caching improves performance\",\"Public or Private API mode, for extra security\",\"GraphQL or REST? Why not both?\",\"Customize the schema for each client\",\"Nested mutations are a must have\",\"Working on flat chain syntax next\",\"Released v0.6, check it out\"]"
}
],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "translation_response",
"strict": true,
"schema": {
"type": "object",
"properties": {
"translations": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"translations"
],
"additionalProperties": false
}
}
}
},
"response": {
"id": "chatcmpl-BbjNiuO5Si1vhalfIXYU0hWiCmg12",
"object": "chat.completion",
"created": 1748332282,
"model": "gpt-4o-mini-2024-07-18",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{\"translations\":[\"¡Bienvenido a una publicación única llena de bloques!\",\"Repitiendo la política de privacidad\",\"Explicando la política de privacidad\",\"La caché HTTP mejora el rendimiento\",\"Modo API Público o Privado, para mayor seguridad\",\"¿GraphQL o REST? ¿Por qué no ambos?\",\"Personaliza el esquema para cada cliente\",\"Las mutaciones anidadas son imprescindibles\",\"Próximamente trabajando en la sintaxis de cadena plana\",\"Lanzada la versión v0.6, ¡échale un vistazo!\"]}",
"refusal": null,
"annotations": []
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 184,
"completion_tokens": 112,
"total_tokens": 296,
"prompt_tokens_details": {
"cached_tokens": 0,
"audio_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"service_tier": "default",
"system_fingerprint": "fp_34a54ae93c"
}
}