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:
- Mobility para almacenar traducciones
- dotenv-rails para variables de entorno
- delayed_job_active_record para el procesamiento en segundo plano
Configure PTC y obtenga su token de API
Para empezar, necesita una cuenta de PTC y un token de API:
- 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.
- Cree un nuevo proyecto y seleccione integración de API.
- 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_translationParámetros:
data(obligatorio) – El contenido que se va a traducir como un hashname(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:
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}/statusParámetros:
id(obligatorio) – El identificador único del trabajo de traducción de contenido que se va a comprobar
Ejemplo de servicio en Rails:
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:
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.
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.
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.