Cómo traducir contenido dinámico en Rails con la API de PTC

Aprenda a usar la API de PTC para traducir contenido dinámico en su aplicación Ruby on Rails (RoR). Esto incluye entradas del blog, información de productos y cualquier texto almacenado en su base de datos.

A continuación, le guiaremos por el proceso de traducción de contenido dinámico en aplicaciones Rails en dos partes:

  • Primero, aprenderá los tres endpoints de la API por separado: cómo enviar contenido para traducirlo, comprobar su estado y recuperar las traducciones completadas.
  • Después, verá cómo conectar estos endpoints en un flujo de trabajo completo mediante callbacks o sondeo.

Antes de empezar

Esta guía asume que tiene una aplicación Rails configurada con una forma de almacenar traducciones (como Mobility, Globalize o su propia solución).

Si empieza desde cero o quiere ver una implementación completa, hemos creado una aplicación de demostración en Rails que muestra la integración con PTC de principio a fin. La demo utiliza:

Configure PTC y obtenga su token de API

Para empezar, necesita una cuenta de PTC y un token de API:

  1. Regístrese en PTC. Crear una cuenta es gratis, y puede traducir 20.000 palabras a 2 idiomas sin coste. Después, paga por lo que traduzca.
  2. Cree un nuevo proyecto y seleccione integración de API.
  3. Copie el token de API que PTC genera al final de la configuración del proyecto. Necesitará este token para autenticar todas las solicitudes. Puede encontrar el mismo token en el panel de su proyecto, en Ajustes → Gestionar tokens de API.

Endpoints de la API para traducir contenido dinámico

1

Enviar contenido para traducir

Para traducir contenido, utilice el endpoint Create Content Translation. Esto programa su contenido para su traducción y devuelve un ID que usará para hacer seguimiento del progreso y recuperar los resultados.

Endpoint:

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

Parámetros:

  • data (obligatorio) – El contenido que se va a traducir como un hash
  • name (obligatorio) – Una etiqueta para este trabajo de traducción (por ejemplo, "post-123-translation")
  • target_languages (opcional) – Una matriz de códigos de idioma (por ejemplo, ["es", "fr", "de"])
  • callback_url (opcional) – Una URL donde PTC le notificará cuando las traducciones estén

Aquí tiene un ejemplo de servicio que inicia la traducción:

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

Para ver los detalles completos de la respuesta, los códigos de error y ejemplos adicionales, consulte la documentación de la API Create Content Translation.

2

Comprobar el estado de la traducción

Para comprobar si su traducción está completa, utilice el endpoint Get Content Translation Status. Este devuelve el estado actual y el progreso de la traducción.

Endpoint:

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

Parámetros:

  • id (obligatorio) – El identificador único del trabajo de traducción de contenido que se va a comprobar

Ejemplo de servicio en 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 respuesta incluye un campo de estado y un porcentaje que muestra el progreso de la traducción. Para ver los detalles completos de la respuesta, consulte la documentación de la API Get Content Translation.

3

Recuperar traducciones

Una vez que su traducción esté completa, utilice el endpoint Get Content Translations para obtener los resultados. Este devuelve su contenido original más las versiones traducidas para cada idioma de destino.

Endpoint:

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

Parámetros:

  • id (obligatorio) – El identificador único del trabajo de traducción de contenido que se va a recuperar

Ejemplo en 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

Reciba una notificación cuando las traducciones estén listas

Ha aprendido a enviar contenido, comprobar el estado y recuperar traducciones. Ahora necesita conectar estos pasos para que su aplicación sepa automáticamente cuándo obtener las traducciones.

Puede hacerlo usando callbacks (recomendado) o ejecutando un trabajo que sondee el estado de la traducción.

Uso de callbacks (recomendado)

Cuando envía contenido para traducir, puede incluir una URL de callback. PTC llama a esta URL cuando la traducción se completa. A continuación, su endpoint obtiene y almacena las traducciones.

Esto es eficiente porque PTC le notifica de inmediato.

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

Sondeo del estado de la traducción (alternativa)

¿No puede usar callbacks? Después de enviar contenido para traducir, puede poner en cola un trabajo en segundo plano que compruebe repetidamente el estado de la traducción. El trabajo obtiene las traducciones cuando se completan.

Este enfoque no se recomienda porque desperdicia recursos y añade llamadas a la API innecesarias.

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

Empiece a traducir su aplicación Rails

Ahora ya tiene todo lo que necesita para integrar la API de traducción de PTC. Cree una cuenta gratuita y traduzca 20.000 palabras a 2 idiomas sin coste.

Ir arriba