PTC

Comment traduire du contenu dynamique dans Rails avec l'API PTC

Découvrez comment utiliser l'API PTC pour traduire du contenu dynamique dans votre application Ruby on Rails (RoR). Cela inclut les articles de blog, les informations sur les produits et tout texte stocké dans votre base de données.

Ci-dessous, nous vous expliquerons le processus de traduction de contenu dynamique dans les applications Rails en deux parties :

  • Tout d'abord, vous découvrirez les trois points de terminaison d'API individuellement : comment envoyer du contenu pour traduction, vérifier son statut et récupérer les traductions terminées.
  • Ensuite, vous verrez comment relier ces points de terminaison dans un flux de travail complet en utilisant des callbacks ou une interrogation périodique.

Avant de commencer

Ce guide suppose que vous avez configuré une application Rails avec un moyen de stocker les traductions (comme Mobility, Globalize ou votre propre solution).

Si vous partez de zéro ou souhaitez voir une implémentation complète, nous avons créé une application Rails de démonstration qui montre l'intégration de PTC de bout en bout. La démonstration utilise :

Configurer PTC et obtenir votre jeton d'API

Pour commencer, vous avez besoin d'un compte PTC et d'un jeton d'API :

  1. Inscrivez-vous à PTC. La création d'un compte prend une minute, et l'essai couvre 20 000 mots dans 2 langues. Ensuite, vous payez pour ce que vous traduisez.
  2. Créez un nouveau projet et sélectionnez Intégration API.
  3. Copiez le jeton d'API que PTC génère à la fin de la configuration du projet. Vous aurez besoin de ce jeton pour authentifier toutes les requêtes. Vous pouvez trouver le même jeton dans votre tableau de bord de projet sous Paramètres → Gérer les jetons API.
Création d'un nouveau projet dans PTC
Création d'un nouveau projet
Choix de l'intégration API dans la configuration de PTC
Choix de l'Intégration API
Jeton d'API sous Paramètres → Gérer les jetons API
Jeton d'API sous Paramètres → Gérer les jetons API

Points de terminaison d'API pour la traduction de contenu dynamique

Envoyer du contenu pour traduction

Pour traduire du contenu, utilisez le point de terminaison Create Content Translation (« traduction »). Cela planifie la traduction de votre contenu et renvoie un identifiant que vous utiliserez pour suivre la progression et récupérer les résultats.

Point de terminaison :

POST https://app.ptc.wpml.org/api/v1/content_translation

Paramètres :

  • data (obligatoire) – Le contenu à traduire sous forme de hash
  • name (obligatoire) – Une étiquette pour cette tâche de traduction (par exemple, "post-123-translation")
  • target_languages (facultatif) – Un tableau de codes de langue (par exemple, ["es", "fr", "de"])
  • callback_url (facultatif) – Une URL où PTC vous informera une fois que les traductions seront prêtes

Voici un exemple de service qui démarre la traduction :

Ruby

require 'net/http'
require 'uri'

module Ptc
  class TranslateService
    def initialize(data:, name:, target_languages:, callback_url: nil)
      @data = data
      @name = name
      @target_languages = target_languages
      @token = ENV.fetch("PTC_API_TOKEN")
      @callback_url = callback_url
    end

    def call
      translate
    end

    def self.call(**attributes)
      new(**attributes).call
    end

    private
    attr_reader :data, :name, :target_languages, :token, :callback_url

    def translate
      response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
        http.request(request)
      end
      JSON.parse(response.body)
    end

    def body
      {
        data:,
        name:,
        target_languages:,
        callback_url:,
      }.to_json
    end

    def request
      return @request if @request.present?

      @request ||= Net::HTTP::Post.new(uri)
      @request.content_type = "application/json"
      @request.body = body
      @request["Authorization"] = "Bearer #{token}"
      @request
    end

    def uri
      @uri ||= URI.parse("https://app.ptc.wpml.org/api/v1/content_translation")
    end
  end
end

Pour obtenir les détails complets de la réponse, les codes d'erreur et des exemples supplémentaires, consultez la documentation de l'API Create Content Translation.

Vérifier le statut de traduction

Pour vérifier si votre traduction est terminée, utilisez le point de terminaison Get Content Translation Status. Cela renvoie le statut actuel et la progression de la traduction.

Point de terminaison :

GET https://app.ptc.wpml.org/api/v1/content_translation/{id}/status

Paramètres :

  • id (obligatoire) – L'identifiant unique de la tâche de traduction de contenu à vérifier

Exemple de service dans Rails :

Ruby

require 'net/http'
require 'uri'

