ब्लॉग पर वापस जाएं
Terminal window showing a Gemfile entry for the PolyLingo gem alongside a short Ruby translate call and its output hash.

Ruby से PolyLingo जेम के साथ संरचित सामग्री का अनुवाद करें

By Robert M

PolyLingo जेम के साथ Ruby से संरचित सामग्री का अनुवाद करें

PolyLingo Ruby जेम अब RubyGems पर उपलब्ध है। यह पूरी PolyLingo API सतह को कवर करता है: समकालिक अनुवाद, बैच अनुरोध, पोलिंग के साथ असिंक्रोनस जॉब्स, और सभी उपयोगिता एंडपॉइंट्स। इसमें कोई रनटाइम निर्भरता नहीं है और यह Ruby 2.7 या बाद के संस्करण की आवश्यकता है।

यह पोस्ट इंस्टॉलेशन, क्लाइंट सेटअप, और जेम में उपलब्ध हर मेथड के बारे में बताता है।


इंस्टॉलेशन

अपने Gemfile में जोड़ें:

gem "polylingo"

फिर चलाएं:

bundle install

या सीधे इंस्टॉल करें:

gem install polylingo

कोई रनटाइम निर्भरता नहीं। जेम HTTP के लिए केवल Ruby की स्टैंडर्ड लाइब्रेरी का उपयोग करता है।


क्लाइंट सेटअप

require "polylingo"

client = PolyLingo.new(api_key: ENV.fetch("POLYLINGO_API_KEY"))

दो वैकल्पिक सेटिंग्स उपलब्ध हैं:

client = PolyLingo.new(
  api_key:  ENV.fetch("POLYLINGO_API_KEY"),
  base_url: "https://api.usepolylingo.com/v1", # डिफ़ॉल्ट, सेल्फ-होस्टेड इंस्टेंस के लिए ओवरराइड करें
  timeout:  120,                               # सेकंड (ओपन + रीड), डिफ़ॉल्ट 120
)

अपनी API कुंजी को पर्यावरण चर में रखें। इसे कभी हार्डकोड न करें और न ही संस्करण नियंत्रण में कमिट करें।


सामग्री का अनुवाद

एकल अनुरोध

अपनी सामग्री, लक्षित भाषा कोडों की एक सूची, और एक वैकल्पिक फॉर्मेट पास करें:

result = client.translate(
  content: "# Hello\n\nThis is **structured** content.",
  targets: %w[es fr de],
  format:  "markdown"
)

puts result["translations"]["es"]
puts result["usage"]["total_tokens"]

format पैरामीटर plain, markdown, json, या html स्वीकार करता है। यदि छोड़ा गया है, तो API फॉर्मेट का स्वचालित पता लगाता है। आप भाषा संकेत के रूप में source और मॉडल के रूप में "standard" (डिफ़ॉल्ट) या "advanced" भी पास कर सकते हैं।

फॉर्मेट संरक्षण PolyLingo API के बाकी हिस्सों की तरह काम करता है। json के लिए, केवल स्ट्रिंग मानों का अनुवाद किया जाता है और कुंजियाँ, नेस्टिंग, और गैर-स्ट्रिंग प्रकार अपरिवर्तित रहते हैं। markdown के लिए, हेडिंग्स हेडिंग्स रहते हैं और कोड ब्लॉक्स को वर्बैटिम छोड़ दिया जाता है। html के लिए, टैग और एट्रिब्यूट्स संरक्षित रहते हैं और केवल टेक्स्ट नोड्स का अनुवाद किया जाता है।

JSON लोकल फाइल का अनुवाद

require "json"

source = JSON.parse(File.read("config/locales/en.yml"))

result = client.translate(
  content: source.to_json,
  format:  "json",
  targets: %w[fr de ja]
)

%w[fr de ja].each do |locale|
  translated = JSON.parse(result["translations"][locale])
  File.write(
    "config/locales/#{locale}.json",
    JSON.pretty_generate(translated)
  )
  puts "Wrote config/locales/#{locale}.json"
end

एक अनुरोध तीनों लोकल्स को संभालता है। प्रत्येक आउटपुट फ़ाइल में कुंजियाँ स्रोत के समान होती हैं।


बैच अनुरोध

एकल अनुरोध में 100 तक सामग्री आइटम भेजें, प्रत्येक के अपने id और वैकल्पिक format के साथ:

result = client.batch(
  items: [
    { id: "hero_title",    content: "Welcome back",   format: "plain" },
    { id: "hero_subtitle", content: "Here is what changed today", format: "plain" },
    { id: "cta",           content: "Get started",    format: "plain" },
  ],
  targets: %w[es fr de]
)

result["results"].each do |row|
  puts "#{row["id"]}: #{row["translations"]["es"]}"
end

सभी आइटम एक ही targets सूची साझा करते हैं। आप जो id पास करते हैं वह प्रतिक्रिया में संरक्षित रहता है ताकि आप परिणामों को अपने स्रोत डेटा से बिना क्रम पर निर्भर हुए मैप कर सकें।


