Перевод
Директива @strTranslate для перевода значения поля с использованием API любого провайдера.
Описание
Добавьте директиву @strTranslate к любому полю типа String, чтобы перевести его на нужный язык.
Например, этот запрос переводит поля title и excerpt записи с английского на французский (используя провайдера API по умолчанию):
{
posts {
enTitle: title
frTitle: title @strTranslate(from: "en", to: "fr")
enExcerpt: excerpt
frExcerpt: excerpt @strTranslate(from: "en", to: "fr")
}
}...с результатом:
{
"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
Директива @strTranslate требует передачи трёх аргументов:
provider: провайдер, используемый для переводаfrom: языковой код исходного текстаto: языковой код, на который нужно перевести
Можно задать значения по умолчанию для этих свойств на вкладке «Schema Configuration => Translation» на странице настроек. Эти значения будут использоваться, если соответствующий аргумент не указан в запросе:
{
posts {
title @strTranslate
}
}Кроме того, при определении значений по умолчанию соответствующий аргумент в схеме GraphQL становится необязательным.
По умолчанию значение from соответствует языку, установленному в WordPress.
Через настройки
Введите поля provider/from/to в соответствующем поле ввода на странице настроек и нажмите «Save Changes (All)»:

В wp-config.php
Добавьте константы в wp-config.php:
GATOGRAPHQL_TRANSLATION_DEFAULT_PROVIDERGATOGRAPHQL_TRANSLATION_DEFAULT_FROM_LANG_CODEGATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE
Например:
define( 'GATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE', 'fr' );Через переменную окружения
Определите переменные окружения:
TRANSLATION_DEFAULT_PROVIDERTRANSLATION_DEFAULT_FROM_LANG_CODETRANSLATION_DEFAULT_TO_LANG_CODE
Синхронный/асинхронный многоязычный перевод
Директива @strTranslate будет отправлять по одному запросу на каждый язык перевода. При переводе на несколько языков можно выбрать: отправлять запросы асинхронно (то есть параллельно) или синхронно (то есть последовательно).
Синхронные vs асинхронные запросы:
- Синхронный: Каждый запрос на перевод ожидает завершения предыдущего. Медленнее, но безопаснее при наличии ограничений на количество запросов.
- Асинхронный: Все запросы на перевод отправляются одновременно. Быстрее, но может привести к превышению лимитов, если запросов слишком много.

Таймауты запроса и соединения
Перевод длинного документа через сторонний провайдер может занимать много времени, а зависший upstream удерживал бы PHP-воркер до тех пор, пока PHP сам не завершит запрос.
Ваш веб-сервер устанавливает максимальное время выполнения для каждого PHP-запроса через директиву max_execution_time (задаётся в php.ini или через панель управления хостингом — cPanel обычно открывает её в «Select PHP Version» → «Options», а управляемые хостинги вроде SiteGround / Kinsta Engine отображают её в настройках PHP).
Плагин предоставляет две опции на странице настроек в разделе Plugin Configuration > Translation:
- Request timeout: максимальное время (в секундах) ожидания полного ответа от провайдера перевода
- Connection timeout: максимальное время (в секундах) ожидания при установке соединения с провайдером перевода

Эти значения следует держать ниже значения max_execution_time вашего сервера, чтобы зависший перевод завершался корректно с управляемым сообщением об ошибке, а не вызывал стандартный таймаут сервера (HTTP 502 / 504 или пустую страницу «Maximum execution time of N seconds exceeded»). Если переводы регулярно завершаются по таймауту, увеличьте оба этих значения вместе с max_execution_time вашего сервера.
Отладка запросов к API
Для отладки запросов, отправляемых провайдерам перевода (таким как ChatGPT, Claude или Google Translate), и их ответов можно включить уровень серьёзности 🔵 Info в настройках журналов.
После включения журналы будут содержать все взаимодействия с провайдерами перевода, сохранённые под записями api-requests.

Что записывается в журнал
Для провайдеров ИИ запись api-requests содержит подробную информацию:
- Промпт, отправленный провайдеру перевода
- Полный полученный ответ
- Любые ошибки или проблемы в ходе взаимодействия
- Используемая модель
- Количество использованных токенов

Например, следующий JSON «Additional context» показывает детали запроса, отправленного в ChatGPT, и его ответа:
{
"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"
}
}