Zpět na blog
Terminal window showing a Gemfile entry for the PolyLingo gem alongside a short Ruby translate call and its output hash.

Překlad strukturovaného obsahu z Ruby pomocí knihovny PolyLingo

By Robert M

Překlad strukturovaného obsahu z Ruby pomocí knihovny PolyLingo

Ruby knihovna PolyLingo je nyní dostupná na RubyGems. Pokrývá celé rozhraní API PolyLingo: synchronní překlad, dávkové požadavky, asynchronní úlohy s pollingem a všechny pomocné koncové body. Nemá žádné runtime závislosti a vyžaduje Ruby 2.7 nebo novější.

Tento příspěvek provází instalací, nastavením klienta a každou metodou dostupnou v knihovně.


Instalace

Přidejte do svého Gemfile:

gem "polylingo"

Poté spusťte:

bundle install

Nebo nainstalujte přímo:

gem install polylingo

Žádné runtime závislosti. Knihovna používá pouze standardní Ruby knihovnu pro HTTP.


Nastavení klienta

require "polylingo"

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

Jsou dostupná dvě volitelná nastavení:

client = PolyLingo.new(
  api_key:  ENV.fetch("POLYLINGO_API_KEY"),
  base_url: "https://api.usepolylingo.com/v1", # výchozí, přepište pro self-hosted instance
  timeout:  120,                               # sekundy (otevření + čtení), výchozí 120
)

Uchovávejte svůj API klíč v proměnné prostředí. Nikdy jej nezakódujte přímo a nikdy jej necommitujte do verzovacího systému.


Překlad obsahu

Jednotlivý požadavek

Předáte svůj obsah, pole cílových jazykových kódů a volitelný formát:

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

Parametr format přijímá plain, markdown, json nebo html. Pokud je vynechán, API formát automaticky detekuje. Můžete také předat source jako jazykovou nápovědu a model buď "standard" (výchozí) nebo "advanced".

Zachování formátu funguje stejně jako zbytek API PolyLingo. Pro json se překládají pouze řetězcové hodnoty, klíče, vnoření a netextové typy zůstávají nedotčeny. Pro markdown zůstávají nadpisy nadpisy a bloky kódu jsou ponechány beze změny. Pro html jsou značky a atributy zachovány a překládají se pouze textové uzly.

Překlad JSON lokalizačního souboru

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

Jeden požadavek zpracuje všechny tři lokalizace. Klíče jsou ve všech výstupních souborech shodné se zdrojem.


Dávkové požadavky

Pošlete až 100 obsahových položek v jednom požadavku, každou se svým id a volitelným 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

Všechny položky sdílejí stejné pole targets. Vámi předané id je zachováno v odpovědi, takže můžete výsledky mapovat zpět na zdrojová data bez spoléhání se na pořadí.


Asynchronní úlohy

Pro dlouhotrvající překlady přijímá jobs API požadavek, okamžitě vrací job_id a umožňuje vám pollovat výsledek. Knihovna to řeší dvěma způsoby.

Zařazení do fronty a manuální polling

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

Jeden volání, které polluje dokud není hotovo

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

  # Volitelné přepsání (výchozí hodnoty):
  poll_interval: 5,    # sekundy mezi pollováním, výchozí 5
  timeout:       1200, # celkový čas čekání v sekundách, výchozí 1200 (20 minut)
  on_progress:   ->(queue_position) { puts "Queue position: #{queue_position.inspect}" }
)

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

Všechny časové hodnoty v Ruby knihovně jsou v sekundách, v souladu s konvencemi Ruby. Lambda on_progress se spouští při každém pollu a přijímá aktuální pozici ve frontě jako celé číslo, nebo nil, pokud API žádnou nevrátí.


Pomocné koncové body

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 a languages nevyžadují API klíč. usage vrací spotřebu tokenů za aktuální kalendářní měsíc pro autentizovaný účet.


Zpracování chyb

Všechny chyby dědí z PolyLingo::PolyLingoError. Zachyťte konkrétní podtřídy, které chcete zpracovat:

begin
  result = client.translate(
    content: "# Hello",
    targets: %w[es],
    format:  "markdown"
  )
rescue PolyLingo::AuthError => e
  # HTTP 401 — neplatný, chybějící nebo odvolaný API klíč
  puts "Auth failed: #{e.message}"
rescue PolyLingo::RateLimitError => e
  # HTTP 429 — dosažen limit za minutu
  retry_after = e.retry_after # celé sekundy nebo nil
  sleep retry_after if retry_after
  retry
rescue PolyLingo::JobFailedError => e
  # Asynchronní úloha dosáhla chybového stavu nebo vypršel čas pro polling
  puts "Job failed: #{e.job_id}"
rescue PolyLingo::PolyLingoError => e
  # Všechny ostatní chyby API
  puts "#{e.status}: #{e.error} — #{e.message}"
end

RateLimitError#retry_after vrací celé číslo z JSON odpovědi nebo hlavičky Retry-After, podle toho, co je přítomné, nebo nil, pokud není žádné z nich. JobFailedError#job_id vám dává ID neúspěšné úlohy, pokud je známo.


Rychlá reference

MetodaEndpointVyžaduje autentizaci
client.healthGET /healthNe
client.languagesGET /languagesNe
client.translate(...)POST /translateAno
client.batch(...)POST /translate/batchAno
client.usageGET /usageAno
client.jobs.create(...)POST /jobsAno
client.jobs.get(job_id)GET /jobs/:idAno
client.jobs.translate(...)POST /jobs + pollingAno

Začněte

Knihovna je na RubyGems na rubygems.org/gems/polylingo. Zdrojový kód je na github.com/UsePolyLingo/polylingo-ruby. Kompletní dokumentace API je na usepolylingo.com/docs.

Bezplatná úroveň zahrnuje 50 000 tokenů měsíčně. Kreditní karta není potřeba.

gem install polylingo

Získejte svůj API klíč