PTC

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

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

A continuación, le guiaremos a través del proceso de traducción de contenido dinámico en aplicaciones de Rails en dos partes:

  • Primero, aprenderá los tres endpoints de la API individualmente: cómo enviar contenido para su traducción, comprobar su estado y recuperar las traducciones completadas.
  • Luego, verá cómo conectar estos endpoints en un flujo de trabajo completo usando callbacks o polling.

Antes de empezar

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

Si va a empezar desde cero o quiere ver una implementación completa, hemos creado una aplicación de Rails de demostración que muestra la integración de PTC de principio a fin. La demostración usa:

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 lleva un minuto y la prueba cubre 20.000 palabras en 2 idiomas. Después, paga por lo que traduce.
  2. Cree un nuevo proyecto y seleccione API integration.
  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 control de su proyecto en Configuración → Gestionar tokens de API.
Crear un nuevo proyecto en PTC
Crear un nuevo proyecto
Elegir API integration en la configuración de PTC
Elegir API Integration
Token de API en Configuración → Gestionar tokens de API
Token de API en Configuración → Gestionar tokens de API

Endpoints de la API para traducir contenido dinámico

Enviar contenido para su traducción

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

Endpoint:

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

Parámetros:

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

Este es un ejemplo de un 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 obtener detalles completos de la respuesta, códigos de error y ejemplos adicionales, consulte la documentación de la API de Create Content Translation.

Comprobar el estado de la traducción

Para comprobar si su traducción se ha completado, use el endpoint Get Content Translation Status. Esto 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 a comprobar

Servicio de ejemplo 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 obtener detalles completos de la respuesta, consulte la documentación de la API de Get Content Translation.

Recuperar las traducciones

Una vez que su traducción se haya completado, use el endpoint Get Content Translations para obtener los resultados. Esto 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 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

Recibir notificaciones 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 hacer esto usando callbacks (recomendado) o ejecutando un trabajo que consulte el estado de la traducción mediante polling.

Uso de callbacks (recomendado)

Cuando envía contenido para su traducción, puede incluir una URL de callback. PTC llama a esta URL cuando se completa la traducción. Luego, 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

Polling del estado de la traducción (alternativa)

¿No puede usar callbacks? Después de enviar el contenido para su traducción, 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 innecesarias a la API.

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

Comience a traducir su aplicación de Rails

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

En esta página

Antes de empezar

Configure PTC y obtenga su token de API

Endpoints de la API para traducir contenido dinámico

Enviar contenido para su traducción

Comprobar el estado de la traducción

Recuperar las traducciones

Recibir notificaciones cuando las traducciones estén listas

Uso de callbacks (recomendado)

Polling del estado de la traducción (alternativa)


¿Listo para empezar a usar PTC? Regístrese para una prueba de 30 días.