Takaisin blogiin
Terminal window showing a Gemfile entry for the PolyLingo gem alongside a short Ruby translate call and its output hash.

Käännä jäsennelty sisältö Rubystä PolyLingo-kirjastolla

By Robert M

Käännä jäsennelty sisältö Rubylla PolyLingo-kirjastolla

PolyLingo Ruby -kirjasto on nyt saatavilla RubyGemsissä. Se kattaa koko PolyLingo API -rajapinnan: synkronisen käännöksen, eräpyynnöt, asynkroniset tehtävät kyselyllä sekä kaikki apupäätepisteet. Kirjastolla ei ole ajonaikaisia riippuvuuksia ja se vaatii Ruby 2.7:n tai uudemman.

Tässä artikkelissa käydään läpi asennus, asiakkaan asetukset ja kaikki kirjaston tarjoamat metodit.


Asennus

Lisää Gemfileesi:

gem "polylingo"

Sitten suorita:

bundle install

Tai asenna suoraan:

gem install polylingo

Ei ajonaikaisia riippuvuuksia. Kirjasto käyttää vain Rubyn standardikirjastoa HTTP:lle.


Asiakkaan asetukset

require "polylingo"

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

Kaksi valinnaista asetusta on saatavilla:

client = PolyLingo.new(
  api_key:  ENV.fetch("POLYLINGO_API_KEY"),
  base_url: "https://api.usepolylingo.com/v1", # oletus, ylikirjoita itseisännöidyissä instansseissa
  timeout:  120,                               # sekunteina (avaus + luku), oletus 120
)

Pidä API-avaimesi ympäristömuuttujassa. Älä koskaan kovakoodaa sitä tai tallenna versionhallintaan.


Sisällön kääntäminen

Yksittäinen pyyntö

Anna sisältösi, kohdekielikoodien taulukko ja valinnainen formaatti:

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-parametri hyväksyy arvot plain, markdown, json tai html. Jos se jätetään pois, API tunnistaa formaatin automaattisesti. Voit myös antaa source-kielen vihjeeksi ja model joko "standard" (oletus) tai "advanced".

Formaatin säilyttäminen toimii samalla tavalla kuin muualla PolyLingo API:ssa. json-formaatissa käännetään vain merkkijonoarvot, avaimet, sisäkkäisyys ja ei-merkkijonotyypit jätetään koskemattomiksi. markdown-formaatissa otsikot pysyvät otsikoina ja koodilohkot säilytetään sellaisenaan. html-formaatissa tagit ja attribuutit säilyvät ja vain tekstisolmut käännetään.

JSON-lokalisointitiedoston kääntäminen

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

Yksi pyyntö käsittelee kaikki kolme lokalisointia. Avaimet ovat identtiset lähteen kanssa kaikissa tulostiedostoissa.


Eräpyynnöt

Lähetä jopa 100 sisältöä yhdellä pyynnöllä, jokaisella oma id ja valinnainen 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

Kaikilla kohteilla on sama targets-taulukko. Antamasi id säilyy vastauksessa, joten voit yhdistää tulokset lähdetietoihisi ilman, että sinun tarvitsee luottaa järjestykseen.


Asynkroniset tehtävät

Pitkään kestävissä käännöksissä jobs API hyväksyy pyynnön, palauttaa heti job_id:n ja antaa sinun kysellä tulosta. Kirjasto hoitaa tämän kahdella tavalla.

Laita jonoon ja kysy manuaalisesti

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

Yksi kutsu, joka kysyy kunnes valmis

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

  # Valinnaiset ylikirjoitukset (oletukset näytetty):
  poll_interval: 5,    # sekuntia kyselyjen välillä, oletus 5
  timeout:       1200, # kokonaisaika sekunteina, oletus 1200 (20 minuuttia)
  on_progress:   ->(queue_position) { puts "Queue position: #{queue_position.inspect}" }
)

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

Kaikki aika-arvot Ruby-kirjastossa ovat sekunteina, Rubyn käytäntöjen mukaisesti. on_progress-lambda kutsutaan jokaisella kyselyllä ja saa parametrina jonon nykyisen sijainnin kokonaislukuna tai nil jos API ei palauta sitä.


Apupäätepisteet

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 ja languages eivät vaadi API-avainta. usage palauttaa tokenien kulutuksen kuluvan kalenterikuukauden ajalta todennetulle tilille.


Virheenkäsittely

Kaikki virheet periytyvät luokasta PolyLingo::PolyLingoError. Käsittele haluamasi aliluokat:

begin
  result = client.translate(
    content: "# Hello",
    targets: %w[es],
    format:  "markdown"
  )
rescue PolyLingo::AuthError => e
  # HTTP 401 — virheellinen, puuttuva tai peruutettu API-avain
  puts "Auth failed: #{e.message}"
rescue PolyLingo::RateLimitError => e
  # HTTP 429 — minuuttikohtainen raja saavutettu
  retry_after = e.retry_after # kokonaisluku sekunteina tai nil
  sleep retry_after if retry_after
  retry
rescue PolyLingo::JobFailedError => e
  # Asynkroninen tehtävä epäonnistui tai kysely aikakatkaistiin
  puts "Job failed: #{e.job_id}"
rescue PolyLingo::PolyLingoError => e
  # Kaikki muut API-virheet
  puts "#{e.status}: #{e.error} — #{e.message}"
end

RateLimitError#retry_after palauttaa kokonaisluvun joko JSON-vastauksen rungosta tai Retry-After-otsikosta, kumpi tahansa on saatavilla, tai nil jos kumpaakaan ei ole. JobFailedError#job_id antaa epäonnistuneen tehtävän tunnuksen, jos se on tiedossa.


Pikaviite

MetodiPäätepisteTarvitseeko autentikoinnin
client.healthGET /healthEi
client.languagesGET /languagesEi
client.translate(...)POST /translateKyllä
client.batch(...)POST /translate/batchKyllä
client.usageGET /usageKyllä
client.jobs.create(...)POST /jobsKyllä
client.jobs.get(job_id)GET /jobs/:idKyllä
client.jobs.translate(...)POST /jobs + kyselyKyllä

Aloita

Kirjasto on RubyGemsissä osoitteessa rubygems.org/gems/polylingo. Lähdekoodi löytyy osoitteesta github.com/UsePolyLingo/polylingo-ruby. Täydellinen API-dokumentaatio on osoitteessa usepolylingo.com/docs.

Ilmainen taso sisältää 50 000 tokenia kuukaudessa. Ei luottokorttia vaadita.

gem install polylingo

Hanki API-avaimesi