Traduzione
Direttiva @strTranslate per tradurre il valore di un campo utilizzando l'API di qualsiasi fornitore.
Description
Aggiungi la direttiva @strTranslate a qualsiasi campo di tipo String, per tradurlo nella lingua desiderata.
Ad esempio, questa query traduce i campi title ed excerpt dell'articolo dall'inglese al francese (utilizzando il fornitore di API predefinito):
{
posts {
enTitle: title
frTitle: title @strTranslate(from: "en", to: "fr")
enExcerpt: excerpt
frExcerpt: excerpt @strTranslate(from: "en", to: "fr")
}
}...producendo:
{
"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 direttiva @strTranslate richiede il passaggio di tre argomenti:
provider: il fornitore da utilizzare per la traduzionefrom: il codice della lingua del testoto: il codice della lingua verso cui tradurre
Possiamo definire un valore predefinito per queste proprietà nella scheda "Schema Configuration => Translation" della pagina delle Impostazioni. Questi valori verranno utilizzati ogni volta che uno di questi argomenti non viene fornito nella query:
{
posts {
title @strTranslate
}
}Inoltre, quando si definiscono i valori predefiniti, l'argomento corrispondente nello schema GraphQL diventa non obbligatorio.
Per impostazione predefinita, il valore from predefinito è la lingua utilizzata in WordPress.
Tramite le Impostazioni
Inserisci i campi provider/from/to nel campo di input corrispondente della pagina delle Impostazioni, quindi fai clic su "Save Changes (All)":

In wp-config.php
Aggiungi delle costanti in wp-config.php:
GATOGRAPHQL_TRANSLATION_DEFAULT_PROVIDERGATOGRAPHQL_TRANSLATION_DEFAULT_FROM_LANG_CODEGATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE
Ad esempio:
define( 'GATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE', 'fr' );Tramite variabile d'ambiente
Definisci le variabili d'ambiente:
TRANSLATION_DEFAULT_PROVIDERTRANSLATION_DEFAULT_FROM_LANG_CODETRANSLATION_DEFAULT_TO_LANG_CODE
Traduzione multilingua Sync/Async
La direttiva @strTranslate invierà una richiesta per ogni lingua da tradurre. Quando si traduce in più lingue, puoi decidere se inviare le richieste in modo asincrono (cioè in parallelo) o sincrono (cioè in sequenza).
Richieste Sincrone vs Asincrone:
- Sincrona: Ogni richiesta di traduzione attende il completamento della precedente prima di iniziare. Più lenta ma più sicura rispetto ai limiti di frequenza.
- Asincrona: Tutte le richieste di traduzione vengono inviate simultaneamente. Più veloce ma può raggiungere i limiti di frequenza se vengono inviate troppe richieste in una volta.

Timeout di richiesta e di connessione
Tradurre un documento lungo tramite un fornitore di terze parti può essere lento, e un upstream bloccato manterrebbe altrimenti occupato un worker PHP finché PHP stesso non termina la richiesta.
Il tuo server web applica una durata massima di esecuzione per ogni richiesta PHP tramite la direttiva max_execution_time (impostata in php.ini, o tramite il pannello di controllo del tuo hosting — cPanel la espone generalmente sotto "Select PHP Version" → "Options", e gli hosting gestiti come SiteGround / Kinsta Engine la propongono nelle loro impostazioni PHP).
Il plugin espone due opzioni nella pagina delle Impostazioni, sotto Plugin Configuration > Translation:
- Request timeout: la durata massima (in secondi) di attesa della risposta completa dal fornitore di traduzione
- Connection timeout: la durata massima (in secondi) di attesa durante lo stabilimento della connessione con il fornitore di traduzione

Questi valori devono essere mantenuti al di sotto del max_execution_time del tuo server affinché una traduzione bloccata fallisca in modo pulito con un messaggio di errore controllato anziché attivare il timeout generico del server (HTTP 502 / 504, o una pagina vuota "Maximum execution time of N seconds exceeded"). Se le tue traduzioni superano regolarmente il limite di tempo, aumenta entrambi questi valori e il max_execution_time del tuo server in parallelo.
Debug delle richieste API
Per eseguire il debug delle richieste inviate ai fornitori di traduzione (come ChatGPT, Claude o Google Translate) e delle loro risposte, puoi attivare il livello di severità 🔵 Info nelle Impostazioni dei Logs.
In questo modo, i logs conterranno tutte le interazioni con i fornitori di traduzione, memorizzate sotto le voci api-requests.

Cosa viene registrato
Per i fornitori IA, la voce api-requests contiene informazioni dettagliate su:
- Il prompt inviato al fornitore di traduzione
- La risposta completa ricevuta
- Eventuali errori o problemi durante la comunicazione
- Il modello utilizzato
- Il numero di token utilizzati

Ad esempio, il seguente JSON "Additional context" mostra i dettagli di una richiesta inviata a ChatGPT, e la sua risposta:
{
"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"
}
}