PTC

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

Aprenda a utilizar la API de PTC para traducir contenido dinámico en su aplicación 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 Rails en dos partes:

  • Primero, conocerá los tres endpoints de la API de forma individual: cómo enviar contenido para su traducción, cómo comprobar su estado y cómo recuperar las traducciones completadas.
  • Después, verá cómo conectar estos endpoints en un flujo de trabajo completo utilizando callbacks o polling.

Antes de comenzar

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

Si está empezando desde cero o desea ver una implementación completa, hemos creado una aplicación Rails de demostración que muestra la integración de 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 gratuito y puede traducir 20.000 palabras a 2 idiomas sin coste alguno. Después, pague por lo que traduzca.
  2. Cree un nuevo proyecto y seleccione API integration.
  3. Copie el token de API que PTC genera al finalizar 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 Settings → Manage API tokens.
Creación de un nuevo proyecto en PTC
Creación de un nuevo proyecto
Elección de la integración por API en la configuración de PTC
Elección de la integración por API
Token de API en Settings → Manage API tokens
Token de API en Settings → Manage API tokens

Endpoints de la API para traducir contenido dinámico

Enviar contenido para su traducción

Para traducir contenido, utilice el endpoint Create Content Translation. Esto programa su contenido para la traducción y devuelve un ID que utilizará para realizar el 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

Aquí tiene un ejemplo de cómo un servicio 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 sobre 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, 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 desea comprobar

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

Recuperar las traducciones

Una vez que su traducción esté lista, utilice el endpoint Get Content Translations para obtener los resultados. Este devuelve su contenido original junto con 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 desea 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

Ya 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 debe obtener las traducciones.

Puede hacerlo mediante callbacks (recomendado) o ejecutando un trabajo que realice polling del estado de la traducción.

Uso de callbacks (recomendado)

Al enviar contenido para su traducción, puede incluir una URL de callback. PTC llama a esta URL cuando finaliza la traducción. Su endpoint entonces recupera y almacena las traducciones.

Este método 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 utilizar callbacks? Tras 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 recupera las traducciones cuando estas se han completado.

Este enfoque no es recomendable porque consume 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

Empiece a traducir su aplicación Rails

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

En esta página

Antes de comenzar

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 gratuita de 30 días.