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

Oversett strukturert innhold fra Ruby med PolyLingo-gem

By Robert M

Oversett strukturert innhold fra Ruby med PolyLingo-gem

PolyLingo Ruby-gemet er nå tilgjengelig på RubyGems. Den dekker hele PolyLingo API-overflaten: synkron oversettelse, batch-forespørsler, asynkrone jobber med polling, og alle hjelpeendepunkter. Den har ingen runtime-avhengigheter og krever Ruby 2.7 eller nyere.

Dette innlegget går gjennom installasjon, klientoppsett, og alle metoder som er tilgjengelige i gemet.


Installasjon

Legg til i Gemfile:

gem "polylingo"

Kjør deretter:

bundle install

Eller installer direkte:

gem install polylingo

Ingen runtime-avhengigheter. Gemet bruker kun Rubys standardbibliotek for HTTP.


Sette opp klienten

require "polylingo"

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

To valgfrie innstillinger er tilgjengelige:

client = PolyLingo.new(
  api_key:  ENV.fetch("POLYLINGO_API_KEY"),
  base_url: "https://api.usepolylingo.com/v1", # standard, overstyr for selvhostede instanser
  timeout:  120,                               # sekunder (åpne + lese), standard 120
)

Hold API-nøkkelen din i en miljøvariabel. Aldri hardkod den og aldri legg den i versjonskontroll.


Oversette innhold

Enkelt forespørsel

Send innholdet ditt, en liste med målspråkkoder, og et valgfritt format:

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"]

Parameteren format godtar plain, markdown, json, eller html. Hvis utelatt, oppdager API-et formatet automatisk. Du kan også sende source som språktips og model som enten "standard" (standard) eller "advanced".

Formatbevaring fungerer på samme måte som resten av PolyLingo API. For json oversettes kun strengverdier, og nøkler, nestinger og ikke-streng-typer forblir urørt. For markdown forblir overskrifter overskrifter og kodeblokker forblir ordrett. For html bevares tagger og attributter, og kun tekstnoder oversettes.

Oversette en JSON locale-fil

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

Én forespørsel håndterer alle tre locale. Nøklene er identiske med kilden i hver utdatafil.


Batch-forespørsler

Send opptil 100 innholdsobjekter i én enkelt forespørsel, hver med sin egen id og valgfritt 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

Alle elementer deler samme targets-array. id-en du sender med beholdes i svaret slik at du kan koble resultater tilbake til kildedata uten å stole på rekkefølge.


Async jobber

For langvarige oversettelser aksepterer job API-et forespørselen, returnerer en job_id umiddelbart, og lar deg poll for resultatet. Gemet håndterer dette på to måter.

Kjø inn i kø og poll manuelt

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

Én kall som poller til ferdig

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

  # Valgfrie overstyringer (standardverdier vist):
  poll_interval: 5,    # sekunder mellom polling, standard 5
  timeout:       1200, # total ventetid i sekunder, standard 1200 (20 minutter)
  on_progress:   ->(queue_position) { puts "Queue position: #{queue_position.inspect}" }
)

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

Alle tidsverdier i Ruby-gemet bruker sekunder, i tråd med Ruby-konvensjoner. on_progress lambdaen kalles ved hver polling og mottar gjeldende køposisjon som et heltall, eller nil hvis API-et ikke returnerer en.


Hjelpeendepunkter

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 og languages krever ingen API-nøkkel. usage returnerer tokenforbruk for inneværende kalendermåned for den autentiserte kontoen.


Feilhåndtering

Alle feil arver fra PolyLingo::PolyLingoError. Fang de spesifikke underklassene du vil håndtere:

begin
  result = client.translate(
    content: "# Hello",
    targets: %w[es],
    format:  "markdown"
  )
rescue PolyLingo::AuthError => e
  # HTTP 401 — ugyldig, manglende eller tilbakekalt API-nøkkel
  puts "Auth failed: #{e.message}"
rescue PolyLingo::RateLimitError => e
  # HTTP 429 — per-minutt grense nådd
  retry_after = e.retry_after # heltall sekunder eller nil
  sleep retry_after if retry_after
  retry
rescue PolyLingo::JobFailedError => e
  # Async jobb nådde en mislykket terminal status, eller polling tidsavbrudd
  puts "Job failed: #{e.job_id}"
rescue PolyLingo::PolyLingoError => e
  # Alle andre API-feil
  puts "#{e.status}: #{e.error} — #{e.message}"
end

RateLimitError#retry_after returnerer et heltall fra enten JSON-responsens kropp eller Retry-After headeren, hvilken som helst som er tilstede, eller nil hvis ingen er inkludert. JobFailedError#job_id gir deg ID-en til den mislykkede jobben når den er kjent.


Rask referanse

MetodeEndepunktAuth kreves
client.healthGET /healthNei
client.languagesGET /languagesNei
client.translate(...)POST /translateJa
client.batch(...)POST /translate/batchJa
client.usageGET /usageJa
client.jobs.create(...)POST /jobsJa
client.jobs.get(job_id)GET /jobs/:idJa
client.jobs.translate(...)POST /jobs + pollingJa

Kom i gang

Gemet er på RubyGems på rubygems.org/gems/polylingo. Kildekode er på github.com/UsePolyLingo/polylingo-ruby. Full API-dokumentasjon er på usepolylingo.com/docs.

Gratisnivået inkluderer 50 000 tokens per måned. Ingen kredittkort kreves.

gem install polylingo

Få din API-nøkkel