module Ptc
  class GetTranslationStatusService
    def initialize(id:)
      @id = id
      @token = ENV.fetch("PTC_API_TOKEN")
    end

    def call
      get
    end

    def self.call(**attributes)
      new(**attributes).call
    end

    private
    attr_reader :id, :token

    def get
      response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
        http.request(request)
      end
      JSON.parse(response.body)
    end

    def request
      return @request if @request.present?

      @request ||= Net::HTTP::Get.new(uri)
      @request.content_type = "application/json"
      @request["Authorization"] = "Bearer #{token}"
      @request
    end

    def uri
      @uri ||= URI.parse("https://app.ptc.wpml.org/api/v1/content_translation/#{id}/status")
    end
  end
end

La réponse inclut un champ de statut et un pourcentage indiquant la progression de la traduction. Pour obtenir les détails complets de la réponse, consultez la documentation de l'API Get Content Translation.

Récupérer les traductions

Une fois votre traduction terminée, utilisez le point de terminaison Get Content Translations pour récupérer les résultats. Cela renvoie votre contenu d'origine ainsi que les versions traduites pour chaque langue cible.

Point de terminaison :

GET https://app.ptc.wpml.org/api/v1/content_translation/{id}

Paramètres :

  • id (obligatoire) – L'identifiant unique de la tâche de traduction de contenu à récupérer

Exemple dans Rails :

Ruby

require 'net/http'
require 'uri'

module Ptc
  class GetTranslationService
    def initialize(id:)
      @id = id
      @token = ENV.fetch("PTC_API_TOKEN")
    end

    def call
      get
    end

    def self.call(**attributes)
      new(**attributes).call
    end

    private
    attr_reader :id, :token

    def get
      response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
        http.request(request)
      end
        JSON.parse(response.body)
    end

    def request
      return @request if @request.present?

      @request ||= Net::HTTP::Get.new(uri)
      @request.content_type = "application/json"
      @request["Authorization"] = "Bearer #{token}"
      @request
    end

    def uri
      @uri ||= URI.parse("https://app.ptc.wpml.org/api/v1/content_translation/#{id}")
    end
  end
end

Être informé lorsque les traductions sont prêtes

Vous avez appris à envoyer du contenu, à vérifier le statut et à récupérer les traductions. Vous devez maintenant relier ces étapes pour que votre application sache automatiquement quand récupérer les traductions.

Vous pouvez le faire en utilisant des callbacks (recommandé) ou en exécutant une tâche qui effectue une interrogation périodique du statut de traduction.

Utiliser des callbacks (Recommandé)

Lorsque vous envoyez du contenu pour traduction, vous pouvez inclure une URL de callback. PTC appelle cette URL lorsque la traduction est terminée. Votre point de terminaison récupère et stocke ensuite les traductions.

C'est efficace car PTC vous informe immédiatement.

Ruby

module Api
  class CallbacksController < ActionController::API
    before_action :set_post

    def create
      id = callback_params[:id]

      translation_data = Ptc::GetTranslationService.call(id:)
      translation_data.except("source").each do |locale, data|
        @post.set_translation(locale:, title: data["title"], description: data["description"])
      end

      head :ok
    end

    private

    def set_post
      @post = Post.find(params[:post_id])
    end

    def callback_params
      params.permit([:post_id, :id, :status, :translations_url])
    end
  end
end

Interrogation périodique du statut de traduction (Alternative)

Vous ne pouvez pas utiliser de callbacks ? Après avoir envoyé du contenu pour traduction, vous pouvez mettre en file d'attente une tâche en arrière-plan qui vérifie de manière répétée le statut de traduction. La tâche récupère les traductions une fois terminées.

Cette approche n'est pas recommandée car elle gaspille des ressources et ajoute des appels d'API inutiles.

Ruby

class CheckTranslationJob < ApplicationJob

  MAX_ATTEMPTS = 3

  def perform(id:, post_id:, attempt: 0)
    translation = Ptc::GetTranslationStatusService.call(id:)
    if translation["status"] == "completed"
      translation = Ptc::GetTranslationService.call(id:)
      post = Post.find(post_id)
      translation.except("source").each do |locale, data|
        post.set_translation(locale:, title: data["title"], description: data["description"])
      end
    else
      raise "Failed to get translation after #{MAX_ATTEMPTS} attempts" if attempt > MAX_ATTEMPTS

      CheckTranslationJob.set(wait: 1.minute).perform_later(id:, post_id:, attempt: attempt + 1)
    end
  end
end

Commencez à traduire votre application Rails

Vous avez maintenant tout ce dont vous avez besoin pour intégrer l'API de traduction de PTC. Créez un compte et traduisez 20 000 mots dans 2 langues pendant l'essai.

Sur cette page

Avant de commencer

Configurer PTC et obtenir votre jeton d'API

Points de terminaison d'API pour la traduction de contenu dynamique

Envoyer du contenu pour traduction

Vérifier le statut de traduction

Récupérer les traductions

Être informé lorsque les traductions sont prêtes

Utiliser des callbacks (Recommandé)

Interrogation périodique du statut de traduction (Alternative)


Prêt à commencer à utiliser PTC ? Inscrivez-vous pour un essai de 30 jours.