Translation
TranslationTraduction

Traduction

Directive @strTranslate pour traduire la valeur d'un champ en utilisant l'API de n'importe quel fournisseur.

Description

Ajoutez la directive @strTranslate à n'importe quel champ de type String, pour le traduire dans la langue souhaitée.

Par exemple, cette requĂȘte traduit les champs title et excerpt de l'article de l'anglais vers le français (en utilisant le fournisseur d'API par dĂ©faut) :

{
  posts {
    enTitle: title
    frTitle: title @strTranslate(from: "en", to: "fr")
 
    enExcerpt: excerpt    
    frExcerpt: excerpt @strTranslate(from: "en", to: "fr")
  }
}

...produisant :

{
  "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 directive @strTranslate nécessite le passage de trois arguments :

  • provider : le fournisseur Ă  utiliser pour la traduction
  • from : le code de langue du texte
  • to : le code de langue vers lequel traduire

Nous pouvons dĂ©finir une valeur par dĂ©faut pour ces propriĂ©tĂ©s dans l'onglet "Schema Configuration => Translation" de la page des RĂ©glages. Ces valeurs seront utilisĂ©es chaque fois que l'un de ces arguments n'est pas fourni dans la requĂȘte :

{
  posts {
    title @strTranslate
  }
}

De plus, lors de la définition des valeurs par défaut, l'argument correspondant dans le schéma GraphQL devient non obligatoire.

Par défaut, la valeur from par défaut est la langue utilisée dans WordPress.

Par les Réglages

Saisissez les champs provider/from/to dans le champ de saisie correspondant de la page des Réglages, puis cliquez sur "Save Changes (All)" :

Définition du 'provider' par défaut, et des langues 'from' et 'to'
Définition du 'provider' par défaut, et des langues 'from' et 'to'

Dans wp-config.php

Ajoutez des constantes dans wp-config.php :

  • GATOGRAPHQL_TRANSLATION_DEFAULT_PROVIDER
  • GATOGRAPHQL_TRANSLATION_DEFAULT_FROM_LANG_CODE
  • GATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE

Par exemple :

define( 'GATOGRAPHQL_TRANSLATION_DEFAULT_TO_LANG_CODE', 'fr' );

Par variable d'environnement

Définissez les variables d'environnement :

  • TRANSLATION_DEFAULT_PROVIDER
  • TRANSLATION_DEFAULT_FROM_LANG_CODE
  • TRANSLATION_DEFAULT_TO_LANG_CODE

Traduction multi-langue Sync/Async

La directive @strTranslate enverra une requĂȘte par langue Ă  traduire. Lors de la traduction en plusieurs langues, vous pouvez dĂ©cider d'envoyer les requĂȘtes de façon asynchrone (c'est-Ă -dire en parallĂšle) ou synchrone (c'est-Ă -dire sĂ©quentiellement).

RequĂȘtes Synchrones vs Asynchrones :

  • Synchrone : Chaque requĂȘte de traduction attend que la prĂ©cĂ©dente soit terminĂ©e avant de dĂ©marrer. Plus lent mais plus sĂ»r vis-Ă -vis des limites de dĂ©bit.
  • Asynchrone : Toutes les requĂȘtes de traduction sont envoyĂ©es simultanĂ©ment. Plus rapide mais peut atteindre les limites de dĂ©bit si trop de requĂȘtes sont envoyĂ©es Ă  la fois.
Utilisation du mode sync/async pour traduire plusieurs langues Ă  la fois
Utilisation du mode sync/async pour traduire plusieurs langues Ă  la fois

DĂ©lais d'attente de requĂȘte et de connexion

Traduire un document long via un fournisseur tiers peut ĂȘtre lent, et un upstream bloquĂ© maintiendrait sinon un worker PHP jusqu'Ă  ce que PHP lui-mĂȘme termine la requĂȘte.

Votre serveur web applique une durĂ©e d'exĂ©cution maximale pour chaque requĂȘte PHP via la directive max_execution_time (dĂ©finie dans php.ini, ou via votre panneau de contrĂŽle d'hĂ©bergement — cPanel l'expose gĂ©nĂ©ralement sous "Select PHP Version" → "Options", et les hĂ©bergements gĂ©rĂ©s comme SiteGround / Kinsta Engine la proposent dans leurs rĂ©glages PHP).

Le plugin expose deux options sur la page des Réglages, sous Plugin Configuration > Translation :

  • Request timeout : la durĂ©e maximale (en secondes) pour attendre la rĂ©ponse complĂšte du fournisseur de traduction
  • Connection timeout : la durĂ©e maximale (en secondes) pour attendre lors de l'Ă©tablissement de la connexion avec le fournisseur de traduction
Définition du Request timeout et du Connection timeout pour la traduction
Définition du Request timeout et du Connection timeout pour la traduction

Ces valeurs doivent ĂȘtre maintenues en dessous du max_execution_time de votre serveur pour qu'une traduction bloquĂ©e Ă©choue proprement avec un message d'erreur contrĂŽlĂ© plutĂŽt que de dĂ©clencher le dĂ©lai d'expiration gĂ©nĂ©rique du serveur (HTTP 502 / 504, ou une page vide "Maximum execution time of N seconds exceeded"). Si vos traductions dĂ©passent rĂ©guliĂšrement le dĂ©lai, augmentez ces deux valeurs et le max_execution_time de votre serveur en parallĂšle.

DĂ©bogage des requĂȘtes API

Pour dĂ©boguer les requĂȘtes envoyĂ©es aux fournisseurs de traduction (comme ChatGPT, Claude ou Google Translate) et leurs rĂ©ponses, vous pouvez activer le niveau de sĂ©vĂ©ritĂ© đŸ”” Info dans les RĂ©glages des Logs.

Ce faisant, les logs contiendront toutes les interactions avec les fournisseurs de traduction, stockées sous les entrées api-requests.

RequĂȘtes IA dans les Logs
RequĂȘtes IA dans les Logs

Ce qui est enregistré

Pour les fournisseurs IA, l'entrée api-requests contient des informations détaillées sur :

  • Le prompt envoyĂ© au fournisseur de traduction
  • La rĂ©ponse complĂšte reçue
  • Toute erreur ou problĂšme survenu lors de la communication
  • Le modĂšle utilisĂ©
  • Le nombre de tokens utilisĂ©s
DĂ©tail d'une requĂȘte IA dans les Logs
DĂ©tail d'une requĂȘte IA dans les Logs

Par exemple, le JSON "Additional context" suivant montre les dĂ©tails d'une requĂȘte envoyĂ©e Ă  ChatGPT, et sa rĂ©ponse :

{
  "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"
  }
}