Çeviri
Herhangi bir sağlayıcının API'sini kullanarak bir alan değerini çevirmek için @strTranslate direktifi.
Description
Bir alanı istenen dile çevirmek için String türündeki herhangi bir alana @strTranslate direktifi ekleyin.
Örneğin, bu query gönderi title ve excerpt alanlarını İngilizce'den Fransızca'ya çevirir (varsayılan API sağlayıcısını kullanarak):
{
posts {
enTitle: title
frTitle: title @strTranslate(from: "en", to: "fr")
enExcerpt: excerpt
frExcerpt: excerpt @strTranslate(from: "en", to: "fr")
}
}...şunu üretir:
{
"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 direktifi üç argüman gerektirir:
provider: çeviri için kullanılacak sağlayıcıfrom: metnin dil koduto: çevrilecek dilin dil kodu
Bu özellikler için Ayarlar sayfasındaki "Schema Configuration => Translation" sekmesinde varsayılan bir değer tanımlayabiliriz. Bu değerler, söz konusu argümanlardan herhangi biri query içinde sağlanmadığında kullanılacaktır:
{
posts {
title @strTranslate
}
}Ayrıca varsayılan değerler tanımlandığında, GraphQL şemasındaki karşılık gelen argüman zorunlu olmaktan çıkar.
Varsayılan olarak, from varsayılan değeri WordPress'te kullanılan dildir.
Ayarlar Aracılığıyla
Ayarlar sayfasındaki ilgili girişe provider/from/to alanlarını girin ve "Save Changes (All)" düğmesine tıklayın:

wp-config.php İçinde
wp-config.php dosyasına sabitler ekleyin:
GATOGRAPHQL_TRANSLATION_DEFAULT_PROVIDERGATOGRAPHQL_TRANSLATION_DEFAULT_FROM_LANG_CODEGATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE
Örneğin:
define( 'GATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE', 'fr' );Ortam Değişkeni Aracılığıyla
Ortam değişkenlerini tanımlayın:
TRANSLATION_DEFAULT_PROVIDERTRANSLATION_DEFAULT_FROM_LANG_CODETRANSLATION_DEFAULT_TO_LANG_CODE
Sync/Async çok dilli çeviri
@strTranslate direktifi, çeviri yapmak için her dil başına bir istek gönderir. Birden fazla dile çeviri yaparken isteklerin eş zamansız (yani paralel) mi yoksa sıralı (yani senkron) mu gönderileceğine karar verebilirsiniz.
Senkron ve Asenkron İstekler:
- Senkron: Her çeviri isteği başlamadan önce bir öncekinin tamamlanmasını bekler. Daha yavaş ancak hız sınırları açısından daha güvenli.
- Asenkron: Tüm çeviri istekleri eş zamanlı olarak gönderilir. Daha hızlı ancak aynı anda çok fazla istek gönderilirse hız sınırlarına takılabilir.

İstek ve Bağlantı Zaman Aşımları
Üçüncü taraf bir sağlayıcı aracılığıyla uzun bir belgeyi çevirmek yavaş olabilir ve takılı kalan bir upstream, PHP kendisi isteği sonlandırana kadar bir PHP worker'ı meşgul tutacaktır.
Web sunucunuz, max_execution_time direktifi aracılığıyla her PHP isteği için maksimum çalışma süresi uygular (bunu php.ini içinde veya hosting kontrol paneliniz aracılığıyla ayarlayabilirsiniz — cPanel bunu genellikle "Select PHP Version" → "Options" altında sunar; SiteGround / Kinsta Engine gibi yönetilen hostingler ise PHP ayarları bölümünde gösterir).
Eklenti, Ayarlar sayfasında Plugin Configuration > Translation altında iki seçenek sunar:
- Request timeout: çeviri sağlayıcısından tam yanıtı beklemek için maksimum süre (saniye cinsinden)
- Connection timeout: çeviri sağlayıcısına bağlantı kurulurken beklemek için maksimum süre (saniye cinsinden)

Bu değerler sunucunuzun max_execution_time değerinin altında tutulmalıdır; böylece takılı kalan bir çeviri, genel sunucu zaman aşımını (HTTP 502 / 504 veya boş bir "Maximum execution time of N seconds exceeded" sayfası) tetiklemek yerine kontrollü bir hata mesajıyla temiz şekilde başarısız olur. Çevirileriniz düzenli olarak zaman aşımına uğruyorsa, her iki bu değeri ve sunucunuzun max_execution_time değerini birlikte artırın.
API İsteklerini Hata Ayıklama
Çeviri sağlayıcılarına (ChatGPT, Claude veya Google Translate gibi) gönderilen isteklerin ve yanıtlarının hata ayıklamasını yapmak için Logs ayarlarında 🔵 Info önem düzeyini etkinleştirebilirsiniz.
Bunu yaptığınızda, loglar çeviri sağlayıcılarıyla gerçekleşen tüm etkileşimleri api-requests girişleri altında saklayacaktır.

Neler Kaydedilir
AI sağlayıcılar için api-requests girişi şunlara ilişkin ayrıntılı bilgiler içerir:
- Çeviri sağlayıcısına gönderilen prompt
- Alınan tam yanıt
- İletişim sırasında oluşan hatalar veya sorunlar
- Kullanılan model
- Kullanılan token sayısı

Örneğin, aşağıdaki "Additional context" JSON, ChatGPT'ye gönderilen bir isteğin ve yanıtının ayrıntılarını göstermektedir:
{
"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"
}
}