Dịch thuật
Chỉ thị @strTranslate để dịch giá trị của một trường bằng API của bất kỳ nhà cung cấp nào.
Description
Thêm chỉ thị @strTranslate vào bất kỳ trường nào có kiểu String để dịch trường đó sang ngôn ngữ mong muốn.
Ví dụ, queries này dịch các trường title và excerpt của bài viết từ tiếng Anh sang tiếng Pháp (sử dụng nhà cung cấp API mặc định):
{
posts {
enTitle: title
frTitle: title @strTranslate(from: "en", to: "fr")
enExcerpt: excerpt
frExcerpt: excerpt @strTranslate(from: "en", to: "fr")
}
}...cho kết quả:
{
"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
Chỉ thị @strTranslate yêu cầu truyền vào ba đối số:
provider: nhà cung cấp được sử dụng để dịchfrom: mã ngôn ngữ của văn bản nguồnto: mã ngôn ngữ cần dịch sang
Chúng ta có thể định nghĩa giá trị mặc định cho các thuộc tính này trong tab "Schema Configuration => Translation" trên trang Cài đặt. Các giá trị này sẽ được sử dụng khi không có đối số nào được cung cấp trong queries:
{
posts {
title @strTranslate
}
}Ngoài ra, khi định nghĩa các giá trị mặc định, đối số tương ứng trong schema GraphQL sẽ trở thành không bắt buộc.
Theo mặc định, giá trị from mặc định là ngôn ngữ đang được sử dụng trong WordPress.
Qua Cài đặt
Nhập các trường provider/from/to vào ô nhập liệu tương ứng trên trang Cài đặt, rồi nhấp vào "Save Changes (All)":

Trong wp-config.php
Thêm các hằng số vào wp-config.php:
GATOGRAPHQL_TRANSLATION_DEFAULT_PROVIDERGATOGRAPHQL_TRANSLATION_DEFAULT_FROM_LANG_CODEGATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE
Ví dụ:
define( 'GATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE', 'fr' );Qua biến môi trường
Định nghĩa các biến môi trường:
TRANSLATION_DEFAULT_PROVIDERTRANSLATION_DEFAULT_FROM_LANG_CODETRANSLATION_DEFAULT_TO_LANG_CODE
Dịch đa ngôn ngữ Sync/Async
Chỉ thị @strTranslate sẽ gửi một yêu cầu cho mỗi ngôn ngữ cần dịch. Khi dịch sang nhiều ngôn ngữ, bạn có thể quyết định gửi các yêu cầu theo cách bất đồng bộ (tức là song song) hay đồng bộ (tức là tuần tự).
Yêu cầu Đồng bộ vs Bất đồng bộ:
- Đồng bộ: Mỗi yêu cầu dịch chờ yêu cầu trước hoàn thành trước khi bắt đầu. Chậm hơn nhưng an toàn hơn với giới hạn tần suất.
- Bất đồng bộ: Tất cả các yêu cầu dịch được gửi đồng thời. Nhanh hơn nhưng có thể chạm giới hạn tần suất nếu quá nhiều yêu cầu được gửi cùng một lúc.

Thời gian chờ Yêu cầu và Kết nối
Việc dịch một tài liệu dài qua nhà cung cấp bên thứ ba có thể chậm, và một upstream bị treo sẽ giữ một worker PHP cho đến khi PHP tự hủy yêu cầu đó.
Máy chủ web của bạn áp đặt thời gian chạy tối đa cho mỗi yêu cầu PHP thông qua chỉ thị max_execution_time (được đặt trong php.ini, hoặc qua bảng điều khiển hosting của bạn — cPanel thường hiển thị nó trong "Select PHP Version" → "Options", và các hosting được quản lý như SiteGround / Kinsta Engine hiển thị trong cài đặt PHP của họ).
Plugin cung cấp hai tùy chọn trên trang Cài đặt, trong Plugin Configuration > Translation:
- Request timeout: thời gian tối đa (tính bằng giây) để chờ phản hồi đầy đủ từ nhà cung cấp dịch thuật
- Connection timeout: thời gian tối đa (tính bằng giây) để chờ khi thiết lập kết nối đến nhà cung cấp dịch thuật

Các giá trị này nên được giữ dưới mức max_execution_time của máy chủ để một quá trình dịch bị treo sẽ thất bại một cách có kiểm soát với thông báo lỗi rõ ràng thay vì kích hoạt thời gian chờ chung của máy chủ (HTTP 502 / 504, hoặc trang trắng "Maximum execution time of N seconds exceeded"). Nếu các bản dịch của bạn thường xuyên hết thời gian chờ, hãy tăng cả hai giá trị này và max_execution_time của máy chủ cùng lúc.
Gỡ lỗi Yêu cầu API
Để gỡ lỗi các yêu cầu gửi đến nhà cung cấp dịch thuật (như ChatGPT, Claude hoặc Google Translate) và các phản hồi của họ, bạn có thể bật mức độ nghiêm trọng 🔵 Info trong Cài đặt Logs.
Khi làm như vậy, các logs sẽ chứa tất cả các tương tác với nhà cung cấp dịch thuật, được lưu trữ dưới các mục api-requests.

Những gì được Ghi lại
Đối với các nhà cung cấp AI, mục api-requests chứa thông tin chi tiết về:
- Prompt được gửi đến nhà cung cấp dịch thuật
- Phản hồi đầy đủ nhận được
- Bất kỳ lỗi hoặc sự cố nào trong quá trình giao tiếp
- Mô hình được sử dụng
- Số lượng token được sử dụng

Ví dụ, JSON "Additional context" sau đây hiển thị chi tiết một yêu cầu được gửi đến ChatGPT và phản hồi của nó:
{
"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"
}
}