DeepL es un servicio de traducción por inteligencia artificial preciso y rápido. Implementado en Rails, permite crear aplicaciones multilingües fácilmente. Al final del artículo te dejo un repositorio para que lo pruebes.

Cuenta DeepL


Crear una cuenta gratuita y obtener una API key:
Visita DeepL Pro API para crear una cuenta gratuita y obtener una API key con 500,000 caracteres mensuales. La documentación está disponible aquí.

Primeros Pasos

Crea un archivo .env en la raíz del proyecto o donde manejes tus credenciales y añade tu clave de API de DeepL:

DEEPL_API_KEY=tu_clave_de_api_deepl

Crea un servicio (app/services/deep_l_service.rb):
require 'net/http'
require 'uri'
require 'json'

class DeepLService
  DEEPL_API_KEY = ENV['DEEPL_API_KEY']

  def self.translate(text, target_lang)
    url = URI.parse("https://api-free.deepl.com/v2/translate")
    request = Net::HTTP::Post.new(url)
    request['Authorization'] = "DeepL-Auth-Key #{DEEPL_API_KEY}"
    request['Content-Type'] = 'application/x-www-form-urlencoded'

    params = { text: text, target_lang: target_lang }
    request.set_form_data(params)

    response = Net::HTTP.start(url.hostname, url.port, use_ssl: url.scheme == 'https') do |http|
      http.request(request)
    end

    result = JSON.parse(response.body)
    result['translations'].first['text']
  rescue StandardError => e
    Rails.logger.error("DeepL API Error: #{e.message}")
    nil
  end
end


Ejemplo de uso del servicio DeepLService:
translated_text = DeepLService.translate("Hola mundo", 'EN')
puts translated_text  # Output: "Hello world"

Concern para Traducción Automática
Define un concern (app/models/concerns/deepl_translatable.rb):
module DeeplTranslatable
  extend ActiveSupport::Concern

  included do
    before_save :translate_fields
  end

  class_methods do
    def translatable_fields(*fields)
      @translatable_fields = fields
    end

    def get_translatable_fields
      @translatable_fields
    end
  end

  private

  def translate_fields
    return unless self.class.get_translatable_fields

    self.class.get_translatable_fields.each do |field|
      es_field = field.to_s
      en_field = "en_#{field.to_s.sub('es_', '')}"

      if self[es_field].present? && self[en_field].blank?
        self[en_field] = DeepLService.translate(self[es_field], 'EN')
      elsif self[es_field].blank? && self[en_field].present?
        self[es_field] = DeepLService.translate(self[en_field], 'ES')
      end
    end
  end
end

Ejemplo de Uso en un Modelo
Modelo (app/models/article.rb):

class Article < ApplicationRecord
  include DeeplTranslatable

  translatable_fields :es_title, :es_content
end

Repositorio

Integrar DeepL con Rails permite traducir contenido dinámico automáticamente, como observaciones, comentarios y artículos de blog, mejorando la accesibilidad y experiencia del usuario. Puedes ver un repositorio de ejemplo aquí.