असिंक्रोनस जॉब्स

लंबे समय तक चलने वाले अनुवादों के लिए, जॉब्स API अनुरोध स्वीकार करता है, तुरंत job_id लौटाता है, और आपको परिणाम के लिए पोल करने देता है। जेम इसे दो तरीकों से संभालता है।

मैन्युअल रूप से कतार में डालें और पोल करें

accepted = client.jobs.create(
  content: File.read("content/long-article.md"),
  targets: %w[es fr de ja zh],
  format:  "markdown"
)

job_id = accepted["job_id"]

loop do
  sleep 5
  state = client.jobs.get(job_id)
  break if %w[complete failed].include?(state["status"])
end

if state["status"] == "complete"
  translations = state["translations"]
end

एक कॉल जो पूरा होने तक पोल करता है

done = client.jobs.translate(
  content:       File.read("content/long-article.md"),
  targets:       %w[es fr de],
  format:        "markdown",

  # वैकल्पिक ओवरराइड (डिफ़ॉल्ट दिखाए गए):
  poll_interval: 5,    # पोल के बीच सेकंड, डिफ़ॉल्ट 5
  timeout:       1200, # कुल प्रतीक्षा बजट सेकंड में, डिफ़ॉल्ट 1200 (20 मिनट)
  on_progress:   ->(queue_position) { puts "Queue position: #{queue_position.inspect}" }
)

translations = done["translations"]
usage        = done["usage"]

Ruby जेम में सभी समय मान सेकंड में होते हैं, Ruby कन्वेंशन्स के अनुरूप। on_progress लैम्ब्डा हर पोल पर फायर होता है और वर्तमान कतार स्थिति को पूर्णांक के रूप में प्राप्त करता है, या nil यदि API इसे वापस नहीं करता।


उपयोगिता एंडपॉइंट्स

health    = client.health
# => { "status" => "ok", "timestamp" => "..." }

languages = client.languages
# => { "languages" => [{ "code" => "en", "name" => "English", "rtl" => false }, ...] }

usage     = client.usage
# => { "usage" => { "tokens_used" => 12000, "tokens_remaining" => 38000, ... } }

health और languages के लिए API कुंजी की आवश्यकता नहीं है। usage प्रमाणीकृत खाते के लिए वर्तमान कैलेंडर महीने में टोकन खपत लौटाता है।


त्रुटि हैंडलिंग

सभी त्रुटियाँ PolyLingo::PolyLingoError से विरासत में मिलती हैं। आप उन विशिष्ट उपश्रेणियों को पकड़ें जिन्हें आप संभालना चाहते हैं:

begin
  result = client.translate(
    content: "# Hello",
    targets: %w[es],
    format:  "markdown"
  )
rescue PolyLingo::AuthError => e
  # HTTP 401 — अमान्य, गायब, या रद्द की गई API कुंजी
  puts "Auth failed: #{e.message}"
rescue PolyLingo::RateLimitError => e
  # HTTP 429 — प्रति मिनट सीमा पहुंच गई
  retry_after = e.retry_after # पूर्णांक सेकंड या nil
  sleep retry_after if retry_after
  retry
rescue PolyLingo::JobFailedError => e
  # असिंक्रोनस जॉब ने विफल टर्मिनल स्थिति प्राप्त की, या पोलिंग टाइमआउट हुआ
  puts "Job failed: #{e.job_id}"
rescue PolyLingo::PolyLingoError => e
  # सभी अन्य API त्रुटियाँ
  puts "#{e.status}: #{e.error} — #{e.message}"
end

RateLimitError#retry_after JSON प्रतिक्रिया बॉडी या Retry-After हेडर में से जो भी मौजूद हो, उससे पूर्णांक लौटाता है, या यदि दोनों शामिल नहीं हैं तो nilJobFailedError#job_id आपको विफल जॉब का ID देता है जब यह ज्ञात हो।


त्वरित संदर्भ

मेथडएंडपॉइंटऑथ आवश्यक
client.healthGET /healthनहीं
client.languagesGET /languagesनहीं
client.translate(...)POST /translateहाँ
client.batch(...)POST /translate/batchहाँ
client.usageGET /usageहाँ
client.jobs.create(...)POST /jobsहाँ
client.jobs.get(job_id)GET /jobs/:idहाँ
client.jobs.translate(...)POST /jobs + पोलिंगहाँ

शुरू करें

जेम RubyGems पर rubygems.org/gems/polylingo पर है। स्रोत कोड github.com/UsePolyLingo/polylingo-ruby पर है। पूर्ण API दस्तावेज़ usepolylingo.com/docs पर है।

मुफ्त स्तर में प्रति माह 50,000 टोकन शामिल हैं। कोई क्रेडिट कार्ड आवश्यक नहीं।

gem install polylingo

अपनी API कुंजी प्राप्त करें